对于 mpx 项目而言,例如要增加 loader 配置、plugin 插件等等,都可以在 vue.config.js 当中完成:
module.exports = {
pluginOptions: {
mpx: {
plugin: {
srcMode: 'wx',
},
loader: {}
}
},
configureWebpack() {},
chainWebpack() {
if (process.env.MPX_CLI_MODE === 'mp') {
// do something
}
if (process.env.MPX_CLI_MODE === 'web' && process.env.NODE_ENV === 'development') {
// do something
}
}
}但是在我们实际的业务开发场景当中,我们可能会将一些公共能力也单独抽成 vue-cli-plugin-mpx 以达到公共能力的复用,这样在其他的项目当中如果要使用这部分的能力即可通过 mpx add vue-cli-plugin-mpx-xxx 安装这个插件就可以启用对应的功能。
如何开发一个 vue-cli-plugin 参见 @vue/cli 官方文档即可。
不过对于 mpx 项目而言,由于要支持不同平台的编译构建,在这些流程当中是有些差异化的处理的。例如普通小程序的编译构建和小程序转web的编译构建是2套差异性很大的配置,为了确保不同平台编译构建正常进行,所以通过环境变量以及约定的方式来将不同平台的配置隔离。
mpx 项目的 vue-cli-plugin 命名的格式为:
vue-cli-plugin-mpx-xxx如果是带有 namespace 的包,加上对应的 namespace 即可:
@namespace/vue-cli-plugin-mpx-xxx在平台差异化的构建配置这个背景下,一个 vue-cli-plugin-mpx 可能只期望在编译小程序的流程当中生效,或者是只在跨 web 平台的流程生效,也可能二者皆有。
一个 vue-cli-plugin-mpx 的 service plugin 当中根据具体使用场景来暴露 platform 平台配置。
// 你的 service plugin 入口文件
module.exports = function(api, options) {
// do something
}
module.exports.platform = 'mp' // 另外两个可选值为 'web'、`all`这个 platform 配置标识用以决定插件的适用平台,mpx-cli-service 会根据这个配置来决定具体在哪个平台编译构建时生效:
-
mp仅在小程序平台生效; -
web仅在小程序跨 web 平台生效; -
all在小程序平台和小程序跨 web 平台都会生效; -
不暴露
platform配置等效于all,会在小程序平台和小程序跨 web 平台都会生效;
如果 vue-cli-plugin-mpx 插件在小程序平台和小程序跨 web 平台都会生效,但是具体的操作配置还有一些差异,可通过 MPX_CLI_MODE 环境变量来进行区分:
// 你的 service plugin 入口文件
module.exports = function(api, options) {
if (process.env.MPX_CLI_MODE === 'mp') {
// 更新小程序配置
}
if (process.env.MPX_CLI_MODE === 'web') {
// 更新web配置
}
if (process.env.MPX_CLI_MODE === 'mp' && process.env.NODE_ENV === 'development') {
// 仅在开发环境下更新小程序配置
}
}