QAP项目升级指南
为什么升级项目?
- 我们的项目是qap-cli早期版本构建的,配置和现在qap-cli v3.1.x构建的项目不同,主要区别是配置文件不一样。
- 升级weex版本后,目前最新客户端不能通过qap debug断点调试,虽然安卓可以通过weex-toolkit工具实现断点调试,但是安装工具过程也可能出现各种问题。
- 等官方兼容,基本是遥遥无期
不能debug的原因
- 直接
qap debug
,会走老的配置文件,无法使用最新的weex-debugger工具 - 使用
weex debug
与qap debug
组合,安卓可以debug,但iOS不行,原因貌似是iOS无法建立调试channel
新版本有哪些好处?
- 安卓、iOS都可以愉快开启debugger模式进行断点调试
- debugger模式:使用PC浏览器的JS引擎,因此可以断点
- inspector模式:使用客户端JS引擎,无法断点
- iOS还可以通过调试工具直接查看后端接口请求(非JSSDK)
- 更加精简的配置,webpack配置不再暴露,qap-cli与fie工具打通
- 一些新功能,如hotreload等
配置文件qap.config.js
通过qap create new-qap
命令会生成一个名为new-qap
的项目,可以看到有qap.config.js文件
module.exports = {
toolkit: 'fie-toolkit-nuke',
toolkitConfig: {
webpack: {
sourcemap: 'inline-cheap-module-source-map', // 调试sourcemap类型,默认为inline-cheap-module-source-map。
uglify: true, // 是否对生产环境的代码进行压缩混淆,默认为true。
hotreload: true, // 是否进行热更新,默认为true'optimize-size': {
nuke: false, // 是否开启对nuke的按需引用,默认为fasle
webpack: false, // 是否按照使用webpack3进行tree shaking,代码需满足export import的es6规范
},
externals: {
nuke: true, // 是否使用内置到客户端的nuke组件,true
rax: true, // 是否使用内置到客户端的rax组件,true'QAP-SDK': true, // 是否使用内置到客户端的QAP-SDK组件,true
},
alias: {
$components: './src/components',
$pages: './src/pages',
$util: './src/util',
$root: './src/',
$data: './data/',
},
},
report: true, // 是否开启构建信息上报,默认为true
devType: 'qap',
open: true, // 启动调试后自动打开调试辅助页面
},
};
新版配置缺点
- 扩展性差,不能在原有基础上扩展webpack插件
- 要么使用新版官方配置文件qap.config.js,要么用老版本webpack.config.js配置
- qap debug命令还不支持--host参数指定IP
我们的QAP项目情况
使用了各种webpack插件,如DefinePlugin定义了很多常量
new webpack.DefinePlugin({
'process.env': {NODE_ENV: JSON.stringify('production')}, '__DEV__': JSON.stringify(JSON.parse('false')), '____WEBPACK_DEBUG': JSON.stringify(JSON.parse(_definedConfig.prod.debug)), '____WEBPACK_QAPVERSION': JSON.stringify(_definedConfig.qapVersion), '____WEBPACK_GUIDE_VERSION': JSON.stringify(_definedConfig.guideVersion), '____WEBPACK_GUIDE_ANDRIODURL': JSON.stringify(_definedConfig.guideQnAndriod), '____WEBPACK_TJ_USERS': JSON.stringify(_definedConfig.tjUser),
}),
- 优化了aipList.js文件
babelConfig.plugins.push([require.resolve('./transAPI/index.js')]);
- 支持QAP代码广告(旺店商品)
gulp adv
是否可以让新版官方配置兼容我们自己的webpack配置?
- 可以。
使用
toolkitConfig.webpack.hack.webpackPath
指定我们自己的webpack配置const path = require('path');
module.exports = {// 当前项目使用的fie套件 toolkit: 'fie-toolkit-nuke', toolkitConfig: { port: 8080, open: true, openTarget: 'demos/index.html', liveload: true, addPath: {}, devType: 'qap', webpack: { hack: { webpackPath: path.resolve(__dirname, 'webpack.config.js'), //使用自定义配置 }, }, keepOld: true, },
};
这样在执行qap debug
等命令的时候,检测到有qap.config.js
配置,则会使用新项目的启动方式,即使用fie-toolkit-nuke
工具启动,同时,配置中存在开发者的webpack hack配置,因此,这样就可以使用我们自己的webpack配置了。
webpack.config.js改造
- 升级qap-cli至最新版
v3.1.5
- 将webpack升级到4.x版
- 去掉
new webpack.optimize.UglifyJsPlugin
相关配置,webpack4不再需要 - 指定webpack mode,
development
或production
,通过指定哪种模式,webpack会自动判断是否需要压缩代码。 - 通过
process.argv[2]
判断qap命令使用哪种mode的配置 - gulpfile.js里的配置大部分都可以不用了
- 过程中如果问题,可能还需要通过安装fie工具升级相关组件,安装fie命令
npm i fie -g
新版配置常用命令
# 启动调试
qap debug
# 打包
qap package
# 打包QAP代码广告
qap package adv
# 生成二维码
qap qrzip
待优化项
- 开发时修改代码后每次构建速度有点慢,只能注释掉一些入口,提高构建速度,暂时没有找到很好的解决办法。
其他说明
- 新版配置会在项目根目录下生成www文件夹,这些属于自动生成的H5降级文件,但我们目前没有做降级处理,因此也派不上用途