将多个js文件合并成一个js文件的同时,不进行压缩
1 | const path = require("path"); |
import 动态导入
根据当前渠道,打包对应的SDK
common.js
:
1 | export const pack_platform = 'hongg'; // 打包渠道名称 |
hongg/hongg.js
:
1 | export class MYWXSDK { |
./script/index.js
1 | import { pack_platform } from './common' |
重点
:要在import路径参数前加/* webpackIgnore: true */
参数,不然会遍历当前路径下的全部
相对路径
: ../src/
, 以dist为当前路径设置的
每次打包前,只要修改
common.js
需要打包的渠道名称
动态导入要使用then:
1 | import().then(module => { |
以上方法存在一个问题:当渠道sdk的js文件(
hongg/hongg.js
)中有引入第三方包时,如:import HgSdk from './HgSdk.min.js';
,则打包时第三方的代码没有被打包进去
根据不同渠道,动态打包方法一
渠道sdk代码
1
2
3export class MYWXSDK {
}每个渠道的class命名要一样,都是
MYWXSDK
(自定义为一样)./src/scripts/index.js
:1
import { JMSDK } from './import';
package.json
1
2
3"scripts": {
"build": "cross-env CHANNEL=hongg webpack",
}打包时,运行
npm run build
命令; 打包不同渠道,就将CHANNEL的值改为对应的渠道名
webpack.config.js
——定义环境变量 CHANNEL1
2
3
4
5
6
7
8
9
10const webpack = require('webpack');
module.exports = {
// 定义环境变量 CHANNEL
plugins: [
new webpack.DefinePlugin({
'process.env.CHANNEL': JSON.stringify(process.env.CHANNEL)
})
],
};使用的时:process.env.CHANNEL即可拿到CHANNEL的值
webpack.config.js
——动态生成import.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21const fs = require('fs');
/**
* 创建渠道importJs文件
* @param {*} importJsPath
* @param {*} processEnv
*/
function createImportJs(importJsPath, processEnv) {
const classPath = `../${processEnv.CHANNEL}/${processEnv.CHANNEL}.js`;
const createImportJsContent = "import { MYWXSDK } from '" + classPath + "'; export function JMSDK(init) {return new MYWXSDK (init);}";
fs.writeFile(importJsPath, createImportJsContent, 'utf8', (err) => {
if (err) {
console.error("import.js文件写入失败, 原因:" + err);
} else {
console.log('import.js文件写入成功');
}
});
}
const importJsPath = './src/scripts/import.js';
createImportJs(importJsPath, process.env)在打包前,webpack入口文件index.js中引入的import.js已写入成功:
1
import { MYWXSDK } from '../hongg/hongg.js'; export function JMSDK(init) {return new MYWXSDK (init);}
打包命令
1
npm run build
优化打包方法1
package.json
1
"build": "cross-env CHANNEL=$npm_config_channel webpack",
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11module.exports = (env, argv) => {
return{
// 定义环境变量 CHANNEL————方法二
plugins: [
new webpack.DefinePlugin({
// 可以在命令行中使用 --channel 参数来指定渠道 npm run build --channel=hongg
'process.env.CHANNEL': JSON.stringify(argv.channel || process.env.CHANNEL)
})
],
}
};打包命令——直接在这里指定渠道名,不需要修改
package.json
里的build命令中的CHANNEL1
npm run build --channel=hongg
优化打包方法2
不需要在package.json中添加命令
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36// 方法二
const webpack = require('webpack');
const fs = require('fs');
/**
* 创建渠道importJs文件
* @param {*} importJsPath
* @param {*} channel 渠道名称
*/
function createImportJs(importJsPath, channel) {
const classPath = `../${channel}/${channel}.js`;
const createImportJsContent = "import { MYWXSDK } from '" + classPath + "'; export function JMSDK(init) {return new MYWXSDK (init);}";
fs.writeFile(importJsPath, createImportJsContent, 'utf8', (err) => {
if (err) {
console.error("import.js文件写入失败, 原因:" + err);
} else {
console.log('import.js文件写入成功');
}
});
}
// webpakc打包配置
module.exports = (env, argv) => {
const importJsPath = './src/scripts/import.js';
createImportJs(importJsPath, env.channel);
return{
// 定义环境变量 CHANNEL————方法二
plugins: [
new webpack.DefinePlugin({
// 可以在命令行中使用 --channel 参数来指定渠道 webpack --env channel=hongg
'process.env.CHANNEL': JSON.stringify(env.channel || process.env.CHANNEL)
})
],
}
};
根据不用渠道,动态打包方法二
./src/scripts/index.js
:1
import { JMSDK } from './import';
script/handleSp.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23const fs = require('fs');
module.exports = {
/**
* 创建渠道importJs文件
* @param {*} importJsPath
* @param {*} processEnvEnviroment
*/
createImportJs: function (importJsPath, processEnvEnviroment) {
const params = processEnvEnviroment.split('-');
const className = params[0];
const classPath = params[1];
const createImportJsContent = "import { " + className + " } from '" + classPath + "'; export function JMSDK(init) {return new " + className + "(init);}";
fs.writeFile(importJsPath, createImportJsContent, 'utf8', (err) => {
if (err) {
console.error("import.js文件写入失败, 原因:" + err);
} else {
console.log('import.js文件写入成功');
}
});
}
};webpack.config.js
1
2
3
4
5// 处理自动渠道打包逻辑,生成import.js文件
const hangleSp = require('./src/scripts/handleSp.js');
const importJsPath = './src/scripts/import.js';
const processEnvEnviroment = process.env.ENVIRONMENT;
hangleSp.createImportJs(importJsPath, processEnvEnviroment);package.json
1
2
3
4
5
6
7
8"scripts": {
"zidou": "cross-env ENVIRONMENT=ZDWXSDK-../zidou/zidou npx webpack --stats-error-details",
"feiqu": "cross-env ENVIRONMENT=FQWXSDK-../feiqu/feiqu npx webpack --stats-error-details",
"slang": "cross-env ENVIRONMENT=SLWXSDK-../slang/slang npx webpack --stats-error-details",
"lewan": "cross-env ENVIRONMENT=LWWXSDK-../lewan/lewan npx webpack --stats-error-details",
"vxiny": "cross-env ENVIRONMENT=XYWXSDK-../vxiny/vxiny npx webpack --stats-error-details",
"zhwan": "cross-env ENVIRONMENT=ZWWXSDK-../zhwan/zhwan npx webpack --stats-error-details",
}每次新增渠道,要新增命令, 每个渠道的sdk名称可不一样
打包命令
1
npm run zidou // npm run 渠道名称