- 闲扯
- 安装
- 包的概念
- 怎么才能称作是一个nodejs包?
- 知道你看不懂,翻译如下:
- 什么叫被package.json描述的程序?
- 起航
- 使用前准备
- 问题
- 依赖
- 安装依赖
- 安装一个开发依赖
- 使用依赖包
- 安装运行依赖
- 删除一个依赖
- npm install
- 问题:
- npm 常用命令
- 总结
npm最开始的定位就是: Nodejs Package Manager.
但是,现在npm官网最醒目的地方放着一觉话:npm is the package manager for ...,然后后面就一直在切换,有nodejs, browsers, electron, 等等。虽然这样说,但是它的本质没变,它使用的环境依然是nodejs,虽然npm上的包经过打包编译等可以在不同的平台环境上去使用,但是,最根本的,这些包还是以nodejs来写的。而npm就是这些包的管理工具。
npm 说白了,也是一个程序啊。这个程序也是用什么语言写的哪?当然是node啦。是不是有想看它源码的冲动?那么源码在哪里呢?其实只需要找到全局安装npm包的node_modules文件夹在哪里就找到了。因为npm本身也是一个npm包啊。
# mac
/usr/local/lib/node_modules/npm
任何一个node项目都可以成为一个npm包。那么什么是一个包呢?别急,慢慢来。
npm 伴随着 nodejs 的安装而默认安装。判断npm有没有安装成功可以通过查看它的版本号来判断:
$ npm -v
3.10.9
更新npm版本可以通过如下命令更新。
npm install -g npm@latest
上面的命令是更新到npm的最新版本,如果想更新到特定版本,只需要把npm@latest
中的latest
改成特定的版本号就可以了。如:
npm install -g [email protected]
既然npm是包管理工具,是用来管理nodejs包的。那么问题来了:
这里是官方定义,虽然我知道你不会去看,虽然我知道你去看了也看不懂。但是还是要放一下的。
官方对包的定义很广泛。定义了包的很多种类型。但是我们常用的就是第一种:
a folder containing a program described by a package.json file.
一个含有被package.json文件描述的程序的文件夹。
上面这句话的重点有三个:
- 一个包是一个文件夹
- 这个文件夹里面有程序
- 这个程序是被package.json描述的
我们可以说package.json是这个程序的描述文件。我们往往通过描述去了解一个东西。这里也不例外。我们可以通过这个描述文件去了解这个程序。下面我们来看一个package.json。如下:
{
"name": "node-test",
"version": "1.0.0",
"description": "This is a node-test program",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"author": "Ben Chen",
"license": "ISC",
"devDependencies": {
"log-update": "^2.0.0"
},
"dependencies": {
"ben-component": "0.0.4"
}
}
上面就是一个package.json文件,也就是我们前面提到的一个程序的描述文件。我们可以通过这个文件了解到一些信息。如:
- name (程序名称): node-test
- version (版本): 1.0.0
- description (描述) : 这里通常放的是这个程序的功能的文字描述
- main (程序的入口文件) : main.js
- author (程序的作者) : Ben Chen
- license (许可类型) : ISC
- devDependencies (开发依赖): 说明这个程序在开发中使用的一些开发依赖包和对应的版本
- dependencies (使用依赖): 说明这个程序在使用的时候需要哪些依赖
- ...(等等等)
嗯,这个文件很有用,我们可以通过这个文件了解到很多关于它描述的那个程序的信息。但是,,,其实这个文件的主要功能不是给人看的,更重要的是给npm看的。让npm了解到这个程序的详细情况。
下面我们就来使用npm。
还记得我们以前建的node-test文件夹吗?请不要删除它,它将伴随我们学习nodejs的整个过程。
要想在你的项目中使用npm来管理,首先,你的项目就得是一个npm包。还记得我们前面说的包的三个条件吗?
- 第一个:得是一个文件夹。okay,我们的node-test的确是一个文件夹。
- 第二个:得包含一个程序(program)。是个,我们包涵程序,不仅是一个,我们有两个。一个main.js还有一个server.js。没关系。
- 第三个:这个程序需要使用package.json描述。咦?这个好像不满足诶,好像现在还没有。那咋办?写一个呗。
okay,下面就新建一个package.json文件。里面填写如下内容:
{
"name": "node-test",
"version": "1.0.0",
"description": "This is a node-test program",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Ben Chen",
"license": "ISC"
}
好了,现在有了package.json文件,我们可以说我们的程序是一个npm包了。同时我们可以在我们的这个项目中使用npm来管理这个包了。不信你试试如下命令:
$ npm info
会列出当前项目的一系列的描述信息。
爱思考的你可能会问,有没有简单的方法写package.json? 我每次要在项目中使用npm都得有package.json,每次都得写一遍。或者复制一个模板过来改一改里面的值。有没有更快的办法,工具,帮我们做掉这件事情?
答:当然有啦。写npm的大神们已经为你解决掉这个问题了。通过一个npm命令:npm init
就可以完成。这个命令的功能就是初始化一个npm包。会根据你的项目自动为你生成一个package.json。你只需要像回答一样一步步的按enter
就好了。现在我们把刚才废了九牛二虎之力辛辛苦苦写的package.json文件删掉。不要舍不得,删掉。然后使用npm init
来体验一下。
$ node init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (node-test)
version: (1.0.0)
description:
entry point: (main.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/Ben/Work/node-test/package.json:
{
"name": "node-test",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes)
一班情况下,是都不需要动,一直按enter到结束就好。然后你就可以在项目中看到那个自动生成的package.json了。默认情况下项目的名字就是按照你当前文件夹的名字来命名。初始版本永远都是1.0.0
。是不是很屌?
关于依赖。什么是依赖呢?依赖就是我这个项目需要它,依赖它才能开发或者运行。所以这里有两种依赖,一种叫做开发依赖,一种叫做运行依赖。
通常一个nodejs项目会有相当多的依赖。这些依赖都是别人开发的npm包。那为什么别人会开发一些npm包呢?因为在开发nodejs的时候发现一个功能经常被使用,而且不只是我一个人经常使用,同行们也经常使用。那好吧,我打个包出来,放到npm上,别人想使用的时候不需要再次花时间去写,直接安装进去就可以使用了。
如何区分开发依赖和运行依赖:
- 如果一个包只在开发的过程中需要使用,在正式环境中跑node程序的时候不需要使用,那么这就是一个开发依赖。开发依赖会被写在package.json的"devDependencies"字段中一条条的列出。
- 如果一个包在正式环境中需要使用,那么它就是运行依赖。运行依赖会被写在package.json的"dependencies"字段中一条条的列出。
切记:两种依赖包在使用中没有任何的差别。区别只在于:在生产环境中,我们不需要安装开发依赖。
好了,弄明白了什么是依赖,和依赖的种类。下面我就开始安装依赖了。
安装依赖的命令是npm install <pkg>
。代表包的名字
npm install --save-dev npm-test-fez
npm-test-fez
是我提前发布的用于教学的测试包。这个包的的功能就是。。。。后面你会知道。
运行完之后会有几个变化:
- 当前项目多了一个文件夹,名字叫做: node_modules 。这个文件夹就是用来存放你安装的所有npm包的地方。不区分开发依赖还是运行依赖包。
- package.json的"devDependencies"字段中多了一条记录:
"npm-test-fez": "^1.0.0"
。这条记录就是告诉别人,活着告诉其它程序,我这个项目在开发的时候需要一个名字叫做npm-test-fez
的依赖包,这个包的版本至少要在1.0.0
以上,包涵1.0.0
。
上面的命令好长啊,有没有简单的?
答:当然有啦。npm i -D npm-test-fez
。 i
就代表install
,-D
就代表--save-dev
打开我们以前写的文件mian.js
.然后引入依赖并且使用。
var NpmTestFez = require('npm-test-fez');
NpmTestFez.sayHello();
然后跑一下node main.js
;
$ node main.js
Hello FEZ
哈哈哈,这就是一个打印'Hello FEZ'的功能包。
好,到现在我们讲完了npm包的安装,使用。刚刚我们只是讲了安装开发依赖。其实运行依赖的安装也是一样的。只不过安装的参数不同,会在package.json文件的不同地方添加一条记录。
npm install --save npm-test-fez
# 或者
npm i -S npm-test-fez
# 删除一个开发依赖
npm remove --save-dev npm-test-fez
# 或者
npm r -D npm-test-fez
# 删除一个运行依赖
npm remove --save npm-test-fez
# 或者
npm r -S npm-test-fez
在配置开发环境的时候,我们经常会使用
npm install
,后面什么包的名字都没有,是什么意思?
答:这时候npm首先会查看你当前项目内有没有package.json文件。如果没有,报错推出。如果有,会把这个描述文件中在"devDependencies"和"dependencies"中的依赖包都安装到当前项目。所以执行完了之后,项目文件夹中会多一个node_modules文件夹,里面就是当前项目要使用的所有依赖包。记住:使用npm i
就可以了,节省时间。
在项目部署的时候,不需要安装开发依赖了,怎么配置安装?
答: npm install --production
npm run <scriptName>
: 这个命令会根据scriptName去package.json
文件中的scripts
字段中找对应的值,当做命令行命令来执行。先简单的知道这个就可以了。npm start
: 相当于npm run start
,所以,,,你就懂了。npm publish
: 把自己的包发布出去。前提是要注册一个账户。npm version
: 修改当前包的版本,,我一般不太喜欢用。直接去package.json里面改就可以。
npm 工具非常强大,可以说是npm的出现促进了nodejs社区的壮大,让大家有了协同开发的系统基础。
更多的使用请了解官方文档