node · 2019-12-14 0

node自定义包、npm和yarn的使用

一、node包

JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成,为了便于管理和使用,把由多个子模块组成的叫做包。

组成一个包的所有模块中,需要一个入口模块,入口模块的导出对象被作为包的导出对象。入口模块在package.json中指定。

二、CommonJS规范的包

完全符合CommonJS规范的包应该包含如下这些文件:

  1. package.json 包描述文件
  2. bin 用于存放可执行的二进制文件的目录
  3. lib 用于存放JavaScript代码的目录
  4. doc 用于存放文档的目录
  5. test 用于存放单元测试用例的代码

NodeJS对包要求没有那么严格,只要顶层目录下有package.json,并符合基本规范即可

三、package.json

  • name:包的名称,必须是唯一
  • main: 指定了程序的主入口文件
  • version:符合语义化版本识别规范的版本字符串
  • description:包的简要说明
  • keywords:关键字数据,通常用于搜索
  • maintainers:维护者数组,每个元素要包含name、email、web可选字段
  • contributors:贡献者数组,格式与maintainers相同。包的坐着应该是贡献者数据的第一个元素
  • bugs:提交bug的地址,可以是网址或者电子邮件地址
  • licenses:许可证数组,每个元素要包含type和url字段
  • repositories:仓库托管地址数组,每个元素要包含type、url和path字段
  • dependencies:包的依赖,一个关联数组,由包名称和版本号组成。
  • devDependencies:开发依赖项,表示一个包在开发期间用到的依赖项

注意:

pacakge.json文件必须包含如下三个属性:name,version,main

如果package.json或main字段不存在,则会尝试在包的顶级目录寻找index.js作为包的接口。

四、自定义包

目录结构:

zxm@zxm-pc:~/IdeaProjects$ tree jstest/
jstest/
├── calc
│   ├── bin
│   ├── doc
│   ├── lib
│   │   ├── add.js
│   │   ├── main.js
│   │   └── sub.js
│   ├── package.json
│   ├── README.md
│   └── test
└── calctest.js

add.js

function add(a, b) {
    return a + b;
}
module.exports = add;

sub.js

function sub(a, b) {
    return a - b;
}
module.exports = sub;

main.js

const add = require('./add');
const sub = require('./sub');

module.exports = {
    add,
    sub
}

package.json

{
  "name": "calc",
  "main": "./lib/main.js"
}

五、使用自定义包

calctest.js

const calc = require('./calc');
console.log(calc.add(1,2));

结果:

使用node运行js代码

zxm@zxm-pc:~/IdeaProjects/jstest$ node calctest.js 
3

六、npm的使用

npm是随NodeJS一起安装的包管理工具

1.查看npm版本

npm -v

2.初始化包

npm init 创建包,package.json文件是必不可少的,我们可以使用npm init生成package.json文件

npm init -y 快速创建包

生成的 package.json 如下:

{
  "name": "calc",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

3.安装包

  • npm install:安装 package.json 指定的所有依赖
  • npm install <package>:本地安装,将安装包放在 ./node_modules 下(运行 npm 命令所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录,可以通过 require() 来引入本地安装的包
  • npm install <package> --save 安装到生产依赖,会把依赖包名称添加到 package.json 文件 dependencies
  • npm install <package> --save-dev 安装到开发依赖,会把依赖包名称添加到 package.json 文件 devDependencies
  • npm install <package>@<version> 下载指定版本的包
  • npm install <package> -g 全局安装安装,将安装包放在 node 的安装目录的lib下的 node_modules 下
  • npm install <package> --registry=<registry-url> 指定仓库

4.查看包安装信息

  • npm list -g 查看所有全部安装的包
  • npm list <package> 查看某个包的版本号

5.卸载包

npm uninstall <package> 卸载包

6.更新包

npm update <package> 更新包

7.清空NPM本地缓存

npm cache clear 可以清空NPM本地缓存

8.执行脚本

npm run <scriptname> 执行 pacakge.json 配置的 scripts 对象,如:npm startnpm run test

9.package.json 与 package-lock.json

当执行 npm install 的时候,node 会先从 package.json 文件中读取所有 dependencies 的信息,然后根据 dependencies 的信息与 node_modules 中的模块进行对比,没有的直接下载,node 是从 package.json 文件读取模块名称,从 package-lock.json 文件中获取版本号,然后进行下载或者更新

例如对于jquery的依赖:

package.json

  "dependencies": {
    "jquery": "^3.4.1"
  }

package-lock.json

  "dependencies": {
    "jquery": {
      "version": "3.4.1",
      "resolved": "https://registry.npm.taobao.org/jquery/download/jquery-3.4.1.tgz",
      "integrity": "sha1-cU8fjZ3eS9+lV2S6N+8hRjDYDvI="
    }
  }

yarn.lock

jquery@^3.4.1:
  version "3.4.1"
  resolved "https://registry.npm.taobao.org/jquery/download/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
  integrity sha1-cU8fjZ3eS9+lV2S6N+8hRjDYDvI=

使用 npm 安装包会有 package-lock.json

package.json 的 jquery 版本^是定义向后(新)兼容依赖,如果 jquery 版本超过 3.4.1,大版本上(3)上相同,就允许下载最新的包,package.json 只能锁定大版本,即版本号的第一位,不能锁定后面的小版本。

package-lock.json 就是锁定具体版本号,使得 jquery 版本不会自动下载升级,如果要升级 package-lock.json 里面的包,npm install <package>@<version>

使用 yarn 安装包会有 yarn.lock

yarn.lock 与 package-lock.json 都是用来锁定版本号

10.npm install 与 npm ci

  • npm ci 它代表“NPM Clean Install”(NPM 清洁安装),它用于从 package-lock.json 文件中安装软件包。
  • 项目必须有 package-lock.json 或 npm-shrinkwrap.json,否则无法使用npm ci。
  • 如果 package-lock.json 中的依赖项与 package.json 中的依赖项不匹配,则 npm ci 将退出并显示错误,
  • 在安装软件包之前,npm ci 会删除 node_modules 目录,并从头开始安装依赖项。这有助于确保没有来自先前安装的过时依赖项。
  • npm ci不会更改package.json和package-lock.json。
  • npm ci 比 npm install 快两倍。

七、yarn的使用

npm 安装包是顺序进行的,而 yarn 安装包的并行的;yarn 安装有缓存,会直接从自己的缓存中拿到包。

npm install yarn -g 安装yarn

1.查看版本

npm init

yarn init

2.安装包

npm install

yarnyarn install

npm install <package> --save

yarn add <package>

npm install <package> --save-dev

yarn add <package> --dev

3.移除包

npm uninstall <package>

yarn remove <package>

4.更新包

npm update <package>

yarn upgrade <package>

5.执行脚本

npm run <scriptname>

yarn run <scriptname>

八、设置镜像的地址

npm config get registry 查看当前npm源

yarn config get registry 查看当前yarn源

npm config set registry <url> npm设置镜像地址

yarn config set registry <url> yarn 设置镜像地址

npm config delete registry npm 删除镜像地址

yarn config delete registry yarn 删除镜像地址

npm install <package> --registry=<registry-url> 指定仓库

使用淘宝镜像源加速

最新的: npm config set registry https://registry.npmmirror.comyarn config set registry https://registry.npmmirror.com

之前的: npm config set registry https://registry.npm.taobao.orgyarn config set registry https://registry.npm.taobao.org

npm 官方源:npm config set registry https://registry.npmjs.org
yarn 官方源:yarn config set registry https://registry.yarnpkg.com