本次业务场景:本在跑在钉钉上的一套H5,现在需要需要迁移的政务钉钉上,并且保留钉钉。因为更换了平台,所以关于钉钉的鉴权以及dd的ui以及方法需要对应变动,而具体的业务页面逻辑不需要改变。
方案:
import DDPlugin from './common/plugins/dd/index.js'
Vue.use(DDPlugin)
Vue.DD.getConfig().then(res => {
// getConfig 是封装的方法
// 设置dd需要加的组件初始化 dd.config
// 获取钉钉配置
// 进行授权
// res 返回的 设备信息设置token
new Vue()
).catch(err => alert(JSON.stringify(err)));
所以我们需要更换的只是DDPlugin 中具体的实现保证对外接口统一,就能实现将项目迁移到政务钉钉。
所以最好两个地方的页面是相同的,但是入口出的DDPlugin根据不同环境,动态配置,
1. 首先想到的是能否是用环境变量?因为是嵌入第三方,所以这个方案舍弃;
2. 其次是通过url传参,然后在不能地方嵌入不同的链接,根据参数加载不通的DDPlugin,这个方案是可行,已经测试过了,但是后来舍弃了,原因是,不同的场景肯定会导致不同的需求,如果这种,需要判断的地方会很多,最后会很乱,也会难以阅读;
3. 第三种方案是新增一个入口,然后在入口中进行加载不同的配置,也就是我们现在使用的这种。
实施:
src
文件中加indexV2.html
和indexV2.js
分别作为访问入口和js入口。webpack.dev.conf.js
文件配置页面和入口js。
// 原始的单页面
new HtmlWebpackPlugin({
filename: 'index.html',
template: './src/index.html',
chunks: ['vendor', 'index'],
env: 'dev',
inject: true
}),
// 增加V2页面配置
new HtmlWebpackPlugin({
filename: 'indexV2.html',
template: './src/indexV2.html',
chunks: ['vendor', 'indexV2'],
env: 'dev',
inject: true
}),
webpack.base.conf.js
增加入口js。
entry: {
index: './src/index.js', // 原始
indexV2: './src/indexV2.js' // 新增
},
配置到这里,已经能在dev环境访问两套不一样的页面。
下面来改造indexV2.js
(由index.js复制而来),替换引入的dd插件
···
import DDPlugin from ‘./common/plugins/dd/indexV2.js’
···
dd插件中如何提供一直的api就不细说了,这部分大家都会。
现在我们访问indexV2.html ,加载indexV2.js ,成功的将项目分为环境但是业务合一。
有的同学会问了,就改一行代码,直接用url参数判断一下不是更简单吗,搞这么多,你试试想想,如果这边需要新增一个单独页面,你是不是还要去router里面判断,如果这边要加个新业务,你是不是又要去判断。至于有些人同学还会问,会不会有这些问题,我只想说,你们自己的产品的你们还不清楚吗!!!!!!!!!!!!
所以说,我们通过这种方法,清晰的将两个项目分开,但是又将公共的部分可以统一维护。
new HtmlWebpackPlugin({
filename: process.env.NODE_ENV === 'testing'
? 'index.html'
: config.build.index,
template: './src/index.html',
chunks: ['manifest','vendor', 'index'],
inject: true,
hash: true,
custom: '自定义',
env: 'prod',
chunksSortMode: 'dependency'
}),
new HtmlWebpackPlugin({
filename: 'indexV2.html',
template: './src/indexV2.html',
chunks: ['manifest','vendor', 'indexV2'],
inject: true,
hash: true,
custom: '自定义',
env: 'prod',
chunksSortMode: 'dependency'
}),
ps:已上配置都是我经过简化的,其余参数匹配如果需要请自行根据项目进行增删,如果需要完全独立开,可以将公共js和css都进行分割,而我这里不需要我就没弄