全面掌握Node命令选项
全面掌握Node命令选项
译者按:作为Node.js开发者,有必要全面了解一下节点命令的所有选项,这样在关键时刻才能得心应手。
- 原文:掌握Node.js的CLI和命令行选项
- 译者:Fundebug
为了保证可读性,本文采用意译而非直译。
节点命令有很多选项,可以用于调试代码。这些博客全面介绍了Node命令,可以提高大家的工作效率。
查看Node命令选项
使用人命令可以获取Node命令的所有选项:
$ man节点
用法:node [options] [ -e script | script.js] [arguments]
节点调试script.js [arguments]
选项:
-v,--version 打印 Node.js版本
-e,--eval脚本评估脚本
-p,-- print评估脚本和打印结果
-c, - 检查语法检查脚本而不执行
...
|
有使用信息可知,所有选项都是可选的,且需要放在脚本之前。
index.js如下:
console.log(new Buffer(100))
|
--zero-fill-buffers
选项将所有新创建Buffer初始化为0:
--zero-fill-buffers
Automatically zero-fills all newly allocated Buffer and SlowBuffer instances.
|
使用--zero-fill-buffers
选项的命令如下
$ node --zero-fill-buffers index.js
|
这样的话,输出结果全部为0,而不是随机的序列:
<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >
|
Node命令常用选项
--version
或 -v
执行 node --version
或者 node -v
,可以查看Node版本信息。-v
为--version
的缩写,其他选项也有对应的缩写。
$ node -v
v6.10.0
|
--eval
或 -e
使用--eval
选项,可以直接在终端执行Node.js代码。REPL中定义的模块,例如http
、 fs
等都可以直接使用,不需要require。
$ node -e 'console.log(3 + 2)'
5
|
--print
或 -p
--print
选项与--eval
选项的功能类似,但是--print
选项可以打印表达式的结果。--eval
选项使用console.log
的话可以达到相同的效果。
$ node -p '3 + 2'
5
|
--check
或-c
Node v4.2.0之后才有
使用--check
,则会检查代码的语法(并不会执行代码)。
index.js如下:
console.log(new Buffer(100)
|
可知,代码中缺少了一个)
,如果使用node index.js
执行的话则会出错:
/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js:1
(function (exports, require, module, __filename, __dirname) { console.log(new Buffer(100)
^
SyntaxError: missing ) after argument list
at Object.exports.runInThisContext (vm.js:76:16)
at Module._compile (module.js:542:28)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
|
使用node --check index.js
命令,可以在不执行代码的情况下检查到同样的错误。两者输出结果非常相似,但是使用--check
选项时没有执行代码,因此没有错误栈(stack trace):
/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js:1
(function (exports, require, module, __filename, __dirname) { console.log(new Buffer(100)
^
SyntaxError: missing ) after argument list
at startup (bootstrap_node.js:144:11)
at bootstrap_node.js:509:3
|
--inspect[=host:port]
node v6.3.0之后才有
使用node --inspect
选项可以在指定的地址(host)和端口(port)开启监控器。如果没有指定地址和端口,则默认为127.0.0.1:9229
。Chrome调试工具(Chrome Debugging Protocol)通过该端口绑定Node.js进程。
--inspect-brk[=host:port]
node v7.6.0之后才有
--inspect-brk
选项与--inspect
选项的功能相同,只是它会在代码第一行就暂停。
$ node --inspect-brk index.js
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/86dd44ef-c865-479e-be4d-806d622a4813
|
运行命令之后,使用Chrome浏览器访问输出中提示的URL地址chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/86dd44ef-c865-479e-be4d-806d622a4813就可以调试Node.js代码了。
--zero-fill-buffers
node v6.0.0之后才有
使用--zero-fill-buffers
选项可以使所有新创建的Buffer初始化为0。 这样做可以防止内存中的敏感信息泄露。
注意,仅当需要防止内存敏感信息泄露时才使用该选项,因为它会严重影响代码性能。
另外,下面这些Buffer构造器在node v6.0.0已经弃用了。
Also note, that some Buffer constructors got deprecated in
v6.0.0
:
new Buffer(array)
new Buffer(arrayBuffer[, byteOffset [, length]])
new Buffer(buffer)
new Buffer(size)
new Buffer(string[, encoding])
所以,应该使用
Buffer.alloc(size[, fill[, encoding]])
,Buffer.from(array)
,Buffer.from(buffer)
,Buffer.from(arrayBuffer[, byteOffset[, length]])
和Buffer.from(string[, encoding])
.
关于Node.js的内存安全问题,可以查看博客Exploiting Buffer
--prof-process
使用 --prof-process
选项,Node.js进程将输出V8引擎的性能记录信息(profiler)
首先,使用--prof
选项执行代码:
node --prof index.js
|
运行之后,工作目录中将生成一个新文件,前缀为isolate-
。
然后,使用--prof-process
选项执行代码:
node --prof-process isolate-0x102001600-v8.log > output.txt
|
output.txt文件中有V8引擎的性能记录信息,比如: C++代码花了多少时间,JavaScript代码花了多少时间,那个函数调用花了最多时间。如下:
[C++]:
ticks total nonlib name
16 18.4% 18.4% node::ContextifyScript::New(v8::FunctionCallbackInfo<v8::Value> const&)
4 4.6% 4.6% ___mkdir_extended
2 2.3% 2.3% void v8::internal::String::WriteToFlat<unsigned short>(v8::internal::String*, unsigned short*, int, int)
2 2.3% 2.3% void v8::internal::ScavengingVisitor<(v8::internal::MarksHandling)1, (v8::internal::LoggingAndProfiling)0>::ObjectEvacuationStrategy<(v8::internal::ScavengingVisitor<(v8::internal::MarksHandling)1, (v8::internal::LoggingAndProfiling)0>::ObjectContents)1>::VisitSpecialized<24>(v8::internal::Map*, v8::internal::HeapObject**, v8::internal::HeapObject*)
[Summary]:
ticks total nonlib name
1 1.1% 1.1% JavaScript
70 80.5% 80.5% C++
5 5.7% 5.7% GC
0 0.0% Shared libraries
16 18.4% Unaccounted
|
访问官方文档,可以查看Node命令的所有选项。
V8引擎选项
使用--v8-options
选项可以打印所有的V8引擎选项。
目前,V8引擎提供了上百个选项,这篇博客只是介绍了其中几个。这些选项可以大大地改变V8引擎的行为,因此需要慎重使用。
--harmony
使用--harmony
选项,则在代码中可以使用所有harmony特性(即正在开发的特性,例如在低版本的Node中使用ES6特性)。
--max_old_space_size
使用--max_old_space_size
选项,可以调整老生代内存空间(old space,用于储存存活时间较长或常驻内存的对象)的最大值,这个将直接影响Node.js进程可以使用的内存大小。在内存较小的情况下,这个选项将非常方便,因为我们可以限制Node.js进程对内存的使用。
--optimize_for_size
使用--optimize_for_size
选项,V8引擎会优化内存空间的使用,这样很可能会降低应用的执行速度。同样,在内存较小的情况下,这个选项将非常方便。
环境变量
NODE_DEBUG=module[,…]
设置NODE_DEBUG环境变量可以打印Node.js核心模块的调试信息。例如,下面的命令可以查看module模块的调试信息(你也可以查看其它模块,例如http, fs等):
$ NODE_DEBUG=module node index.js
|
输出如下(可知,module模块负责加载代码调用的各个模块):
MODULE 7595:在[“/Users/gergelyke/.node_modules","/Users/gergelyke/.node_libraries",Users”中查找“/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js” /gergelyke/.nvm/versions/node/v6.10.0/lib/node“]
MODULE 7595:为模块“”加载“/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js”。
|
NODE_PATH=path
使用NODE_PATH,可以指定Node.js进程搜索模块的额外目录。
OPENSSL_CONF=file
使用OPENSSL_CONF,可以指定OpenSSL的配置文件。
访问官方文档,可以查看节点命令的所有选项。
关于Fundebug:
Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!
版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/26/node-command-option/
全面掌握Node命令选项的更多相关文章
- node基础知识-常用node命令
node中js的组成部分:ECMAScript核心+全局成员+模块系统成员 浏览器中的js组成部分:ECMAScripts核心+BOM+DOM 常用node命令 cmd中进入REPL环境:直接输入no ...
- node命令行开发
node命令行开发比较出名的就是commander和yargs,以及inquirer,但是很少有文章将三个模块进行对比. 这里简单的描述一下: 1. commander直观,易上手,但是功能较弱,没有 ...
- 9个 SSH常用命令选项
9个 SSH常用命令选项 SSH 是什么 SSH(全称 Secure Shell)是一种加密的网络协议.使用该协议的数据将被加密,如果在传输中间数据泄漏,也可以确保没有人能读取出有用信息.要使用 SS ...
- node命令行工具—cf-cli
音乐分享: 钢心 - <龙王> 初喜<冠军>后喜<龙王> (PS:听一次钢心乐队的演出后采访才知道 “龙王”隐喻的是一起喝酒的老铁....) ——————————— ...
- 如何用node命令和webpack命令传递参数 转载
1. 比如在项目中我们的publicPath需要根据服务器环境的变化而变化,这时我们会写一个配置文件,在webpack.config.js中读取,可以 如何才能 取到变量呢? 这里介绍一种方法: 如果 ...
- 十分钟用 Node 命令行工具打造 react-cli 脚手架
如果你有以下想法: 每次新开项目需要copy一堆文件/文件夹,太烦!想要快速建立工程 用了vue-cli.react-app,羡慕!想要自己做一个 你只需花十分钟时间,做一个Node命令行工具,打造属 ...
- alias 新的命令='原命令 -选项/参数'。举例说明,alias l=‘ls -lsh' 将重新定义 ls 命令,现在只需输入 l 就可以列目录了。
alias 新的命令='原命令 -选项/参数'.举例说明,alias l=‘ls -lsh' 将重新定义 ls 命令,现在只需输入 l 就可以列目录了.
- 如何用node命令和webpack命令传递参数
1. 比如在项目中我们的publicPath需要根据服务器环境的变化而变化,这时我们会写一个配置文件,在webpack.config.js中读取,可以 如何才能 取到变量呢? 这里介绍一种方法: 如果 ...
- 【Nodejs】326- 从零开发一个node命令行工具
本文由 IMWeb 社区授权转载自腾讯内部 KM 论坛.点击阅读原文查看 IMWeb 社区更多精彩文章. 什么是命令行工具? 命令行工具(Cmmand Line Interface)简称cli,顾名思 ...
随机推荐
- Vipe框架构思记
准备着手写一个JAVA框架,基于公司目前的框架提取出来.当然公司现在的框架也是我搭建的.在这整理一下思路. 框架名称:Vipe AOP,IOC容器:Spring MVC:Spring MVC ORM: ...
- 背水一战 Windows 10 (112) - 通知(Badge): application 的 badge 通知, secondary 的 badge 通知, 轮询服务端以更新 badge 通知
[源码下载] 背水一战 Windows 10 (112) - 通知(Badge): application 的 badge 通知, secondary 的 badge 通知, 轮询服务端以更新 bad ...
- 前端开发掌握nginx常用功能之rewrite
上一篇博文对nginx最常用功能的server及location的匹配规则进行了讲解,这也是nginx实现控制访问和反向代理的基础.掌握请求的匹配规则算是对nginx有了入门,但是这些往往还是不能满足 ...
- outline和outline-offset属性实现简单的缝边效果
如果现在有个需求,让你实现下面的样式,你会怎么做呢? 我首先想到的是用 border + box-shadow 实现,代码如下 div { margin: 50px auto; width: 200p ...
- Linux服务器开机自动启动服务或脚本的方法
由于种种原因我们需要重启服务器或断电重启,服务都得手动一个一个启动太过麻烦,所以专门了解开机自启脚本的设置方法. 方式一: 直接在脚本/etc/rc.d/rc.local(和/etc/rc.local ...
- 【app】adb连接问题整理
如果使用adb devices进行检测,发现没有任何设备信息,我们就需要检查是否有手机/模拟器连接上 如果是手机进行连接,windows右下角有出来如下提示的话,需要检查你的手机驱动是否有安装好 如果 ...
- Ubantu linux中使用PyCharm之---破解PyCharm,实现永久免费试用
打开 http://idea.lanyus.com/ 这个网址,可以直接复制到浏览器打开 获取注册码 K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibG ...
- new 操作符 做了什么
new 操作符 做了什么 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例. 假设Test是一个构造函数,通常在创建对象的实例时,要使用new,eg:test = new ...
- 多线程 start 和 run 方法到底有什么区别?
昨天栈长介绍了<Java多线程可以分组,还能这样玩!>线程分组的妙用.今天,栈长会详细介绍 Java 中的多线程 start() 和 run() 两个方法,Java 老司机请跳过,新手或者 ...
- [原创]K8 Jboss jmx-console getshell exploit
[原创]K8 Jboss jmx-console getshell exploit https://www.cnblogs.com/k8gege/p/10645858.html 0x00 前言 今天内 ...