功能需求:前端
1用browserify把各类js打包成浏览器端的1个bundle.js,含有yml配置文件node
约束:编程
1 yml配置文件不在当前工程里(如今还不知道放哪里,之后也会变),但愿在打包时,用命令行参数的方式传入一个路径,形如json
--config=D:/dev/kiev1941/overlay.yml
1 如何让browserify cli 接收argv,解析yml文件地址2 如何在client.js开头require(yml文件名)
"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+命令行参数的运行任务:babel
"scripts": { "build_browser": "node src/do_bundle.js --config=D:/dev/kiev1941/overlay.yml" }
对于2 读取、解析yml不难,但若是要在client.js 里require(),可是工具
1若是cli传入的名字不定,client.js怎么知道这个yml名字呢?ui
2若是yml包含client.js不须要的配置内容,若是bundle.js,前端就有可能get到。这是咱们不但愿的。该怎么在bundle的“compile”阶段作点什么?spa
目前没想到更好办法,简单加入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命令行,没啥花活。
如今基本实现目的了。就这样吧,稍微有点笨。