node npm入门

这篇文章,主要介绍了npm的各种使用方法,从如何创建配置文件、安装、全局安装、项目安装、卸载组件、启动脚本等。

其实一直想好好总结下,把学过的东西认真的整理一遍,同时,也希望能在整理过程中,去学习更细致的使用。就这样,我开始进行各种工具的入门了。

安装node npm

安装node:建议直接访问官网,下载合适的安装包。这样安装的好处是,不需要处理任何环境变量等。

安装好node后,会自动带有npm。也就是说npm也安装好了。

启动终端/命令控制台,输入

  • node -v : 可以看到当前安装node的版本号,比如v6.2.1

  • npm -v : 可以看到当前安装npm的版本号,比如3.9.3

如果没有出现版本号,那么,请重新安装。

使用node

node是一个运行环境,我们可以写代码在这个环境里运行。

如果仅仅是调试个别代码,或者说是测试下而已,可以在终端/命令控制台,输入node,之后会出现一个>符号,此时就可以写代码了。实时显示。

不过一般我们都是把代码写到文件里,在进行执行。

比如,我在/Users/yukapril下新建了一个test.js文件,写上一句代码:

1
console.log('hello world!');

之后,我们执行

1
2
cd /Users/yukapril #进入文件目录
node test.js

这样,我们在我们可以看到结果,返回了一句话hello world!

那node有什么用呢?

我们可以编写一些有用的代码,比如说,删除某个目录下的文件,再将某个目录下的文件拷贝一份过来等等。

反正有强大的语法,无所不能!具体写法,可以参见API

这么做的人不是很多,因为在npm上面,有很多已经写好的工具包了。

npm?npm是工具,是帮我们找到需要的工具包的工具。可以简单理解为下载工具。

使用npm

创建package.json文件

使用npm,就要创建配置文件。我相信大部分人都见过package.json文件。那么这个文件是如何生成的呢?

除了我们复制一个已有的package.json文件,我们是可以用npm进行生成的。

方法是进入项目目录后,执行npm init。他会询问你一些问题,来协助生成package.json文件。内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Press ^C at any time to quit.
name: (test)
version: (1.0.0)
description:
entry point: (test.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/yukapril/test/package.json:

{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "test.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}


Is this ok? (yes) yes

一开始,先会询问项目名字,版本等。你可以直接按回车,使用默认值(即括号内的值)。

最后,他会让你确认生成的json是否合你意,确认请输入yes即可。

我一般都是使用默认值,有问题的话,再去package.json中修改。

安装依赖包

假设,我们要做一个基于express框架的服务器端程序。

  • 我们可以在全局安装 npm install -g express

  • 也可以在项目中安装 npm install express

这两种方式的区别:

  • 全局安装:在任何一个目录下,都可以直接使用express

  • 项目安装:只能在当前项目使用express,不在项目目录下,无法使用。会将代码写到node_modules目录下。

  • 都不改package.json文件

除了个别通用性很强的工具(比如webpack或者gulp),我个人不建议全局安装任何软件工具,因为你可以方便的使用,但是分享给别人的代码中,是不带有此工具的,所以可能是不能运行的。

使用项目安装工具的话,建议使用以下两个参数:

  • npm install express -save : 项目安装express,同时修改package.json的依赖(dependencies字段)

  • npm install express -save-dev : 项目安装express,同时修改package.json的开发依赖(devDependencies字段)

这样写的好处是:安装了那些依赖工具,会在package.json中体现出来。如果将项目分享给别人,可以清晰的看到,并安装。

这两种写法的区别是:如果是普通依赖,那么说明这个依赖包的代码会最终体现到我们的程序中,如果是开发依赖,那么仅仅在开发过程中需要,最终的程序代码中不含有此依赖。

举个例子说明:我们要基于express框架,开发一个网站。开发过程中,要使用eslint对代码质量进行测试,同时要使用karma做测试用例。那么,express就是项目普通依赖,eslintkarma就是开发依赖。

不过不必担心,这两种依赖并不是严格区分,比如你把上面的例子的三个依赖,全部安装到普通依赖,或者开发依赖,在本地调试仍然可以正常启动或编译。因为不论是什么依赖,都是安装为目的。但是可能在服务器上无法运行,因为有的服务器配置上,默认只会安装普通依赖!他认为开发依赖是不需要的!

删除依赖包

有了安装,就要有删除。其实为了省事,可以直接找到已经安装的包,拖拽到回收站。但是windows下,由于文件路径/文件名等原因,可能这样无法删除。

如果想手动删除目录,那么要先确认安装在了哪里:

  • npm root -g : 获取全局安装路径,返回比如/usr/local/lib/node_modules的路径

  • npm root : 获取当前项目安装的路径,返回比如/Users/yukapril/test/node_modules的路径,需要注意的是,如果当前项目没有package.json node_modules目录,也会有一个返回值,这一点我也不能理解,可能是说,如果需要安装包的话,应该是那个目录。

如果想检查当前项目安装了那些包,使用 npm list,我基本上没用过。

删除一个依赖包,也很简单,不过要区分是全局删除,还是项目删除。

  • npm uninstall express -g : 全局删除依赖

  • npm uninstall express : 项目删除依赖

批量安装依赖包

还有这种情况,你从网上下载了一个项目,或者要启动别人的项目。项目为了节省空间,一般都不会带有node_modules目录的。这时候,就需要你按照package.json文件中的依赖,进行安装了。

方法很简单:npm install即可。

其他命令

更新一个依赖包,npm update express,这个命令我很少用,一般在出现问题时候可能会用到。

使用npm srcipts

在使用npm init创建的package.json,默认如下:

1
2
3
4
5
6
7
8
9
10
11
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "test.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

我们可以在scripts字段下,增加我们需要的命令。

比如,以后会用到的webpack,项目安装后,即可以使用命令webpack main.js app.js执行操作了。我们增加到build命令上。

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "test.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack main.js app.js"
},
"author": "",
"license": "ISC"
}

这样,我们就可以使用npm run build来执行对应命令了。

所有的scripts下的命令,都可以用npm run xxx来执行。

但是有两个特殊命令,有简写方法,他们是:

  • npm run start : 简写为npm start

  • npm run test : 简写为npm test

可能是这两个命令使用率太高,所以有简写方法。

npm scripts 高级一点的用法

比如我们要做多件事,可以这样来写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "test.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack main.js app.js",
"build2": "webpack other.js app2.js",
"task1": "npm run build & npm run build2",
"task2": "cd test && mkdir abc",
"show-name": "echo npm_package_name"
},
"author": "",
"license": "ISC"
}

其中task1task2主要差别在中间的&上。一个&表示两个任务是并行的,两个&表示先执行第一个,成功后执行第二个。

如果要获取package.json配置文件内容使用呢?

  • srcipts中,可以使用npm_package_前缀来获取package.json中的字段值。

    比如:npm_package_name npm_package_scripts_test

    由于scripts里面是bash脚本,所以只能使用bash语法。不支持js语法的。

  • 在项目代码中,要读取package.json中的name字段,那么怎么来处理?只能使用常规的读取文件方案。

1
2
var package = require('./package.json');
console.log('项目名:', package.name);

小结

npm语法,其中init install run为重点

  • npm init : 创建package.json

  • npm install : 根据package.json安装依赖

  • npm install -g some-package : 全局安装包

  • npm install some-package : 项目安装包

  • npm install some-package -save : 项目安装包,并更新package.json的普通依赖

  • npm install some-package -save-dev : 项目安装包,并更新package.json的开发依赖

  • npm root -g : 获取npm依赖包全局安装路径

  • npm root : 获取npm依赖包项目安装路径

  • npm list : 列出当前项目的依赖包

  • npm uninstall some-package -g : 全局删除依赖包

  • npm uninstall some-package : 项目删除依赖包

  • npm update some-package : 更新依赖包

  • npm run some-scripts : 执行制定脚本