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

功能需求:

  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

时间: 2024-10-22 17:05:21

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

C#_WinForm接收命令行参数

C#_WinForm接收命令行参数 2014-08-03 10:17 534人阅读 评论(0) 收藏 举报 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启动那个黑黑的框...我要实现的效果和它么有关系 网上那些千篇一律,只管Ctrl+C,Ctrl+V,采集来的文章,本人已经深受其害,浪费了不少时间!BS~~ 先看下这篇文章:Winform程序接收命令行参数.一看标题,恩…和我的想法一样,不过一看内容,大为失望.不过呢,这里既然出现了2个API函数,先测试下,收藏着. //

[Perl] 利用Geopt::Long模块接收命令行参数

当perl程序需要处理用户输入的参数时,有两种方式: 第一种方法是:使用@ARGV数组 第二种方法是:调用Getopt::Long模块,该方法方便而强大.本文主要介绍该方法. Getopt::Long 在Perl中的调用实例: #!/usr/bin/perl use Getopt::Long; my ($verbose, $monitor, $debug, $test);my @libs = ();my %flags = (); GetOptions ( 'verbose+' => \$verb

MFC Dialog程序如何接收命令行参数

在MFC程序中,可以用以下几种方法来获取命令行参数. 为方便说明,我们假设执行了命令:C:\test\app.exe -1 -2 方法一 : 使用API ::GetCommandLine()获取应用程序名称及参数列表 在OninitDialog()中添加代码 CString sCmdline = ::GetCommandLine(); AfxMessageBox(sCmdline); 将获取到 "C:\test\app.exe  -1 -2 " 方法二 :  在OnInitDialog

shell脚本接收命令行参数

cd ~ && mkdir $1 && cd $1 && touch $2 && cvc-add --ticket $1 --module mfgpro_cust $2 && cvc-ci --ticket $1 --message 'ci' && cvc-report --promote-avail test $0是第一个参数,$1是第二个,以此类推 sh tmp.sh T-12 test12.p tmp.s

第52课 命令行参数的应用

1.主窗口的状态参数 (1)主窗口的状态参数:如位置.大小 (2)应用程序退出的过程 ①收到关闭事件 ②执行关闭事件处理函数(在这里进行主窗口的状态保存) ③主窗口从屏幕上消失 ④主窗口的析构函数的执行 (3)保存主窗口状态参数的时机 ①一般而言:应用程序收到关闭事件时进行状态参数的保存 ②Qt的解决方案:重写关闭事件处理函数并在其中保存状态参数 2. 命令行参数的应用 (1)每个应用程序都能够接收命令行参数. (2)命令行参数传递到应用程序 ①传统方式:在命令行启动GUI程序时传递参数,如no

python 文件处理 -- 02 文件属性&标准输入输出&命令行参数&文件编码

1文件属性 file.fileno()--文件描述符 file.mode--文件当前打开的权限 file.encoding--文件编码格式(无输出表明为ASCII码) file.closed--文件是否被关闭 >>> f.fileno() 3 >>> f.mode 'r+' >>> f.encoding >>> f.closed False >>> filter(lambda s:s[:2]!='__',dir(f)

Python命令行参数sys.argv[]

学习C语言的时候就没弄明白命令行参数的用法,在学习Pyton 的时候又遇到了命令行参数,在这里稍微学习了一下,稍微明白了一些在这里做个记录方便后面回顾复习. Sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码文件绝对路径,所以所以其余参数从1开始,以下两个例子说明: 1. import sys,os os.system(sys.argv[1]) 这个例子os.system接收命令行参数,运行参数指令,保存为sample1.py,命令行带参数运行sample1.py not

Golang系列文章:打印命令行参数

记得最早在学校机房学习Java时,写一个最简单main方法,当程序运行并在屏幕上打印出hello world时,内心还有些小激动呢,相信很多人都有这种经历吧.今天想借助命令行程序,总结一下Go语言的基础知识点. 首先,来一个Go语言版的hello world: // hello.go package main import "fmt" func main() { fmt.Println("hello world") } 我们可以直接在命令行执行下面的命令来运行该程序

python命令行参数处理

使用sys.argv获得参数,使用getopt和optparse两个内建的模块处理命令行参数: getopt,只能简单处理 命令行参数: optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. sys.argv: """ 将参数转化成字典形式 python testargv1.py -o data.txt -i sql.txt --->sql.txt {'-o':'data.txt','-i':'sql.txt'}