npm
npm 是包管理工具
npm config list
可以查看 npm 配置。
比如有一个 registry 属性,标识C盘用户目录下 .npmrc 里有一个 registry 属性,可以用于配置 npm 源
全局安装
全局安装的意思很简单,就是安装的模块会被安装到全局下。是只能在命令行中使用的包。
npm root -g
可以查看 npm -g 的全局安装目录,比如 npm i http-server -g
,如果已经安装过一次,会报错说本地已存在,需要覆盖的话加上 –force,npm i http-server -g --force
。
为什么 npm -g 的包可以全局使用,举个例子 npm i http-server -g
其实只是在 **/user/local/bin
(C:\User\test1\AppData\Roaming\npm\hs 和C:\User\test1\AppData\Roaming\npm\http-server
)目录下作了个链接到 /usr/local/lib/node_modules/http-server/bin/http-server
(C:\User\test1\AppData\Roaming\npm\node_modules\http-server\bin\http-server
)这个文件,当我们执行 http-server 或 hs 这个命令时,会去找目录下的 .cmd 文件,之后 .cmd 会调用这个链接的文件,而这个文件的开头,会标识出这个文件是用什么来执行的(#!/usr/bin/env node
表示用环境变量里的 node 来执行这个文件,前面是固定的,不管是 mac 还是 windows,如果不标识,将会当作 txt 文件打开。)
如果能直接在命令行里输入 hs 后能够执行命令,可以发现系统或用户的环境变量 PATH 里会有 C:\User\test1\AppData\Roaming\npm
这样的路径,cmd 里直接输入 path,可以查看所有的环境变量。
npm init
包的初始化,生成一个 package.json 文件,值得一提的是,”main”: “xxx.js” 字段是 node 会默认调用的文件,webpack 默认会调用 “module” (es6 模块用)
npm link
临时指令,在开发时,可以将我们的包临时放到全局下,方便调试。后续可以将包发到 npm 上,通过 -g 下载。仅仅能在命令行中使用,做一些工具。
在我们为 package.json 加入 “bin”: “xxx.js” 的属性后,可以使用 npm link 将当前目录做一个软链到 C:\User\test1\AppData\Roaming\npm
,然后就会在这个目录下新建一个当前 package,json 里 name 属性一样名字(比如 dl)的 .cmd 文件,指向 C:\User\test1\AppData\Roaming\npm\node_modules\dl\xxx.js
,而这个 C:\User\test1\AppData\Roaming\npm\node_modules\dl
是当前项目目录的一份拷贝(C:\User\test1\AppData\Roaming\npm\node_modules\dl
会指向当前目录),每次修改了当前目录的文件之后,如果想要更新全局指令,需要重新 npm link,当然这时候会出现重复,需要 –force。
最后结果是 C:\User\test1\AppData\Roaming\npm\dl
(这是一个文件) 指向 C:\User\test1\AppData\Roaming\npm\node_modules\dl\xxx.js
,接着 C:\User\test1\AppData\Roaming\npm\node_modules\dl
指向当前项目目录。
bin 属性如果想写多个,可以写成对象形式
1 | { |
依赖
devDependencies 开发依赖
dependencies 项目依赖
peerDepencies 同版本依赖,
optionsalDependencies(很少用,表示可选包,下不下都行。。好像没啥用)
bundleDependencies(npm pack 压缩成 .tgz 时用的,会把这里的包一起打包进去)
npm 安装包
npm i xxx -D 开发依赖,仅在开发时使用,比如 gulp(打包 css),安装到”devDependencies”。
npm i xxx -S 项目依赖,开发上线都需要,比如 react、vue,安装到 “dependencies”。
npm 特点是会将包拍平,当我们安装了 a 和 b 两个包,a 中依赖了 c 包,b 中也依赖了 c 包,此时由于 npm 已经把包拍平,所以会共用同一个 c 包,只安装一次。但是,如果 a 包和 b 包中的 c 包版本不同,就不会拍平了,就都会安装各自模块目录里去。
比如,当前项目下使用 -S 安装了 jquery,又在 package.json 的 “peerDependencies” 中有 “bootstrap”: “^3.0.0” 属性。
由于 jq 也依赖 bootstrap,在 npm i 的时候,很有可能会出现警告
1 | npm WRAN [email protected] requires a peer of bootstrap@^3.0.0 but none is installed. You must install peer dependencies youerself. |
就表示需要一个 3.0.0 的依赖,但是没装,可能会出现问题。
npm pack
会用当前目录打出一个 .tgz 的包,可以上传到服务器上