爱学习的好孩子

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. SchlueterJavaScript(运行在Node.js上)写了包管理工具npm,最终Node.js内置了npm。

NPM简介

npm由三个独立的部分组成:

  1. npmjs官网
  2. 注册表(registry):一个巨大的数据库,保存了每个包package的信息。
  3. 命令行里的客户端:开发者使用它来管理、安装、发布模块。

我们实际使用的也就是第三个了。

入门

# 使用国内代理
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的包管理器Composercomposer.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 runnpm run-script的缩写。 &代表并行执行,&&代表顺序执行。

npm内置了两个命令简写,npm test等同于执行npm run testnpm 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关于版本号的一些规范说明。

评论