功能需求:

  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命令行,没啥花活。

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

让browserify接收命令行参数,在打包时parse yml配置文件的更多相关文章

  1. C#_WinForm接收命令行参数

    C#_WinForm接收命令行参数 2014-08-03 10:17 534人阅读 评论(0) 收藏 举报 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启动那个黑黑的框...我 ...

  2. 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子

    一:自定义实现InputFormat *数据源来自于内存 *1.InputFormat是用于处理各种数据源的,下面是实现InputFormat,数据源是来自于内存. *1.1 在程序的job.setI ...

  3. (转)C#_WinForm接收命令行参数

    本文转载自:http://blog.csdn.net/lysc_forever/article/details/38356007 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启 ...

  4. Spring Boot程序接收命令行参数

    Spring Boot程序接收命令行参数 输入一行,回车,触发一次.如果想要调用service层,也是可以,能调用service层,就可以做很多事,触发一次就好比调用了一次http接口一样 packa ...

  5. MFC接收命令行参数的三种方法

    方法一: CString sCmdline = ::GetCommandLine(); AfxMessageBox(sCmdline); 将获取到 "C:\test\app.exe -1 - ...

  6. Python命令行参数sys.argv[]

    学习C语言的时候就没弄明白命令行参数的用法,在学习Pyton 的时候又遇到了命令行参数,在这里稍微学习了一下,稍微明白了一些在这里做个记录方便后面回顾复习. Sys.argv[]是用来获取命令行参数的 ...

  7. python命令行参数解析模块argparse和docopt

    http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...

  8. Golang: 打印命令行参数

    记得最早在学校机房学习 Java 时,照着书上的例子,写一个最简单 main 方法,当程序运行并在屏幕上打印出 hello world 时,内心竟有种莫名的激动,相信很多人都有这种经历吧. 不管学什么 ...

  9. Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传 ...

随机推荐

  1. sqlalchemy 小试

    # -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine,ForeignKey,Text,INTEGER ...

  2. 安装虚拟环境virtualenvwrapper和django

    以下操作在windows平台进行 1.安装虚拟环境virtualenvwrapper 首先需要安装python管理工具pip,安装完python3.7之后自带了pip,可通过where pip查看管理 ...

  3. <线程池-定时任务> ScheduledExecutorService之shutdown引发的RejectedExecutionException问题

    一. 问题描述 先来看一下异常信息,启动tomcat时就报错: 2015-3-20 15:22:39 org.apache.catalina.core.StandardContext listener ...

  4. 20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

    20155201 李卓雯 <网络对抗技术>实验一 逆向及Bof基础 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,f ...

  5. python ---12 生成器 推导式

    一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数   2. ...

  6. Delphi XE5 for Android (八)

    delphi xe5 编译的程序在启动时会有短暂的黑屏出现,这个现象产生是因为启动首个activity时会加载一些初始化数据,整个时间大约在2~3秒,如何处理? 网上有些资料,这里主要参考和整理了CS ...

  7. Manjaro kde 18.0安装与基本配置

    目录 更换源镜像.更新系统 安装搜狗输入法 安装软件 系统配置 最后清理垃圾 首先用Rufus制作启动U盘安装,设置好时间和日期等 更换源镜像.更新系统 排列源(只选清华源mirrors.tuna.t ...

  8. git如何将一个分支合并到另一个分支?

    答: git merge --no-edit <another branch>

  9. 终于掌握vim的寄存器和系统剪贴板的使用了- 要安装vim-X11包

    vim的系统剪贴板 vim的 加号寄存器 "+ 是和系统剪贴板 相关联的. 加号寄存器和系统剪贴板之间的内容, 可以互相切换. 要把 加号寄存器中的内容, -> 放到/转移到系统剪贴板 ...

  10. vs2015 + Python3.5 环境搭建

    1. vs2015只支持Python3.5及以前的版本,对应Anaconda3.4.2之前的版本. 2. 卸载掉所有安装过的Python 3. 建议重装VS2015, 因为增量升级Python Too ...