900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > node.js 命令行工具使用详解

node.js 命令行工具使用详解

时间:2018-09-08 08:20:26

相关推荐

node.js 命令行工具使用详解

web前端|js教程

javascript,node.js,命令行

web前端-js教程一. 先了解一下package.json

jsp源码分享,没有网怎么设置vscode,ubuntu桌面简介,tomcat 容器间通信,爬虫框架库,苹果php环境搭建,湘潭seo优化哪家靠谱,网站播放视频插件,网站织梦模板lzw

每个项目的根目录都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息,下面是一个比较完整的package.json文件

聚茶客 源码,vscode安装离线扩展包,ubuntu多桌面,tomcat jsp版本,sqlite取证,4.网页设计时应注意什么问题,dede数据库目录文件,如何服务器与vps,jquery地区插件,前端koa框架,网络爬虫感悟,php length,茌平seo,springboot数据存储,帝国cms灵动标签当前栏目,质感php个人网站源码,手机网页版面,discuz模板打包 网盘,织梦系统 后台左侧的菜单不显示,qq聊天页面源码,社交平台的管理系统,仿《mp4电影》网程序源码lzw

{ "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字段

php开发微信分销系统源码下载,全自动安装ubuntu,tomcat分布式锁,咨询爬虫兽医,php编译dll,宁陵个性化seo优化多少钱lzw

指定了运行脚本命令的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模块的时候,有时我们会希望,边开发边试用,比如本地调试的时候,require(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 nodeconsole.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 nodeconsole.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, , c ]

脚本可以通过 child_process 模块新建子进程,从而执行 Unix 系统命令,修改hello

exec方法用于执行bash命令,exec方法最多可以接受两个参数,第一个参数是所要执行的shell命令,第二个参数是回调函数,该函数接受三个参数,分别是发生的错误、标准输出的显示结果、标准错误的显示结果。

#!/usr/bin/env nodevar 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目录下有三个文件

D、shelljs 模块

shell.js 模块重新包装了 child_process,调用系统命令更加方便。它需要安装后使用。

npm install --save shelljs

然后,改写脚本。

#!/usr/bin/env nodevar name = process.argv[2];var shell = require("shelljs");shell.exec("echo hello " + name);

E、yargs 模块

shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数。它也需要安装。

$ npm install --save yargs

yargs 模块提供 argv 对象,用来读取命令行参数。请看改写后的 hello 。

#!/usr/bin/env nodevar argv = require(yargs).argv;console.log(hello , argv.name);

使用时,下面两种用法都可以。

$ hello --name=tomhello tom$ hello --name tomhello tom

也就是说,process.argv 的原始返回值如下。

$ node hello --name=tom[ ode, /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 runnpm run-script的缩写,一般都使用前者,但是后者可以更好地反应这个命令的本质。

npm run命令会自动在环境变量$PATH添加node_modules/.bin目录,所以scripts字段里面调用命令时不用加上路径,这就避免了全局安装NPM模块。

npm run如果不加任何参数,直接运行,会列出package.json里面所有可以执行的脚本命令。

npm内置了两个命令简写,npm test等同于执行npm run testnpm 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.jsonscript属性里面,不带路径的引用eslint这个脚本。

{ "name": "Test Project", "devDependencies": { "eslint": "^1.10.3" }, "scripts": { "lint": "eslint ." }}

等到运行npm run lint的时候,它会自动执行./node_modules/.bin/eslint .

如果直接运行npm run不给出任何参数,就会列出scripts属性下所有命令。

$ npm runAvailable scripts in the user-service package: lint jshint **.js test mocha test/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。