如今每个语言体系中都有一个包管理工具,PHP的Composer,Ruby的gem,Python的pip,Java的Maven……当然还有Node.js的npm。有的人会奇怪为何要引入又一个新东西来让我们已经够辛苦的编程工作雪上加霜呢?其实不然,例如我们在做Java开发的时候,有的项目依赖数百个jar,开发人员在build之前总会碰到各种包版本,包找不到的问题,但包管理工具却让我们从这种依赖噩梦中解救出来。我们开发过程中的任何依赖,都可以通过这种工具自动从远程的包仓库中下载回来,并且保证是我们需要的版本,然我们可以专注于开发生产中。
唯一一个缺点,可能就是我东方大国和那些老外的主机距离有够远,经常无法通过官方镜像下载,这种时候通常有三种办法:一个是对包管理工具本身设置代理,第二个是直接全局VPN,第三个就是使用国内同步镜像,当然前提是要有。
好了废话不多说了,下面这篇文章要是出现在几年前就好了,我当时头一次接触npm的时候也是有够晕,希望这次的这篇文章能够给初学者指明一个直路。
一.简介
Node.js让开发者可以用JavaScript编写服务端程序,它基于用C++编写的JavaScript的V8引擎构建,所以它很快(你是否想说C更快?但要知道比起那些用Java编写的中间件来说,C++已经很快了——译者注)。起初,NodeJS主要是设计为做服务端程序开发的,但慢慢的,开发者们把它应用于构建本地自动化工具链。自此开放出了一片新的NodeJS生态环境(例如Grunt和Gulp),让新一代的前端开发者们逐渐形成了工程化的思想。
为了利用好这些工具(或者包),我们需要以一种良好的方式去安装和管理它们(就像Windows的添加删除程序一样)。于是npm就诞生了,npm以你希望的方式安装这些工具,并且提供了一个易用的接口组织这些工具。在我介绍之前,首先要在你的额系统中安装Node.js。
二.安装Node.js
去官网的下载页可以获取你需要的版本。Windows和Mac都有现成的安装包。而对于Linux平台来说也准备了预编译好的二进制文件和源代码。另外,你也可以用对应Linux发行版的包管理工具来安装。
在本文撰写之时(2016年4月3日)官方最新版是v.5.10.0 stable。
下面让我们看看如何查看Node的安装路径以及版本:
$ which node /usr/local/bin/node $ node --version v5.7.0
我们通过来尝试Node的REPL(交互式解释器)来验证一下是否安装成功。
$ node > console.log('Node is running'); Node is running > .help .break Sometimes you get stuck, this gets you out .clear Alias for .break .exit Exit the repl .help Show repl options .load Load JS from a file into the REPL session .save Save all evaluated commands in this REPL session to a file > .exit
好了,现在Node.js已经安装好了,接下来我们试试npm。npm已经随Node一起装好了,无需额外安装。
$ which npm /usr/local/bin/npm $ npm --version 3.6.0
三.用Node.js安装模块
npm可以在你的某个项目中单独安装模块,也可以在你的电脑中全局安装。在某个项目中单独安装的时候,npm会下载所有的文件到你项目中的一个叫做node_modules的文件夹内。这个文件夹的所有者是当前用户(在Linux中,对文件夹的所有者权限敏感,其他用户如果没有授权是无法查看另一个用户拥有的文件的,Windows中虽然也有这个概念,但通常我们个人电脑用户都很单一,所以并不是很重视这个概念——译者注)。全局模块会被安装到{prefix}/lib/node_modules/这个目录下,目录的拥有者是root用户({prefix}通常是/usr/或者/usr/local/)。这意味着如果你要在某个Linux发行版下全局安装模块,需要用sudo命令,否则会引发权限错误。
1.更改全局模块安装路径
首先让我们看一下npm config这个命令会输出什么
$ npm config list ; cli configs user-agent = "npm/3.6.0 node/v5.7.0 linux x64" ; node bin location = /usr/local/bin/node ; cwd = /home/sitepoint ; HOME = /home/sitepoint ; 'npm config ls -l' to show all defaults.
这里列出了npm的基本配置信息,重点是这里
$ npm config get prefix /usr/local
列出了全局安装模块的路径。我们通过下面的命令可以在我们的用户主目录下新建一个文件夹,然后把全局模块安装路径更改到这个目录下。
$ cd && mkdir .node_modules_global $ npm config set prefix=$HOME/.node_modules_global
这样,我们就更改了全局模块的安装位置了。做了责怪操作以后,我们同时也会得到一个自动新建的.npmrc文件。
$ npm config get prefix /home/sitepoint/.node_modules_global $ cat .npmrc prefix=/home/sitepoint/.node_modules_global
但对于有强迫症的开发者来说,这样还不够,我们的npm还停留在root目录下呢。不要紧,我们可以用下面的命令重新安装npm到我们的本地目录中。
$ npm install npm --global /home/sitepoint/.node_modules_global/bin/npm -> /home/sitepoint/.node_modules_global/lib/node_modules/npm/bin/npm-cli.js /home/sitepoint/.node_modules_global/lib └── npm@3.7.5
好了,最后一步,我们把.node_modules_global/bin添加到环境变量$PATH中,我们输入npm命令的时候,就不会去root目录下寻找,而是在我们自己的主目录下寻找了。
export PATH="$HOME/.node_modules_global/bin:$PATH"
现在我们用which命令可以确认我们现在用的npm是来自哪个目录的了。
$ which npm /home/sitepoint/.node_modules_global/bin/npm $ npm --version 3.7.5
ok,这样依赖,我们就不需要再用sudo来进行全局安装了。
2.在全局安装模块
第一个例子,我们来装一个包,叫做UglifyJS。这是一个JS压缩工具。我们用--global这个参数来告诉npm我们要进行全局安装,这个参数也可以简写为-g
$ npm list --global ├─┬ npm@3.7.5 │ ├── abbrev@1.0.7 │ ├── ansi-regex@2.0.0 │ ├── ansicolors@0.3.2 │ ├── ansistyles@0.1.3 .................... └─┬ uglify-js@2.6.2 ├── async@0.2.10 ├── source-map@0.5.3 ├── uglify-to-browserify@1.0.2
大家可以看到,这个输出相当复杂,我们在安装其他包的时候,有可能会更惨不忍睹。我们可以用--depth=0来告诉控制台只输出一个层级的信息。
$ npm list -g --depth=0 ├── npm@3.7.5 └── uglify-js@2.6.2
好了,接下来你就可以直接用uglifyjs这个命令在shell中压缩文件了。
$ uglifyjs example.js -o example.min.js
3.在自己的项目中安装模块
不带任何参数,直接用npm install命令即可在单独的项目目录中安装模块了。新的包会安装到项目文件夹下的一个叫做node_modules的目录中。例如,下面我们在本地安装一个叫做underscore模块(Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能):
$ mkdir ~/project && cd ~/project $ npm install underscore /home/sitepoint/project └── underscore@1.8.3 $ ls node_modules $ ls node_modules underscore
4.在自己项目中列出安装过的模块
我们可以通过npm list来列出自己项目已经安装过的模块
$ npm list /home/sitepoint/project └── underscore@1.8.3
这就表示,我们可以在另一个项目目录中,安装另一个版本的underscore模块。
5.卸载模块
还是以underscore为例,让我们卸载后并检查这个模块是否还存在:
$ npm uninstall underscore - underscore@1.8.3 node_modules/underscore $ npm list /home/sitepoint/project └── (empty)
6.安装特定版本的模块
默认情况下,npm总会寻找最新版本的包来安装,但我们仍然可以通过参数指定安装特定版本的模块:
$ npm install underscore@1.8.2 /home/sitepoint/project └── underscore@1.8.2 $ npm list /home/sitepoint/project └── underscore@1.8.2
7.更新模块
如果我们以前安装的某个包,有了新版本,例如修复bug,那我们需要一条命令能直接对这个包进行升级。
$ npm update underscore underscore@1.8.3 node_modules/underscore $ npm list /home/sitepoint/project └── underscore@1.8.3
注:我们需要在package.json中标记underscore为依赖才能让上面的命令生效。(参见下面的“管理依赖”一节)
8.搜索模块
我们在Linux通常会使用mkdir这个命令,那么npm中是否有这样一种包能达到一样的效果呢。在这个场景下,我们就可能会需要搜索某个具有特定功能的模块,那么我们可以用如下命令去搜索:
$ npm search mkdir npm WARN Building the local index for the first time, please be patient
我们发现,还真有一个,叫做mkdirp。那我们试试直接安装它
$ npm install mkdirp /home/sitepoint/project └─┬ mkdirp@0.5.1 └── minimist@0.0.8
然后我们试试看是否真的是我们想要的包
var mkdirp = require('mkdirp'); mkdirp('foo', function (err) { if (err) console.error(err) else console.log('Directory created!') });
运行结果如下
$ node. mkdir.js Directory created!
ok,还真成功了~
四.管理缓存
通常,我们在用npm安装了一个模块以后,npm会保留一份安装包到本地的.npm目录中,以加速下次安装同样的包的速度。例如在Linux发行版,这个目录是~
$ ls ~/.npm _locks minimist mkdirp registry.npmjs.org underscore
但日积月累,这个目录下一定会积攒很多文件,所以我们需要一个命令清理它。
$ npm cache clean
五.管理依赖
现在,我们已经装过2个包了,但是这以后肯定会需要更多包,所以我们每次都手动安装并非明智之举,这种时候,我们经常在github项目中看到的package.json就派上用场了。我们可以通过这个文件来管理我们的包安装。而这个文件可以用npm init命令创建。
$ npm init This utility will walk you through creating a package.json file. Press ^C at any time to quit. name: (project) demo version: (1.0.0) description: Demo of package.json entry point: (index.js) test command: git repository: keywords: author: Sitepoint license: (ISC)
然后在项目根目录会生成这样一个package.json文件。我们对这个文件添加我们的依赖项,并设置一些参数:
JavaScript { "name": "demo", "version": "1.0.0", "description": "Demo package.json", "main": "main.js", "dependencies": { "mkdirp": "^0.5.1", "underscore": "^1.8.3" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Sitepoint", "license": "ISC" }
下面这个命令可以省略大段的输入参数,直接创建一个配置文件:
$ npm init --yes
package.json中的name参数将会用你项目的文件夹名字来自动设定。
我们可以通过添加private:true这个配置项来阻止不小心发布了私有的仓库,而且可以阻止在执行npm install的时候会产生的警告。让我们创建一个目录,然后试试用package.json来下载模块。
$ mkdir ~/demo && cd ~/demo $ cp ~/project/package.json ~/demo $ npm install $ npm list demo@1.0.0 /home/sitepoint/demo ├─┬ mkdirp@0.5.1 │ └── minimist@0.0.8 └── underscore@1.8.3
又有新问题了,如果我们要手动安装新包的时候(不试用package.json,直接在shell用npm install命令),如何保持这个文件也能同步修改呢?我们可以用--save参数。例如下面,我们用--save参数安装一个叫做request的新包
$ npm install request --save $ npm list --depth=0 demo@1.0.0 /home/sitepoint/demo ├── mkdirp@0.5.1 ├── request@2.53.0 └── underscore@1.8.3
然后,我们的package.json文件就会被自动更新为
JavaScript "dependencies": { "mkdirp": "^0.5.1", "request": "^2.53.0", "underscore": "^1.8.3" }
可以看到对应的包已经被加入了package.json中了,这全部过程不需要我们修改文件。
PS:版本管理器
有几个工具可以让我们在同一台机器上使用不同版本的Node.js。其中一个叫做n。另一个叫做nvm(Node Version Manager)。有一篇教程是专门讲这个问题的,这里就不赘述了。
相关推荐
确保已经下载并安装了最新版本的 Node.js 和 npm(Node.js 包管理器)。安装完成后,你可以通过命令行工具验证 Node.js 和 npm 是否已成功安装。 接下来,我们需要创建项目结构。在你的工作目录下,创建一个新的...
关注Node.js的最新特性,如V8的更新、新的API改进,以及不断壮大的npm包库,如Lodash、Axios等,可以帮助你跟上技术潮流。 通过这个“Node.js从入门到精通”的PDF教程,读者将全面了解Node.js,从基础知识到实践...
- NPM (Node Package Manager) 是 Node.js 的包管理工具。 - 用于管理 Node.js 项目的依赖。 - 可以安装、卸载、更新 Node.js 模块。 2. **常用命令:** - `npm install`: 安装模块。 - `npm init`: 初始化...
NPM是Node.js的包管理器,拥有庞大的第三方库生态系统。开发者可以通过NPM安装、发布和管理项目依赖,加速开发进程。 **8. 异常处理** Node.js采用try...catch结构处理异常,且全局异常会终止整个程序。因此,良好...
要安装Swig,可以通过npm(Node.js的包管理器)进行,命令如下: ``` npm install swig --save ``` **3. 集成Express框架** 在Node.js中,Swig通常与Express框架一起使用。以下是一个简单的集成示例: ```...
2. 第三方模块:讲解如何通过npm(Node Package Manager)来安装、管理和更新第三方模块,以及模块的导入和导出机制。 三、Node.js 文件系统 1. 文件操作:详细说明如何使用Node.js读取、写入、创建、删除文件和...
- npm(Node Package Manager)是Node.js的默认包管理器,用于管理和安装Node.js项目依赖。 - 在命令行输入`npm -v`检查npm版本。 - 常用命令包括`npm install` (安装依赖)、`npm update` (更新依赖)、`npm run dev...
npm 是 nodejs 的包管理和分发工具。它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单。 一 NodeJs安装与NPM管理 安装 前往NodeJs官网,下载...
Node.js 的设计哲学使得它非常适合处理实时、数据密集型的网络应用,如实时聊天、协作工具和流媒体服务。通过事件驱动和非阻塞I/O,Node.js 能够高效地处理大量并发连接,降低服务器成本,提高应用的响应速度。同时...
基于ffcreator的nodejs视频处理工具库源码+使用说明(支持视频、AE模板相册、文字、Lottie、图片动画).zip 你需要会使用nodejs,同时确保你的环境可以使用node 支持生成 - 相册视频 - 图片视频 - 文字视频 - AE模板...
6. **npm管理**:讲解npm的作用,如何使用`npm init`创建package.json文件,以及安装、卸载和管理依赖库。 7. **示例项目**:可能包含一些简单的NodeJS项目示例,帮助初学者快速理解NodeJS的工作原理,如创建HTTP...
同时,NodeJS还提供了一个内置的命令行工具`npm`(Node Package Manager),用于安装和管理第三方模块,是NodeJS生态系统的重要组成部分。 **学习资源** 压缩包中的`NODE.js入门手册.pdf`是学习NodeJS的好资料,它...
在2016年10月11日facebook 公开了新的javascript包管理工具 yarn, 用来替代目前被广泛使用的npm(nodejs 自带的包管理工具),本文将介绍yarn工具带来的优点和使用入门,以及对比npm解决了什么问题,带来哪些便利。...
这份"nodeJs开发文档"应该包含了关于Node.js的基础知识、API使用、模块系统、异步编程、网络编程以及文件操作等多个方面的内容,非常适合初学者入门。 1. **Node.js基础**:Node.js的核心特性是其事件驱动、非阻塞I...
NPM 是 Node.js 的包管理器,用于安装、发布和管理第三方模块。通过 `npm install <package>` 命令安装模块,`package.json` 文件用于记录项目依赖。 ### 7. Express 框架 Express 是一个基于 Node.js 的 Web 应用...
3. **npm**:npm是Node.js的包管理器,它允许开发者管理和共享依赖包。`npm i`命令会根据`package.json`文件中的依赖列表,下载并安装所有必需的模块。 4. **Express框架**:Express是Node.js的一个Web应用框架,...
安装完成后,需要验证Node.js和npm(Node.js包管理器)是否成功安装,并了解它们的基本命令用法。 接下来,教程会详细讲解Node.js的核心API,这是Node.js强大功能的基础。其中,Event Loop(事件循环)是Node.js...
用于创建NodeJS应用的入门工具包 该入门工具包使用 巴别塔 打字稿 更漂亮 Nodemon 它支持 绝对路径导入 转译TypeScript文件 自动重新启动src文件夹中文件的更改 指南 该入门工具包假定您使用的是Yarn而不是NPM。 ...
npm是默认的包管理工具,用于安装、卸载和管理依赖包。yarn是后来出现的替代品,以其更快的速度和更稳定的性能受到欢迎。它们都允许开发者方便地引入第三方模块,简化项目的构建和维护。 2. **后端服务器搭建**:...