让browserify接收命令行参数,在打包时parse yml配置文件

功能需求:前端

  1用browserify把各类js打包成浏览器端的1个bundle.js,含有yml配置文件node

约束:编程

      1 yml配置文件不在当前工程里(如今还不知道放哪里,之后也会变),但愿在打包时,用命令行参数的方式传入一个路径,形如json

--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+命令行参数的运行任务: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命令行,没啥花活。

 

如今基本实现目的了。就这样吧,稍微有点笨。

相关文章
相关标签/搜索