hydrogen 这个主题的行内代码风格我喜欢。
今天学习 npm。
学习材料是 npm 中文文档。
1.模块
在学习 npm 前,先得了解模块。
所以我看完红宝书模块章节回来了。
2. npm 下载
要下载 npm 必须先下载 node.js,即使 npm 已经不只是用于 node.js 了。
- 可以通过官网下载 node.js 安装器
- 也可以通过 NVM 下载。安装后会自动整合到环境变量中。 推荐后者,可以解决很多版本,权限问题。可以同时管理多个版本的 npm 和 node.js,以便在不同版本上测试。
3. 基本用法
3.1 安装本地包
3.1.1 安装命令
npm install <packageName>
或者
npm install <packageName>@<version>
- npm install 会在当前目录(所以叫本地包)上创建一个叫做 "node_modules" 的文件夹,然后安装的包会在这个文件夹里面。
- 如果后面不加
@<version>且当前目录没有package.json文件(或者有文件但是没有指定)的话,会安装最新版本的包。
3.1.2 使用 package.json
package.json 可以控制安装的包的版本。
-
使用
npm init创建一个 package.json 文件,会让你输入一些信息。 -
如果不想手动输入,使用
npm init --yes或者npm init -y,自动按照当前环境生成信息。 -
可以设置一些每次都基本相同的信息,比如这三个:
npm set init.author.email "zhangsan@fawaikuangtu.com" npm set init.author.name "张三" npm set init.license "MIT"以后 package.json 生成的时候,这些信息就不用再输入了(无论手动或自动)~
-
在生成了初始 package.js 后,可以手动添加包依赖的版本,这两个包分别叫
dependencies和devDependencies,前者是发布版本的包依赖,后者是开发版本多加的包依赖。写法如下:{ "dependencies": { "依赖包1":"1.2.5", "依赖包2": "2.3.0", ... }, "devDependencies": { "依赖包3": "6.2.6", ... } }版本号声明不只是确定的,还可以模糊输入,具体 google。
-
当在 package.json 中写完包后,可以使用
npm install(不加包名) 直接安装所有的在被声明的包,如果只想安装某个版本的,可以用npm install --dependencies或者npm install devDependencies。 -
如果不想先写在 package.json 中,而是直接用
npm install <packageName>@<version>安装,会自动写到dependencies属性里(npm5后的特性)。但是如果想换成devDependencies,要在后面加--save-dev参数npm install <packageName> --save-dev。
3.2 更新本地包
- 在 package.json 所在目录中执行
npm update,更新所有的包到最新版本(但不会超过 package.json 指定的版本)。 - 运行
npm outdated会显示所有的包是否达到最新版本(非指定的版本,是真的最新)。 - 当然,以上两个命令都可以后面接
<packageName>参数,仅升级某个包。
3.3 删除本地包
- 不用说,自然是
npm uninstall <packageName>。
(npm5 之后的版本会自动删除在 package.json 里的内容,无论是发布还是开发版本。) - 如果是 npm5 之前的版本,则后加
--save或者--save-dev。 - 删除命令后必须接包名
<packageName>,无法一次删除所有的包。
3.4 全局包
3.4.1 全局包安装
以上介绍的是本地包,如果你不想安装到本地目录,而是所有目录都可以用这个包,则用全局安装。
全局安装并不推荐,因为所有项目共用同一个版本,而有些包会破坏其他包的兼容性。
npm install -g <packageName>
3.4.2 全局包更新
本地包更新命令多加个 -g 参数而已
npm update -g <packageName> // 单个包更新
npm update -g // 所有包更新
npm outdated -g --depth=0 // 查看全局有哪些包需要更新
注意 oudated 后面有个 --depth=0 参数,这表示只关注第 0 层的模块,因为有些包内部还有一大堆依赖的模块。这个参数在 npm list -g --depth=0 时也可以用。
3.4.3 全局包删除
没什么好说的,本地包删除命令加个 -g 而已。
4. 发布包
node 模块和包的区别在此。
- 比较明显的区别是,模块可以没有 package.json,包必须有 package.json。可以在 node_modules 里看到每个包自身也有 package.json。
- 以及不要误解包是发布后的,包可以不发布,具体见上面的网址。
- 如果一个模块里面含有 package.json,那么可以说这是一个包。
4.1 发布一个简单的包
-
首先新建一个文件夹,文件夹名就用你准备发布的包的名字(这样等下 npm init 会自动选取文件夹名当做包名)。取名规则已经一些其他的属性含义可以查看这篇文章。
- 推荐使用作用域(scope)命名。(注意划分了作用域的包默认是私有(private)的,之后发布的时候需要加上
--access=public参数来让其变为公有(public)) - 包名必须全小写。
- 这些都是为了防止误植(安装了相似名字的别的包)。
- 推荐使用作用域(scope)命名。(注意划分了作用域的包默认是私有(private)的,之后发布的时候需要加上
-
然后创建一个名字叫
index.js的文件作为入口模块。可以在 package.json 的main属性中看到。 -
在
index.js中使用 exports 导出,如下。exports.printMsg = () =>{ console.log("我的第一个包的第一个函数打印的第一个信息"); } -
可以包含一个 readme.md 文件,作为包的详细介绍。
-
用
npm login登录,可以用npm whoami查看是否登录成功。 -
发布包。
- 如果是 unscoped 或者 scoped 但是 private 的包,使用
npm publish。 - 如果是 scoped 且 public 的包,使用
npm publish --access=public。 (注:npm init 会生成一个 ISC 许可证,不知道为什么我改成 MIT 后才能发布)
(也许是因为我写了作者名字?)
- 如果是 unscoped 或者 scoped 但是 private 的包,使用
-
测试刚创建的包。
npm install @xxx/xxxxxx。名字太难拼的话可以在你的 npm 个人账户里找到 package 页面,可以一键复制安装包的代码。 -
测试一下包的使用。
4.2 更新包
- 使用
npm version <update_type>。- 注意
version是命令不是参数,就是 version 这个单词。 <update_type>为 patch, minor, major 之一。分别对应三个跨度。- 即使只是想改个 readme.md 也要通过更新版本才能改。
- minor 和 major 会自动清空下一级为 0.
- 注意
- 也可以直接在 package.json 里改版本号。
- 改完版本号后使用
npm publish发布,方法和之前一致。
(注:npm 网站要稍微等一会儿才会完全刷新为新版本)
4.3 语义化版本发布
用来区分 latest 版和 beta 版的。见这篇文章。
账户设置
通过 cli 设置账户信息。不过这一切都可以直接在官网的账户上设置就是了。
- 可以通过
npm profile get(注意是 get)查看所有设置,有时候会突然卡很久,可以试着中断重来。 - 通过
npm profile set <prop> <value>设置属性。