让browserify接收命令行参数,在打包时parseyml配置文件(代码片段)

xuanmanstein xuanmanstein     2023-01-18     257

关键词:

功能需求:

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

 

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

如何接收最奇怪的命令行参数?

】如何接收最奇怪的命令行参数?【英文标题】:Howtoreceiveeventhestrangestcommandlineparameters?【发布时间】:2011-05-1103:53:39【问题描述】:正如在另一个线程Howtoavoidcmd.exeinterpretingshellspecialcharacterslike<>^中讨论的那样从命令行获取... 查看详情

main() 如何接收命令行参数?

】main()如何接收命令行参数?【英文标题】:Howdoesmain()receivecommandlinearguments?【发布时间】:2022-01-1007:32:13【问题描述】:使用标准C++条目:intmain(intargc,char*argv[])//stuffargv是如何填充的?编译器不知道为数组分配什么大小,我假... 查看详情

怎样才能让python脚本像shell命令一样直接运行并可以接收参数

参考技术A调用带参数的脚本,需要首先设置,举例如下:test.py按行解释如下:脚本中有汉字的话,需要声明文件编码格式;导入sys模块,这个模块是用来获取参数列表的;sys.argv是一个列表,第一个是文件名,之后依次是参数... 查看详情

java中用命令行参数接收输入如何判断接收的数据是啥数据类型

一、在命令行或控制台中接收的数据,都是字符串型,需要强制转换。强制转换时,需做空判断,如if(str!=null&&!str.trim().equals(""))inti=Integer.parseInt(str);二、其他情况判断数据类型时,可以用java的反射机制。举个例子:import... 查看详情

模块——getopt::long接收客户命令行参数和smart::comments输出获得的命令行参数内容

 转载:http://www.php-oa.com/2009/04/04/perl_getopt-long.html   我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的模块Getopt::Long,比直接使用@ARGV的数组强大多了.我想大家知道在Linux中有的参数有二种... 查看详情

在 Windows 命令行中使用批处理文件中的参数

】在Windows命令行中使用批处理文件中的参数【英文标题】:UsingparametersinbatchfilesatWindowscommandline【发布时间】:2012-12-2612:35:39【问题描述】:在Windows中,如何访问批处理文件运行时传递的参数?例如,假设我有一个名为hello.bat... 查看详情

python接收命令行参数的3种方法(代码片段)

文章目录基础知识命令行参数简单比较3种方法argparse库的使用编写实例参考基础知识命令行参数命令行参数模式:在命令行参数中分为“-”和“–”两种模式。对于短格式,"-"号后面要紧跟一个选项字母,如果... 查看详情

实验:从命令行接收多个数字并求和

实验题目:编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。设计思想:  首先我们已经知道String[]args是main函数的形式参数,可以用来获取命令行用户输入的参数。他是一个字符串数组,值的类型为字符串... 查看详情

在浏览器端用es6,babel+browserify打包(代码片段)

写得最清楚的是这个系列:一个普通的写网页的人如何过渡到ES6(一)感觉比babel官网写得还清楚点。看完这个才有点理解node原来不只是用来起express后端webserver,更主要用途是作为开发时,用npm作为js语言的包管理器,然后打包,... 查看详情

为啥命令行参数在访问时会产生分段错误?

】为啥命令行参数在访问时会产生分段错误?【英文标题】:Whydocommandlineargumentsgeneratesegmentationfaultwhenaccessed?为什么命令行参数在访问时会产生分段错误?【发布时间】:2021-03-0615:09:29【问题描述】:我在尝试逐字符读取命令行... 查看详情

php命令行脚本接收传入参数的三种方式(代码片段)

通常PHP都做http方式请求了,可以使用GETorPOST方式接收参数,有些时候需要在shell命令下把PHP当作脚本执行,比如定时任务。这就涉及到在shell命令下如何给php传参的问题,通常有三种方式传参。一、使用$argvor$argc参数接收<?php/*... 查看详情

getopts 在没有命令时打印帮助。行参数匹配

】getopts在没有命令时打印帮助。行参数匹配【英文标题】:getoptsprintinghelpwhennocmd.lineargumentwasmatched【发布时间】:2012-04-0523:09:28【问题描述】:我正在尝试在bash中使用getopts来解析命令行参数,但如果没有匹配的参数(或没有给... 查看详情

python命令行传递参数的两种方式(代码片段)

...行程序,python默认提供了sys模块的系统参数属性实现接收命令行中的外部参数。另一种则是通过argparse模块实现的,argparse模块可以实现事先对命令行参数的初始化,更加的便于命令行参数的管理。喜欢记得收藏、点... 查看详情

idea如何在构建java程序时添加命令行参数

IDEA如何在构建java程序时添加命令行参数0.在构建这里找到配置1.在红框下面输入对应的参数然后应用。2.再次重新运行项目即可。 查看详情

idea如何在构建java程序时添加命令行参数

IDEA如何在构建java程序时添加命令行参数0.在构建这里找到配置1.在红框下面输入对应的参数然后应用。2.再次重新运行项目即可。 查看详情

带有参数的 xcode 命令行测试在启动时传递

】带有参数的xcode命令行测试在启动时传递【英文标题】:xcodecommandlinetestwithargumentpassedatlaunch【发布时间】:2015-07-1414:53:02【问题描述】:我在CI实施xcodebuild命令测试时遇到了小问题。我有与特定设备语言相关的测试,在xcode中... 查看详情

在解析命令行参数时尝试使用帮助和详细信息

】在解析命令行参数时尝试使用帮助和详细信息【英文标题】:TryingusingHelpandVerbosewhileparsingcommandlinearguments【发布时间】:2019-02-1313:35:43【问题描述】:importargparseparser=argparse.ArgumentParser(description=\'Demo\')parser.add_argument(\'--verbose\'... 查看详情

2020-06-30passwd命令锁定用户和接收命令行标准输入设置密码

参考技术A普通用户只能使用passwd命令修改自身的系统密码,而root管理员则有权限修改其他所有人的密码。更酷的是,root管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便。既然root管理员可以修改... 查看详情