小程序工程化尝试(二)- webpack
代码较多警告
entry
小程序实质是多页应用,用webpack打包需要指定多入口,以默认项目为例:
1 | // webpack.config.js |
这意味着每添加一个Page或Component,甚至是scss都需要修改webpack的入口,这部分的处理方法后文再谈。
output
output唯一需要注意的是,需要指定globalObject
为wx
,小程序里没有window
对象
1 | // webpack.config.js |
JS部分
babel
这个方案放弃小程序开发工具自带的转码方法,使用babel去进行转码
安装所需包
1 | npm i @babel/core @babel/preset-env @babel/plugin-transform-runtime babel-loader --save-dev |
webpack配置loader
1 | // webpack.config.js |
添加runtime用于支持async/await
1 | // .babelrc |
代码压缩
同样放弃小程序开发工具自带压缩
mode
为production
时,webpack会对代码进行压缩。
1 | // webpack.config.js |
Source Map
若不使用开发者工具的转码和压缩功能,Source Map就需要自己提供了
开发者文档关于Source Map的描述
如果使用外部的编译脚本对源文件进行处理,只需将对应生成的 Source Map 文件放置在源文件的相同目录下
开发者工具会读取、解析 Source Map 文件,并进行将其上传
后续可以在小程序后台的运营中心可以利用上传的 Source Map 文件进行错误分析
1 | module.exports = { |
关于devtool
的选择,官方文档有相关解释
这里开发环境选择inline-source-map
,正式打包提交则用source-map
Tips: 这里devtool
不能使用eval
系列,小程序不支持…
SCSS部分
安装所需包
1 | npm i sass-loader node-sass postcss-loader file-loader --save-dev |
依旧是scss
=>css
=>postcss
处理css
=>wxss
的线路
1 | // webpack.config.js |
postcss
和上篇内容一样,插件内容不贴了
1 | // postcss.config.js |
图片
以
.png
为例
主要是小图片转base64,对于上篇提到的wxml的动态引入问题,在这里就可以使用require
解决,比如
1 | // index.wxml |
1 | // index.js |
图片交给url-loader
处理
1 | npm i url-loader --save-dev |
小于limit
转base64,否则交给file-loader
,将图片按原路径复制
1 | // webpack.config.js |
wxml
wxml-loader
: 用来处理wxml上的引用
暂时没想到需要处理的场景,但是还是先加上了..
1 | npm i wxml-loader --save-dev |
1 | // webpack.config.js |
其他不需要处理的文件
1 | npm i copy-webpack-plugin --save-dev |
1 | // webpack.config.js |
其他
公共部分提取
1 | // webpack.config.js |
删除打包文件
1 | npm i clean-webpack-plugin --save-dev |
1 | // webpack.config.js |
alias
1 | // webpack.config.js |
环境变量
1 | // webpack.config.js |
这部分和gulp一样
1 | // webpack.config.js |
这里就用webpack自带插件就行了,使用方法有点不一样,不是作为字符串替换
1 | const baseURL = SERVER_HOST |
再谈entry
上插件,来源
1 | // ./plugins/MinaWebpackPlugin.js |
这个插件分析json文件,把所有js(scriptExtensions)以及需要处理的资源文件(assetExtensions)合并为一个entry
使用方法:
1 | // webpack.config.js |
runtime
在package.json
的scripts
中添加
1 | "dev": "cross-env NODE_ENV=development webpack --watch" |
执行npm run dev
,会在根目录下生成对应的dist文件夹,由于配置了project.config.json
的miniprogramRoot
,在开发者工具下就直接看到对应的结果。
但是查看dist会发现,每个入口对应的js开头都有webpack的runtime,需要将这些重复的runtime分离出来:
1 | // webpack.config.js |
然而此时开发者工具报错了:
因为现在其他模块无法get到runtime…
这里需要另一个插件解决
1 | npm i @tinajs/mina-runtime-webpack-plugin --save-dev |
1 | // webpack.config.js |
再执行npm run dev
会发现每个入口对应的js开头都require了runtime
注意事项
插件顺序
webpack插件执行是按顺序来的,完整版:
1 | plugins: [ |
loader顺序
webpack的loader顺序则是从下到上,需要注意不要写反了,参考scss部分
感谢以下
小程序工程化实践(上篇)
mina-webpack
wxapp-webpack-plugin
以及,当时搞完配置的同时,小程序项目好像咕咕咕了。