npm
时间: 2024-06-09
概述
Ryan Dahl
是一名在德国工作的资深的C/C++
美国程序员,他起初的主要工作都是围绕高性能Web服务器
。在经历过一些尝试֖和失败ܾ᠋之后,他找到了设计高性能,Web服务器的几个要点:事件驱动
、非阻塞I/O
。2009年,Ryan Dahl
正式推出了基于JavaScript
语言和Chrome V8
引擎的开源Web服务器项目,命名为Node.js
。
前人栽树后人乘凉,所有的工作都需要协同。但是在Node.js
中并没有内置包管理器,不方便大家共享代码。这时,程序员
Isaac Z. Schlueter
用 JavaScript
(运行在Node.js
上)写了包管理工具npm
,最终Node.js内置了npm。
NPM简介
npm
由三个独立的部分组成:
- npmjs官网
- 注册表(registry):一个巨大的数据库,保存了每个包
package
的信息。 - 命令行里的客户端:开发者使用它来管理、安装、发布模块。
我们实际使用的也就是第三个了。
入门
# 使用国内代理
npm config set registry https://registry.npm.taobao.org
NPM常用命令
# 查看版本
npm -v
# 查看所有模块的版本
npm version
# 安装包, i为简写,包放在node_modules下
npm i lodash
npm install <package_name>
写入依赖文件
写入dependencies
。
npm i <package_name> --save
npm i <package_name> -S
写入devDependencies。
npm i <package_name> --save-dev
npm i <package_name> -D
全局安装
所谓的全局安装,只是包放置的位置不一样。全局安装路径通常在C:\Users\Adong\AppData\Roaming\npm
类似路径中,可以通过命令查看:
# 修改全局安装的文件路径
npm config set prefix D:\GreenProgram\npm
# 全局安装
npm i modName -g
删除包
npm uninstall <package_name>
npm un <package_name>
# 卸载全局包
npm un -g modName
查看NPM的配置
npm config list
修改安装源
npm config set registry https://registry.npm.taobao.org
package.json文件
npm install命令可以直接安装包,但是如果需要同时安装很多包怎么办?这个时候我们就需要一个package.json
文件。一个
package.json 文件有以下作用:
1、作为一个描述文件,描述了你的项目依赖哪些包。 2、允许我们使用 “语义化版本规则”(后面介绍)指明你项目依赖包的版本。 3、让你的构建更好地与其他开发者分享,便于重复使用。
使用npm init
即可在当前目录创建一个package.json
文件。输入 npm init
后会弹出一堆问题,我们可以输入对应内容,也可以使用默认值。在回答一堆问题后输入 yes
就会生成package.json
文件。如果嫌麻烦,可以直接输入npm init --yes
直接生成默认值的package.json
文件。
和PHP的包管理器
Composer
的composer.json
文件差不多。
卸载全局软件包
npm uninstall -g <package>
运行脚本
npm
不仅可以用于模块管理,还可以用于执行脚本。package.json
文件有一个scripts
字段,可以用于指定脚本命令,供npm
直接调用。npm run
如果不加任何参数直接运行,会列出package.json
里面所有可以执行的脚本命令。
{
"name": "myproject",
"scripts": {
"dev": "node build/dev-server.js",
"test": "mocha test/"
}
}
例如在这个package.json
的文件夹下使用npm run dev
就相当于运行了node build/dev-server.js
。命令中间也支持和&
和&&
操作。比如:
"build": "npm run build-js && npm run build-css"
上面的写法是先运行npm run build-js
,然后再运行 npm run build-css ,两个命令中间用 && 连接。
npm run
是npm run-script
的缩写。&
代表并行执行,&&
代表顺序执行。
npm
内置了两个命令简写,npm test
等同于执行npm run test
,npm start
等同于执行npm run start
。
写在scripts
属性中的命令,也可以在node_modules/.bin
目录中直接写成bash
脚本。下面是一个范例:
#!/bin/bash
cd site/main
browserify browser/main.js | uglifyjs -mc > static/bundle.js
假定上面的脚本文件名为build.sh
,并且权限为可执行,就可以在scripts
属性中引用该文件。
"build-js": "bin/build.sh"
关于在JS中引用包
正常情况下,在项目中依赖的包,我们都是用本地安装,然后在项目中可以通过require
引入,那么如何把包进行全局安装,然后在项目中引入呢?很简单,只要在Windows
环境变量中新建一个NODE_PATH
的变量,并将其值设置为npm
的包目录,比如C:\Program Files\nodejs\node_modules\npm\node_modules;C:\Users\A\AppData\Roaming\npm\node_modules
。
npm系统目录下实际上已经有了很多包,一些常用的都在,而后面这个路径则是全局安装的路径,可以通过
npm root -g
命令查看到。
关于NPM的坑
NPM
如果是本地安装
,在需要运行命令时会出问题。全局安装不会,因为NPM会默认建立一个系统环境变量,把全局安装的路径加入进去,而本地安装时模块是安装在本地的node_modules
下面,命令保存在
node_modules/.bin
,而这个是没有在环境变量中的。解决方案有两个:
写全命令路径
就是在命令前加入node_modules\\.bin\\
。
node_modules\.bin\babel main.js
坑爹的
Windows
的路径必须反斜杠
,别搞错了。
利用package.json
这里的原理:package.json
中的script
会按照一定顺序寻找命令对应位置,本地的node_modules/.bin
路径就在这个寻找清单中,所以无论是全局还是局部安装的,你都不需要写前面那指明详细的路径了。
npm link
通过npm link
来处理项目中的公共模块。
发布、安装自己的npm模块
1、在npm网站注册一个自己的账号。注册完成npm会发一封邮件到你填写的邮箱里边,记得到你填写的邮箱里边去验证一下。
2、命令行键入npm login
,按照提示输入之前注册的用户名、密码、邮箱。
3、创建一个文件夹,名字为你要发布的模块的名字。例如:testnpm
4、命令行进入到刚刚创建的文件夹中,键入npm init
创建一个package.json
的文件。其中保存你即将发布的模块的名字、版本号、说明、作者等相关信息。
5、创建一个js文件,文件名和你package.json里边配置的entry point
的文件名保持一致,用module.exports
导出模块即可。此js文件,及为模块的相关文件。
module.exports = function(){
//模块的代码逻辑
}
6、命令行输入npm publish
发布模块。(若不在当前文件夹中,则需要输入npm publish 你的文件夹名字,来进行模块的发布)。
7、如果发布过程中,提示:npm ERR! you do not have permission to publish "your module name". Are you logged in as the correct user?
即表示包的名字被占用了,可以通过访问npm的网站来进行包的搜索该模块是否存在。如果中途没有报任何错误,即表示模块已经成功发布,可以通过npm install
你的模块名,来进行安装使用了。自己也可以通过输入npm view
你的模块名,来查看模块是否发布成功,如果发布成功,会返回模块的配置信息。
8、最后,可以通过npm --force unpublish
你的模块名,来删除发布的模块(超过24小时就不能删除了)。关于模块的更新,和上传使用的是一样的指令,即npm
publish(npn publish 你的模块名),只是需要修改package.json的版本号。关于版本号的规范,可以参照npm关于版本号的一些规范说明。