功能需求:
1用browserify把各种js打包成浏览器端的1个bundle.js,含有yml配置文件
约束:
1 yml配置文件不在当前工程里(现在还不知道放哪里,以后也会变),希望在打包时,用命令行参数的方式传入一个路径,形如
--config=D:/dev/kiev1941/overlay.yml
2这个配置文件在client.js开头会require(),所以要打包进bundle.js
开始的破题思路是:
1 如何让browserify cli 接收argv,解析yml文件地址
2 如何在client.js开头require(yml文件名)
第一轮搜索,读资料后发现
1可以变成,用代码的方式运行browserify bundle过程。而不是browserify命令行工具。
也就是说,命令行方式的打包是:
"browserify ./src/client.js -o ./static/bundle.js -t [ babelify --presets[env]]"
这种里面加命令行参数,和读取内容,之类的callback比较困难。
但是,完全可以写一个do_bundle.js文件:
const browserify = require(‘browserify‘); //做cli参数解析,各种预处理工作 ... //打包过程代码,代替browserify命令行 browserify(‘./src/client.js‘) .transform(‘babelify‘,{presets: ["@babel/preset-env"]}) .bundle() .pipe(fs.createWriteStream("./static/bundle.js"));
然后这个js,所以可以直接在package.json里起1个node+命令行参数的运行任务:
"scripts": { "build_browser": "node src/do_bundle.js --config=D:/dev/kiev1941/overlay.yml" }
对于2 读取、解析yml不难,但如果要在client.js 里require(),但是
1如果cli传入的名字不定,client.js怎么知道这个yml名字呢?
2如果yml包含client.js不需要的配置内容,如果bundle.js,前端就有可能get到。这是我们不希望的。该怎么在bundle的“compile”阶段做点什么?
目前没想到更好办法,简单加入1个中间步骤。第二轮大概这样:
do_bundle.js:
1用node +cli argv启动,解析得到yml文件名
2读取yml内容,把client.js用到的字段拿出来,保存到给定名字的json临时文件中。比如就"./define.json"
3 执行browserify的打包过程
client.js:
const config = require("./define.json");
完事。
这样的好处,client.js即打包后browser端bundle.js最简单。根本不知道define.json是怎么弄出来的。
这样,只需要do_bundle里创建个临时文件就行了,虽然有点丑,但是本来打包过程就是在后端,系统编程读写个临时文件,算正常操作,不算难看。
const fs = require("fs"); const browserify = require(‘browserify‘); //读命令行参数 const yaml = require(‘js-yaml‘); //const argv = require(‘yargs‘).argv; const argv = require(‘optimist‘).argv; console.log(‘argv‘, argv); //读yaml配置文件 const config = yaml.safeLoad(fs.readFileSync(argv.config,{encoding: ‘utf8‘, flag: "r" })); console.log(‘yaml config‘, config); //选择部分字段 const prop_name = ‘define‘; //保存到本地,供打包用./src/define.json const f_name = `./src/${prop_name}.json` fs.writeFile(f_name, JSON.stringify(config[prop_name], null, 4), { encoding: "utf8", flag: "w" }, (err)=>{}); browserify(‘./src/client.js‘) .transform(‘babelify‘,{presets: ["@babel/preset-env"]}) .bundle() .pipe(fs.createWriteStream("./static/bundle.js"));
几个细节,yargs不知为什么,在这种模式下不能正确parse出arg,把--字段全都放在_:里了,等于没解析出来。
所以随便换了一个optimist,用法功能都差不多。
读yaml,写json都没啥可说的;
没有用browserify系的 yamlify 和register之类的。这样最简单。基本完全对应browserify命令行,没啥花活。
现在基本实现目的了。就这样吧,稍微有点笨。
原文地址:https://www.cnblogs.com/xuanmanstein/p/9952146.html