这次给大家带来如何正确使用node.js 命令行工具,如何使用node.js 命令行工具的注意事项有哪些,下面就是实战案例,一起来看一下。
一. 先了解一下package.json
每个项目的根目录都有一个 package.json
文件,定义了这个项目所需要的各种模块,以及项目的配置信息,下面是一个比较完整的package.json文件
{ "name": "vue-cli", "version": "2.9.3", "description": "A simple CLI for scaffolding Vue.js projects.", "preferGlobal": true, "bin": { "vue": "bin/vue", "vue-init": "bin/vue-init", "vue-list": "bin/vue-list" }, "repository": { "type": "", "url": "" }, "keywords": [ ], "author": "litongqian", "license": "MIT", "bugs": { "url": "" }, "homepage": "", "scripts": { "test": "npm run lint && npm run e2e", "start": "node index.js" }, "dependencies": { "async": "^2.4.0", "chalk": "^2.1.0", }, "devDependencies": { "chai": "^4.1.2", "eslint": "^3.19.0", }, "engines": { "node": ">=6.0.0" } }
1. 其中scripts字段
指定了运行脚本命令的npm命令行缩写,比如start指定了运行 npm run start
时,所要执行的命令。
2. bin字段
bin项用来指定各个内部命令对应的可执行文件的位置
"bin": { "vue": "bin/vue", "vue-init": "bin/vue-init", "vue-list": "bin/vue-list" },
上面代码指定, vue 命令对应的可执行文件为 bin 子目录下的 vue 。
3. npm link
开发NPM模块的时候,有时我们会希望,边开发边试用,比如本地调试的时候, <a href="http://www.php.cn/wiki/136.html" target="_blank">require</a>('myModule')
会自动加载本机开发中的模块。Node规定,使用一个模块时,需要将其安装到全局的或项目的 node_modules
目录之中。对于开发中的模块,解决方法就是在全局的 node_modules
目录之中,生成一个符号链接,指向模块的本地目录。
npm link
就能起到这个作用,会自动建立这个符号链接。
请设想这样一个场景,你开发了一个模块 myModule
,目录为 src/myModule
,你自己的项目 myProject
要用到这个模块,项目目录为 src/myProject
。首先,在模块目录( src/myModule
)下运行 npm link
命令。
src/myModule$ npm link
上面的命令会在NPM的全局模块目录内,生成一个符号链接文件,该文件的名字就是 package.json
文件中指定的模块名。
/path/to/global/node_modules/myModule -> src/myModule
这个时候,已经可以全局调用 myModule
模块了。但是,如果我们要让这个模块安装在项目内,还要进行下面的步骤。
切换到项目目录,再次运行 npm link
命令,并指定模块名。
src/myProject$ npm link myModule
上面命令等同于生成了本地模块的符号链接。
复制代码 代码如下:
src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule
然后,就可以在你的项目中,加载该模块了。
var myModule = require('myModule');
这样一来, myModule
的任何变化,都可以直接反映在 myProject
项目之中。但是,这样也出现了风险,任何在 myProject
目录中对 myModule
的修改,都会反映到模块的源码中。
如果你的项目不再需要该模块,可以在项目目录内使用 npm unlink
命令,删除符号链接。
src/myProject$ npm unlink myModule
二. 可执行脚本
写一个简单的脚本hello
$ mkdir hello #创建一个文件夹
$ cd hello && touch hello #创建命令文件
#!/usr/bin/env node console.log('hello world');
文件的头部务必加入#!/usr/bin/env node这行代码,这里表示使用node作为脚本的解释程序,node的路径通过env来查找,可以避免node安装路径不一带来的问题。
打开 /usr/bin/env,可以查看到PATH,操作系统通过路径找到node
然后,修改 hello 的权限。
$ chmod 755 hello $./hello
如果想把 hello 前面的路径去除,可以将 hello 的路径加入环境变量 PATH。但是,另一种更好的做法,是在当前目录下新建 package.json ,写入下面的内容。
{ "name": "hello", "bin": { "hello": "./hello" } }
然后执行 npm link 命令。不明白的看上面
$ npm link
执行后会产生一个全局的映射关系,就可以全局使用hello命令了
三.命令行参数
命令行参数可以用系统变量 process.argv 获取。
修改hello脚本
#!/usr/bin/env node console.log('hello ', process.argv);
其中process为node进程中的全局变量,process.argv为一数组,数组内存储着命令行的各个部分,argv[0]为node的安装路径,argv[1]为主模块文件路劲,剩下为子命令或参数,如下:
$ hello a b c
# process.argv的值为[ '/usr/local/bin/node', '/usr/local/bin/hello', 'a', 'b', 'c' ]
脚本可以通过 child_process 模块新建子进程,从而执行 Unix 系统命令,修改hello
exec
方法用于执行bash命令, exec
方法最多可以接受两个参数,第一个参数是所要执行的shell命令,第二个参数是回调函数,该函数接受三个参数,分别是发生的错误、标准输出的显示结果、标准错误的显示结果。
#!/usr/bin/env node var name = process.argv[2]; var exec = require('child_process').exec; var child = exec('echo hello ' + name, function(err, stdout, stderr) { if (err) throw err; console.log(stdout); });
执行$ hello litongqian
如果我们想查看所有文件,修改hello
var name = process.argv[2]; var exec = require('child_process').exec; var child = exec(name, function(err, stdout, stderr) { if (err) throw err; console.log(stdout); });
执行$ hello ls
hello目录下有三个文件
四、shelljs 模块
shell.js 模块重新包装了 child_process,调用系统命令更加方便。它需要安装后使用。
npm install --save shelljs
然后,改写脚本。
#!/usr/bin/env node var name = process.argv[2]; var shell = require("shelljs"); shell.exec("echo hello " + name);
五、yargs 模块
shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数。它也需要安装。
$ npm install --save yargs
yargs 模块提供 argv 对象,用来读取命令行参数。请看改写后的 hello 。
#!/usr/bin/env node var argv = require('yargs').argv; console.log('hello ', argv.name);
使用时,下面两种用法都可以。
$ hello --name=tom hello tom $ hello --name tom hello tom
也就是说,process.argv 的原始返回值如下。
$ node hello --name=tom [ 'node', '/usr/local/bin/hell', '--name=tom' ]
yargs 可以上面的结果改为一个对象,每个参数项就是一个键值对。
六.发布命令包
通过npm publish进行发布,前提是有npm帐号。如何操作可以查看npm 官方文档。
本文是通过原生node.js来开发命令工具,而vue-cli是采用commander.js来简化命令工具开发,
了解了执行流程,去学习对应的模块,就很好知道原理了!,本文抛个砖头
最后:有时我们用到的命令行不是全局安装的,而是本地安装的
1. package.json bin字段
bin项用来指定各个内部命令对应的可执行文件的位置。
"name":"someTool", "bin": { "someTool": "./bin/someTool.js" }
上面代码指定,someTool 命令对应的可执行文件为 bin 子目录下的 someTool.js。
当一个项目依赖上面的someTool工具时,同时只是本地安装
{ "name": "myproject", "devDependencies": { "someTool": "latest" }, "scripts": { start: 'someTool build' //等同于start: './node_modules/someTool/someTool.js build' } }
npm会寻找这个文件,在 node_modules/.bin/
目录下建立符号链接。在上面的例子中,someTool.js会建立符号链接 npm_modules/.bin/someTool
。由于 node_modules/.bin/
目录会在运行时加入系统的PATH变量,因此在运行npm时,就可以不带路径,直接通过命令来调用这些脚本。
因此,像上面这样的写法可以采用简写。
scripts: { start: './node_modules/someTool/someTool.js build' } // 简写为 scripts: { start: 'someTool build' }
所有 node_modules/.bin/
目录下的命令,都可以用 npm run [命令]
的格式运行。在命令行下,键入 npm run
,然后按tab键,就会显示所有可以使用的命令。
1. npm run
上面代码中, scripts
字段指定了两项命令 start ,输入 npm run-script start
或者 npm run start
,就会执行 someTool build 。 npm run
是 npm run-script
的缩写,一般都使用前者,但是后者可以更好地反应这个命令的本质。
npm run
命令会自动在环境变量 $PATH
添加 node_modules/.bin
目录,所以 scripts
字段里面调用命令时不用加上路径,这就避免了全局安装NPM模块。
npm run
如果不加任何参数,直接运行,会列出 package.json
里面所有可以执行的脚本命令。
npm内置了两个命令简写, npm test
等同于执行 npm run test
, npm start
等同于执行 npm run start
。
npm run
会创建一个Shell,执行指定的命令,并临时将 node_modules/.bin
加入PATH变量,这意味着本地模块可以直接运行。
举例来说,你执行ESLint的安装命令。
$ npm i eslint --save-dev
运行上面的命令以后,会产生两个结果。首先,ESLint被安装到当前目录的 node_modules
子目录;其次, node_modules/.bin
目录会生成一个符号链接 node_modules/.bin/eslint
,指向ESLint模块的可执行脚本。
然后,你就可以在 package.json
的 script
属性里面,不带路径的引用 eslint
这个脚本。
{ "name": "Test Project", "devDependencies": { "eslint": "^1.10.3" }, "scripts": { "lint": "eslint ." } }
等到运行 npm run lint
的时候,它会自动执行 ./node_modules/.bin/eslint .
。
如果直接运行 npm run
不给出任何参数,就会列出 scripts
属性下所有命令。
$ npm run Available scripts in the user-service package: lint jshint **.js test mocha test/
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
React怎样在react-router路由实现登陆验证控制
以上是如何正确使用node.js 命令行工具的详细内容。更多信息请关注PHP中文网其他相关文章!

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!