引入:CommonJs
node应用由模块组成,CommonJS是模块化的标准。模块可分为:
- 核心模块:node 提供的,可直接引入。(如HTTP模块、URL模块、Fs模块)
- 自定义模块:自己写的,通过本地引入
- 第三方模块:别人发布的,通过npm安装
下面主要讲的是第三方模块:
一 npm管理包
1.1 安装依赖
1.1.1 安装所有依赖
如果项目具有 package.json 文件,则通过运行下面命令安装项目所依赖的包
npm i
npm install
1.1.2 安装单个依赖
-
依赖:软件包会被列在 package.json 文件中的
dependencies
(与生产环境中的应用程序相关)npm install <package-name> npm install --save <package-name>
-
开发依赖:软件包会被列在
devDependencies
(仅用于开发的程序包,在生产环境中并不需要。 例如测试的软件包、webpack 或 Babel。)npm install -D <package-name> npm install --save-dev <package-name>
1.1.3 全局与局部安装
-
本地安装
软件包会被安装到当前文件树中的 node_modules 子文件夹下。在这种情况下,npm 还会在当前文件夹中存在的 package.json 文件的 dependencies 属性中添加 vue条目。
npm install vue
-
全局安装
在这种情况下,npm 不会将软件包安装到本地文件夹下,而是使用全局的位置。
npm root -g
命令会告知其在计算机上的确切位置。npm install -g vue
通常,所有的软件包都应本地安装。这样可以确保计算机中可以有数十个应用程序,并且如果需要,每个应用程序都可以运行不同的版本。更新全局软件包会使所有的项目都使用新的版本,这可能会导致维护方面的噩梦,因为某些软件包可能会破坏与其他依赖项的兼容性等。
当程序包提供了可从 shell(CLI)运行的可执行命令、且可在项目间复用时,则该程序包应被全局安装。一些流行的全局软件包的示例有:
npm
create-react-app
vue-cli
grunt-cli
mocha
react-native-cli
gatsby-cli
forever
nodemon
1.2 版本说明
1.2.1 介绍
所有的版本都有 3 个数字:x.y.z
- 第一个数字是主版本。
- 第二个数字是次版本。
- 第三个数字是补丁版本。
1.2.2 发布规则
当发布新的版本时,要遵循以下规则:
- 当进行不兼容的 API 更改时,则升级主版本。
- 当以向后兼容的方式添加功能时,则升级次版本。
- 当进行向后兼容的缺陷修复时,则升级补丁版本。
1.2.3 更新版本
-
更新所有
npm update
不会更新大版本,比如本地的是1.3.1,那么更新时只会更新到1.3.2或1.4.0
-
指定单个
npm update <package-name>
-
查看过期版本
npm outdated
1.2.4 更新版本控制
npm
设置了一些规则,可用于在 package.json
文件中选择要将软件包更新到的版本(当运行 npm update
时)。规则使用了这些符号:
^
: 第一位版本号不变,后两位最新~
: 前两位不变,最后一位最新>
: 接受高于指定版本的任何版本。>=
: 接受等于或高于指定版本的任何版本。<=
: 接受等于或低于指定版本的任何版本。<
: 接受低于指定版本的任何版本。=
: 接受确切的版本。- ```: 接受一定范围的版本。例如:2.1.0 - 2.6.2`。
||
: 组合集合。例如< 2.1 || > 2.6
。
1.2.5 安装指定版本
npm install <package>@<version>
npm install cowsay //安装最近版本
npm install cowsay@1.2.0 //安装1.2.0 版本
npm install -g webpack@4.16.4
1.2.6 查看安装版本
npm list
npm list --depth=0 //查看顶层软件包
npm list -g //查看全局安装的软件包
npm list cowsay //通过指定名称来获取特定软件包的版本
npm view cowsay version //查看软件包在 npm 仓库上最新的可用版本
npm view cowsay versions //查看软件包所有的旧版本
1.3 卸载软件包
npm uninstall <package-name>
npm uninstall -S <package-name> //会移除 package.json 文件中的引用
npm uninstall --save <package-name> //会移除 package.json 文件中的引用
npm uninstall -D <package-name> //移除开发依赖项(列出在 package.json 文件的 devDependencies 中)
npm uninstall -g <package-name> //移除全局安装的包
npm uninstall --global <package-name> //移除全局安装的包
1.4 使用包
npm install vue
const _ = require('vue')
require和import的区别:
- require是运行时调用,理论上可以运行在代码的任何地方;import是编译时调用,必须放在文件开头
- require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量;import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
二 pakage.json
package.json 是项目的清单。例如,它是用于工具的配置中心。 它也是 npm 和 yarn 存储所有已安装软件包的名称和版本的地方。通过下面的命令可对项目进行初始化:
npm init
package.json 文件中的内容没有固定的要求。 唯一的要求是必须遵守 JSON 格式,否则,尝试以编程的方式访问其属性的程序则无法读取它。
{
"name": "test-project",
"version": "1.0.0",
"description": "A Vue.js project",
"main": "src/main.js",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
},
"dependencies": {
"vue": "^2.5.2"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "^8.2.1",
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
}
version
表明了当前的版本。name
设置了应用程序/软件包的名称。description
是应用程序/软件包的简短描述。main
设置了应用程序的入口点。private
如果设置为true
,则可以防止应用程序/软件包被意外地发布到npm
。scripts
定义了一组可以运行的 node 脚本。dependencies
设置了作为依赖安装的npm
软件包的列表。devDependencies
设置了作为开发依赖安装的npm
软件包的列表。engines
设置了此软件包/应用程序在哪个版本的 Node.js 上运行。browserslist
用于告知要支持哪些浏览器(及其版本)。
三 package-lock.json
该文件旨在跟踪被安装的每个软件包的确切版本。当运行 npm install
时,npm 会使用这些确切的版本。
package-lock.json
文件需要被提交到 Git 仓库,以便被其他人获取。当运行 npm update
时,package-lock.json
文件中的依赖的版本会被更新。
下面是一个示例:
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.
0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"cowsay": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz"
,
"integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkM
Ajufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==",
"requires": {
"get-stdin": "^5.0.1",
"optimist": "~0.6.1",
"string-width": "~2.1.1",
"strip-eof": "^1.0.0"
}
},
"get-stdin": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.
1.tgz",
"integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/
is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
},
"minimist": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10
.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
},
"optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
"requires": {
"minimist": "~0.0.1",
"wordwrap": "~0.0.2"
}
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
}
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "^3.0.0"
}
},
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
},
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
}
}
}
安装 cowsay
,其依赖于:
get-stdin
optimist
string-width
strip-eof
这些软件包还需要其他软件包,正如从 require
属性可以看到的:
ansi-regex
is-fullwidth-code-point
minimist
wordwrap
strip-eof
每个都有 version 字段、指向软件包位置的 resolved 字段、以及用于校验软件包的 integrity 字符串。