前端学习笔记(十)-npm学习

357 阅读6分钟


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>
  1. npm install 会在当前目录(所以叫本地包)上创建一个叫做 "node_modules" 的文件夹,然后安装的包会在这个文件夹里面。
  2. 如果后面不加 @<version> 且当前目录没有 package.json 文件(或者有文件但是没有指定)的话,会安装最新版本的包。

3.1.2 使用 package.json

package.json 可以控制安装的包的版本。

  1. 使用 npm init 创建一个 package.json 文件,会让你输入一些信息。

  2. 如果不想手动输入,使用 npm init --yes 或者 npm init -y,自动按照当前环境生成信息。

  3. 可以设置一些每次都基本相同的信息,比如这三个:

     npm set init.author.email "zhangsan@fawaikuangtu.com"
     npm set init.author.name "张三"
     npm set init.license "MIT"    
    

    以后 package.json 生成的时候,这些信息就不用再输入了(无论手动或自动)~

  4. 在生成了初始 package.js 后,可以手动添加包依赖的版本,这两个包分别叫 dependenciesdevDependencies,前者是发布版本的包依赖,后者是开发版本多加的包依赖。写法如下:

     {
     	"dependencies": {
     		"依赖包1""1.2.5",
     		"依赖包2": "2.3.0",
     		...
     	},
     	"devDependencies": {
     		"依赖包3": "6.2.6",
     		...
     	}
     }
    

    版本号声明不只是确定的,还可以模糊输入,具体 google。

  5. 当在 package.json 中写完包后,可以使用 npm install(不加包名) 直接安装所有的在被声明的包,如果只想安装某个版本的,可以用 npm install --dependencies 或者 npm install devDependencies

  6. 如果不想先写在 package.json 中,而是直接用 npm install <packageName>@<version> 安装,会自动写到 dependencies 属性里(npm5后的特性)。但是如果想换成 devDependencies ,要在后面加 --save-dev 参数 npm install <packageName> --save-dev

3.2 更新本地包

  1. 在 package.json 所在目录中执行 npm update,更新所有的包到最新版本(但不会超过 package.json 指定的版本)。
  2. 运行 npm outdated 会显示所有的包是否达到最新版本(非指定的版本,是真的最新)。
  3. 当然,以上两个命令都可以后面接 <packageName> 参数,仅升级某个包。

3.3 删除本地包

  1. 不用说,自然是 npm uninstall <packageName>
    (npm5 之后的版本会自动删除在 package.json 里的内容,无论是发布还是开发版本。)
  2. 如果是 npm5 之前的版本,则后加 --save 或者 --save-dev
  3. 删除命令后必须接包名 <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 发布一个简单的包

  1. 首先新建一个文件夹,文件夹名就用你准备发布的包的名字(这样等下 npm init 会自动选取文件夹名当做包名)。取名规则已经一些其他的属性含义可以查看这篇文章

    • 推荐使用作用域(scope)命名。(注意划分了作用域的包默认是私有(private)的,之后发布的时候需要加上 --access=public 参数来让其变为公有(public))
    • 包名必须全小写。
    • 这些都是为了防止误植(安装了相似名字的别的包)。
  2. 然后创建一个名字叫 index.js 的文件作为入口模块。可以在 package.json 的 main 属性中看到。

  3. index.js 中使用 exports 导出,如下。

     exports.printMsg = () =>{
         console.log("我的第一个包的第一个函数打印的第一个信息");
     }
    
  4. 可以包含一个 readme.md 文件,作为包的详细介绍。

  5. npm login 登录,可以用 npm whoami 查看是否登录成功。

  6. 发布包。

    • 如果是 unscoped 或者 scoped 但是 private 的包,使用 npm publish
    • 如果是 scoped 且 public 的包,使用 npm publish --access=public。 (注:npm init 会生成一个 ISC 许可证,不知道为什么我改成 MIT 后才能发布
      (也许是因为我写了作者名字?)
  7. 测试刚创建的包。npm install @xxx/xxxxxx。名字太难拼的话可以在你的 npm 个人账户里找到 package 页面,可以一键复制安装包的代码。

  8. 测试一下包的使用。

4.2 更新包

  1. 使用 npm version <update_type>
    • 注意 version 是命令不是参数,就是 version 这个单词。
    • <update_type> 为 patch, minor, major 之一。分别对应三个跨度。
    • 即使只是想改个 readme.md 也要通过更新版本才能改。
    • minor 和 major 会自动清空下一级为 0.
  2. 也可以直接在 package.json 里改版本号。
  3. 改完版本号后使用 npm publish 发布,方法和之前一致。
    (注:npm 网站要稍微等一会儿才会完全刷新为新版本)

4.3 语义化版本发布

用来区分 latest 版和 beta 版的。见这篇文章

账户设置

通过 cli 设置账户信息。不过这一切都可以直接在官网的账户上设置就是了。

  1. 可以通过 npm profile get (注意是 get)查看所有设置,有时候会突然卡很久,可以试着中断重来。
  2. 通过 npm profile set <prop> <value> 设置属性。