Skip to content

Latest commit

 

History

History
320 lines (219 loc) · 11.7 KB

04.md

File metadata and controls

320 lines (219 loc) · 11.7 KB

npm干货

目录

  • 闲扯
  • 安装
  • 包的概念
    • 怎么才能称作是一个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包的。那么问题来了:

怎么才能称作是一个nodejs包?

这里是官方定义,虽然我知道你不会去看,虽然我知道你去看了也看不懂。但是还是要放一下的。

官方对包的定义很广泛。定义了包的很多种类型。但是我们常用的就是第一种:

a folder containing a program described by a package.json file.

知道你看不懂,翻译如下:

一个含有被package.json文件描述的程序的文件夹。

上面这句话的重点有三个:

  • 一个包是一个文件夹
  • 这个文件夹里面有程序
  • 这个程序是被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-fezi就代表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 install,后面什么包的名字都没有,是什么意思?

答:这时候npm首先会查看你当前项目内有没有package.json文件。如果没有,报错推出。如果有,会把这个描述文件中在"devDependencies"和"dependencies"中的依赖包都安装到当前项目。所以执行完了之后,项目文件夹中会多一个node_modules文件夹,里面就是当前项目要使用的所有依赖包。记住:使用npm i就可以了,节省时间。

在项目部署的时候,不需要安装开发依赖了,怎么配置安装?

答: npm install --production

npm 常用命令

  • npm run <scriptName>: 这个命令会根据scriptName去package.json文件中的scripts字段中找对应的值,当做命令行命令来执行。先简单的知道这个就可以了。
  • npm start: 相当于npm run start,所以,,,你就懂了。
  • npm publish: 把自己的包发布出去。前提是要注册一个账户。
  • npm version: 修改当前包的版本,,我一般不太喜欢用。直接去package.json里面改就可以。

总结

npm 工具非常强大,可以说是npm的出现促进了nodejs社区的壮大,让大家有了协同开发的系统基础。

更多的使用请了解官方文档