NPM笔记

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文件,就会只安装里面提到的模块,且版本也会保持一致。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268