NPM笔记:
名字的含义:
1、是Node的开放式模块登记和管理系统
2、Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块
常用命令:
更新到最新版本(全局):npm install npm@latest -g
查看npm命令列表:npm help
查看各个命令的简单用法:npm -l
查看npm版本:npm -v
查看npm配置:npm config list -l
生成新的package.json:npm init (添加-y 或者 -f 表示直接跳过提问阶段,直接生成package.json文件)
设置环境变量:npm set <key> <value>
例如:设置package.json初始化的作者、邮箱、主页和许可证字段
npm set init-author-name 'Your name'
npm set init-author-email 'Your email'
npm set init-author-url 'http://yourdomain.com'
npm set init-license 'MIT'
npm set save-exact true (package.json记录一个具体的版本,而非一个版本范围)
npm config命令
设置全局的模块安装目录:npm config set prefix $dir($dir文件路径)
允许的版本范围从^变为 ~ :npm config set save-prefix ~
^ :匹配最近小版本依赖包
~:匹配最新的大版本依赖包 (推荐使用~ 小版本可能会不稳定,引起一些不可预知的异常)
*:匹配最新的版本依赖包
配置用户名:npm config set init.author.name $name
配置邮箱: npm config set init.author.email $email
查看模块具体信息:npm info <package_name>
搜索npm仓库:npm search <package_name| Reg> (可以是字符串也可以是正则)
以树型结构列出当前项目安装的所有模块,以及它们依赖的模块:npm list
以树型结构列出全局安装的所有模块,以及它们依赖的模块:npm list -global
npm install命令
本地安装:npm install <package_name>
全局安装:npm install -global <package_name> | npm install -g <package_name>
github安装:npm install git://github.com/package/path.git
安装之前,npm install 会先检查,node_modules目录是否存在指定模块,如果存在就不会重新安装,即使指定模块存在新版本。
如果想重新安装,可使用命令:npm install <package_name> --force
当然,你要是打算整个模块都需要重新安装,可以手动删除node_modules目录,也可以通过命令行删除:rm -rf node_modules
然后运行 npm install 重新导入
安装不同版本:
最新版本:npm install <package_name>@latest
固定版本:npm install <package_name>@0.1.1
版本区间:npm install <package_name>@'>=0.1.1 < 0.2.0'
安装最新的beta版:npm install <package_name>@beta(latest beta)
安装最新的beta版:npm install <package_name>@beta(latest beta)
安装指定的beta版:npm install <package_name>@1.3.1-beta.3
install命令可以使用不同参数,指定所安装的模块属于哪一种性质的依赖关系,即出现在packages.json文件的哪一项中。
–save:模块名将被添加到dependencies,可以简化为参数-S。
–save-dev: 模块名将被添加到devDependencies,可以简化为参数-D。
两者区别:简单理解来说就是 -S 对应的是生产环境 -D对应的是本地开发环境,具体来说,当你指定的模块需要在生成环境使用的话,最好使用-S安装。当你打包的时候,会把改资源打包成文件,供用户访问,浏览器缓存。devDependencies一般保存的是工具类模块,在生产环境不会用到。但是vue例外。如果vue内引用了devDependencies内资源,也会打包到生产包内,并发布
npm install sax --save
npm install node-tap --save-dev
npm install sax -S
npm install node-tap -D
npm install默认会安装dependencies字段和devDependencies字段中的所有模块,如果使用--production参数,可以只安装dependencies字段的模块。
npm install --production
NODE_ENV=production npm install
避免系统权限
1)、在主目录下新建配置文件.npmrc,然后在该文件中将prefix变量定义到主目录下面:prefix=/home/yourUsername/npm
2)、在主目录下新建npm子目录 :mkdir ~/npm
3)、将这个路径在.bash_profile文件(或.bashrc文件)中加入PATH变量:export PATH=~/npm/bin:$PATH
更新模块
升级当前项目的指定模块
npm update [package_name]
升级全局安装的模块
npm update -global [package_name]
npm update会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。使用-S或--save参数,可以在安装的时候更新package.json里面模块的版本号
注意,从npm v2.6.1 开始,npm update只更新顶层模块,而不更新依赖的依赖,以前版本是递归更新的。如果想取到老版本的效果,要使用下面的命令。
npm --depth 9999 update [package_name]
卸载已安装的模块:npm uninstall
卸载本地模块:npm uninstall [package_name]
卸载全局模块:npm uninstall [package_name] -global
执行脚本:npm run
package.json文件有一个scripts字段,可以用于指定脚本命令,供npm直接调用。
npm run命令会自动在环境变量$PATH添加node_modules/.bin目录,所以scripts字段里面调用命令时不用加上路径,这就避免了全局安装NPM模块。
npm run如果不加任何参数,直接运行,会列出package.json里面所有可以执行的脚本命令。
npm run会创建一个Shell,执行指定的命令,并临时将node_modules/.bin加入PATH变量,这意味着本地模块可以直接运行。
如果希望一个操作的输出,是另一个操作的输入,可以借用Linux系统的管道命令,将两个操作连在一起。
"build-js":"browserify browser/main.js | uglifyjs -mc > static/bundle.js"
或者
"build":"npm run build-js && npm run build-css"
npm run本身有一个参数-s,表示关闭npm本身的输出,只输出脚本产生的结果。
scripts字段的脚本命令,有一些最佳实践,可以方便开发。首先,安装npm-run-all模块。
npm install npm-run-all--save-dev
这个模块用于运行多个scripts脚本命令。
# 继发执行
npm-run-all build:html build:js
# 等同于
npm run build:html&&npm run build:js
# 并行执行
npm-run-all--parallel watch:html watch:js
# 等同于
npm run watch:html & npm run watch:js
# 混合执行
npm-run-all clean lint --parallel watch:html watch:js
# 等同于
npm-run-all clean lint
npm-run-all --parallel watch:html watch:js
# 通配符
npm-run-all --parallel watch:*
pre- 和 post- 脚本
npm run为每条命令提供了pre-和post-两个钩子(hook)。以npm run lint为例,执行这条命令之前,npm会先查看有没有定义prelint和postlint两个钩子,如果有的话,就会先执行npm run prelint,然后执行npm run lint,最后执行npm run postlint。
内部变量
scripts字段可以使用一些内部变量,主要是package.json的各种字段,例如:package.json的内容是{"name":"yeyezaici", "version":"8.8.8"},此时变量npm_package_name就是yeyezaici。再scripts内使用:
{"scripts":{"bundle":"mkdir -p build/$npm_package_name/"}}
npm的通配符的规则如下:
* 匹配0个或多个字符
? 匹配1个字符
[...] 匹配某个范围的字符。如果该范围的第一个字符是!或^,则匹配不在该范围的字符。
!(pattern|pattern|pattern) 匹配任何不符合给定的模式
?(pattern|pattern|pattern) 匹配0个或1个给定的模式
+(pattern|pattern|pattern) 匹配1个或多个给定的模式
*(a|b|c) 匹配0个或多个给定的模式
@(pattern|pat*|pat?erN) 只匹配给定模式之一
** 如果出现在路径部分,表示0个或多个子目录
自动建立符号链接:npm link
场景预设:你开发了一个模块A,目录为src/A,你自己的项目B要用到这个模块,项目目录为src/B。
1)、在模块目录(src/B)下运行npm link命令,这时会在NPM的全局模块目录内,生成一个符号链接文件,该文件的名字就是package.json文件中指定的模块名。
2)、如果我们要让这个模块安装在项目内,还要进行下面的步骤:切换到项目目录,再次运行npm link命令,并指定模块名:npm link A
删除符号链接:npm unlink A
命令显示相对于当前目录:npm bin
在npmjs.com注册一个用户:npm adduser
npm adduser
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: YOUR_EMAIL@domain.com
将当前模块发布到npmjs.com:
1)、先向npmjs.com注册用户:npm adduser
2)、如果已经注册过,直接登录:npm login
3)、发布模块:npm publish
4)、发布bate版本需要打标签,默认版本为latest:npm publish --tag beta
5)、发布私有模块,在初始化的时候需要加入 --scope ,当然只有付费的用户才能创建私有模块:npm init --scope=<yourscope>
6)、ES6转ES5(安装babel):npm install --save-dev babel-cli@6 babel-preset-es2015@6
7)、然后,在package.json里面写入build脚本。
"scripts":{"build":"babel source --presets babel-preset-es2015 --out-dir distribution","prepublish":"npm run build"}
运行上面的脚本,会将source目录里面的ES6源码文件,转为distribution目录里面的ES5源码文件。然后,在项目根目录下面创建两个文件.npmignore和.gitignore,分别写入以下内容。
// .npmignore
source
// .gitignore
node_modules
distribution
废弃某个版本的模块:npm deprecate
npm deprecate my-thing@"< 0.2.3""critical bug fixed in v0.2.3"
管理模块的维护者:npm owner
列出指定模块的维护者:npm owner ls <package_name>
新增维护者:npm owner add <user> <package_name>
删除维护者:npm owner rm <user> <package_name>
其他命令:
打开一个模块的主页:npm home $package
打开一个模块的仓储:npm repo $package
检查当前项目所依赖的模块,是否已经有新版本:npm outdated
检查当前项目的node_modules目录中,是否有package.json里面没有提到的模块,然后将所有这些模块输出在命令行:npm prune
锁定当前项目的依赖模块的版本:npm shrinkwrap
运行该命令后,会在当前项目的根目录下生成一个npm-shrinkwrap.json文件,内容是node_modules目录下所有已经安装的模块,以及它们的精确版本。
下次运行npm install命令时,npm发现当前目录下有npm-shrinkwrap.json文件,就会只安装里面提到的模块,且版本也会保持一致。