Node.js
- Node.js 是一个开源与跨平台的 JavaScript 运行时环境。
- Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。
- Node.js 应用程序运行于单个进程中,无需为每个请求创建新的线程。 Node.js 在其标准库中提供了一组异步的 I/O 原生功能(用以防止 JavaScript 代码被阻塞),并且 Node.js 中的库通常是使用非阻塞的范式编写的(从而使阻塞行为成为例外而不是规范)。
- 当 Node.js 执行 I/O 操作时(例如从网络读取、访问数据库或文件系统),Node.js 会在响应返回时恢复操作,而不是阻塞线程并浪费 CPU 循环等待。
这使 Node.js 可以在一台服务器上处理数千个并发连接,而无需引入管理线程并发的负担(这可能是重大 bug 的来源)。
node
node.js作为服务器适合用于中小型项目开发
- 并发性高
- 基于node可以写mock假接口
Node.js 和浏览器的区别
- 构建运行于浏览器中的应用程序与构建 Node.js 应用程序完全不同。
- 尽管都是 JavaScript,但一些关键的差异使体验相当不同。
- 从广泛使用 JavaScript 的前端开发者的角度来看,Node.js 应用程序具有巨大的优势:使用单一语言轻松编程所有一切(前端和后端)。
- 在浏览器中,大多数时候做的是与 DOM 或其 他 Web 平台 API(例如 Cookies)进行交互。
- 当然,那些在 Node.js 中是不存在的。 没有浏览器提供的 document、window、以及所有其他的对象。
- 而且在浏览器中,不存在 Node.js 通过其模块提供的所有不错的 API,例如文件系统访问功能。
- 由于 JavaScript 发展的速度非常快,但是浏览器发展得慢一些,并且用户的升级速度也慢一些,因此有时在 web 上,不得不使用较旧的 JavaScript / ECMAScript 版本。
- 可以使用 Babel 将代码转换为与 ES5 兼容的代码,再交付给浏览器;
- 但是在 Node.js 中,则不需要这样做。
- Node.js 使用 CommonJs 模块系统,而在浏览器中,则还正在实现 ES 模块标准
- 在实践中,意味着 Node.js 中使用 require(); 浏览器中则使用 import。
各大浏览器的 javascript 引擎
- Google Chrome : V8
- Firefox : SpiderMonkey
- Safari : JavaScriptCore (Nitro)
- Edge : Chakra
V8 引擎
- V8 使用 C++编写,并且不断被改进,他是可移植的,并且可以运行于 Mac、Windows、Linux 和其他一些系统
- JavaScript 是由 V8 在其内部编译的,使用了即时(JIT)编译以加快执行速度。
Node.js 的使用
- 在命令行运行:node app.js (当运行命令时,请确保位于包含 app.js 文件的目录中。)
- 如何从 Node.js 程序退出??
- 当在控制台中运行程序时,可以使用 ctrl-C 将其关闭
- 以编程的方式退出。
- process 核心模块提供了一种便利的方法,可以以编程的方式退出 Node.js 程序:process.exit()。(可以传入一个整数,向操作系统发送退出码)
- 可以设置 process.exitCode 属性:
- 这意味着任何待处理的回调、仍在发送中的任何网络请求、任何文件系统访问、或正在写入 stdout 或 stderr 的进程,所有这些都会被立即非正常地终止。
- process 核心模块提供了一种便利的方法,可以以编程的方式退出 Node.js 程序:process.exit()。(可以传入一个整数,向操作系统发送退出码)
- 使用 Node.js 启动服务器,例如 HTTP 服务器:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('你好')
})
const server = app.listen(3000, () => console.log('服务器已就绪'))
process.on('SIGTERM', () => {
server.close(() => {
console.log('进程已终止')
})
})
一、如何从 Node.js 读取环境变量
- Node.js 的 process 核心模块提供了 env 属性,该属性承载了在启动进程时设置的所有环境变量
- 访问 NODE_ENV 环境变量的示例,该环境变量默认情况下被设置 dr 为 development。
- process.env.NODE_ENV // “development
- 在脚本运行之前,将其设置为”production”,则可告诉 Node.js 这是生产环境。
二、如何使用 Node.js REPL??
- 1、node 命令是用来运行 Node.js 脚本的命令
- 2、REPL 称为运行评估打印循环,是一种编程语言环境(主要时控制台窗口),它使用单个表达式作为用户输入,并在执行后将结果返回到控制台
- REPL 是交互式的
- 在编写代码时,如果按下 tab 键,则 REPL 会尝试自动补全所写的内容,以匹配已定义或预定义的变量。
- 3、探索 JavaScript 对象
- 输入 JavaScript 类的名称,例如 Number,添加一个点号并按下 tab;
- 4、探索全局对象
- 通过输入 global. 并按下 tab,可以检查可以访问的全局变量。
- 5、_ 特殊变量
- 如果在某些代码之后输入_,则会打印最后一次操作的结果
- 6、. 命令
- .help : 显示点命令的帮助
- .editor : 启用编辑器模式,可以轻松编写多行 jacascript 代码。在此模式下,ctrl-D 可以运行这段代码
- .break : 当输入多行的表达式时,输入 .break 命令可以中止进一步的输入,相当于按下 ctrl-C。
- .clear : 将 REOL 上下文重置为空对象,并清除当前正在输入任何多行的表达式
- .load : 加载 javascript 文件(相当于档期那工作目录)
- .save : 将在 REPL 会话中输入的所有内容保存到指定文件
- .exit : 退出 REPL(相当于按下两次 ctrl-C)
三、Node.js 从命令行接受参数
- 参数可以是独立的,也可以具有键和值。
- node app.js joe
- node app.js name=joe
- 获取参数的方式:Node.js 中内置的 process 对象,它公开了 argv 属性,包含所有命令行调用参数的数组
- 第一个参数:node 命令的完整路径
- 第二个参数:正在被执行的文件的完整的路径
- 所有的其他参数从第三个位置开始
四、使用 Node.js 输出到命令行
- 1、使用控制台模块的基本输出
- console.log(x, y)
- 也可以通过传入变量和格式说明符 来格式化用语
- %s : 格式化变量为字符串
- %d : 格式化变量为数字
- %i : 格式化变量为其整数部分
- %o : 格式化变量为对象
- console.log(‘我的%s 已经%d 岁’, ‘猫’, 2); // 我的猫已经 2 岁
- console.log(‘%o’,Number); // [Function: Number] { … }
- 2、清除控制台
- console.clear() 会清除控制台(其行为可能取决于所使用的控制台)
- 3、元素计数
- count 方法会对打印的字符串的次数进行计数,并在其旁边打印计数
- console.count(10); // 10 : 1 1 是在控制台打印 10 的次数
- 4、打印堆栈踪迹
- console.trace()
5、计算耗时
- 可以使用 time() 和 timeEnd() 轻松地计算函数运行所需的时间
const doSomething = () => console.log('测试')
const measureDoingSomething = () => {
console.time('doSomething()')
//做点事,并测量所需的时间。
doSomething()
console.timeEnd('doSomething()')
}
measureDoingSomething()
- 可以使用 time() 和 timeEnd() 轻松地计算函数运行所需的时间
6、stdout 和 stderr
- console.log 非常适合在控制台中打印消息。 这就是所谓的标准输出(或称为 stdout)。
- console.error 会打印到 stderr 流,它不会出现在控制台中,但是会出现在错误日志中。
7、为输出着色
- 可以使用转义序列在控制台中为文本的输出着色。 转义序列是一组标识颜色的字符。
- console.log(‘\x1b[33m%s\x1b[0m’, ‘你好’)
- 控制台输出着色的最简单方法是使用库。 Chalk 是一个这样的库,除了为其着色外,它还有助于其他样式的设置(例如使文本变为粗体、斜体或带下划线)
// 可以使用 npm install chalk 进行安装,然后就可以使用它:
const chalk = require('chalk')
console.log(chalk.yellow('你好'))
- 可以使用转义序列在控制台中为文本的输出着色。 转义序列是一组标识颜色的字符。
8、创建进度条
- Progress 是一个很棒的软件包,可在控制台中创建进度条。 使用 npm install progress 进行安装。 ``` // 以下代码段会创建一个 10 步的进度条,每 100 毫秒完成一步。 当进度条结束时,则清除定时器: const ProgressBar = require(‘progress’)
const bar = new ProgressBar(‘:bar’, { total: 10 }) const timer = setInterval(() => { bar.tick() if (bar.complete) { clearInterval(timer) } }, 100)
<a name="8815bf22"></a>
#### 五、在 node.js 中从命令行接收输入
- Node.js 提供了 readline 模块 :
- 可以实现:每次一行地从可读流(例如:process.stdin 流,在 Node.js 程序执行期间该流就是终端输入)获取数据。
const readline = require(‘readline’).createInterface({ input: process.stdin, output: process.stdout })
readline.question(你叫什么名字?
, name => {
console.log(你好 ${name}!
)
readline.close()
})
// question() 方法会显示第一个参数(即问题),并等待用户的输入; 当按下回车键时,则它会调用回调函数。
<a name="f68c9340"></a>
#### 六、使用 exports 从 node.js 文件中公开功能
- Node.js 文件可以导入其他 Node.js 文件公开的功能。
- 例如:const library = require("./library");
- 可以引入当前文件夹中的 library.js 文件中的公开功能
- 在此文件中,必须先公开功能,然后其他文件才能将其导入
- 默认情况下,文件中定义的任何其他对象和变量都是私有的,不会公开到外界
- module 系统提供的 module.exports API
- 当将对象或者函数赋值为新的 exports 属性时,这就是要龚刚开的内容。因此,可以将其导入应用程序 dde 其他部分或者其他应用程序中
- 可以通过两种方式进行操作
- 1、将对象赋值給 module.exports(这是模块系统提供的对象),这会使文件只导出该对象
const car = { brand: ‘Ford’, model: ‘Fiesta’ } module.exports = car //在另一个文件中 const car = require(‘./car’)
- 2、将要到处的对象添加为 exports 的属性。这种方式可以导出多个对象、函数或者数据
// 方式一 const car = { brand: ‘Ford’, model: ‘Fiesta’ } exports.car = car // 方式二 exports.car = { brand: ‘Ford’, model: ‘Fiesta’ } // 另一个文件中引入的方式一 const items = require(‘./items’) items.car // 另一个文件中引入的方式二 const car = require(‘./items’).car
<a name="fe5e4090"></a>
#### 七、npm 包管理简介
- npm 是 node.js 标准的软件包管理器
- Yarn 是 npm 的一个替代选择
<a name="4ea4ab9f"></a>
##### 1、npm 下载依赖包
- 安装所有依赖
- 如果项目具有 package.json 文件,运行 npm install,它会在 node_modules 文件夹(如果尚不存在则会创建)中安装项目所需的所有东西
- 安装单个软件包
- npm install // 安装并添加条目到 package.json 文件的 dependencies。
- npm install --save // 安装并添加条目到 package.json 文件的 dependencies。
- npm install --save-dev // 安装并添加条目到 package.json 文件的 devDependencies。
- 区别:devDependencies 通常是开发的工具(例如测试的库);而 dependencies 则是与生产环境中的应用程序相关。
- 更新软件包
- 检查所有的软件包是否为最新版本并更新 npm update
- 指定单个软件包进行更新 npm update
<a name="655d935a"></a>
##### 2、版本控制
- npm 可以指定软件包的任何特定版本
- 指定库的显式版本还有助于使得每个人都使用相同的软件包版本,以便整个团队运行相同的版本,直至 package.json 文件被更新
<a name="d91d9ae1"></a>
##### 3、运行任务
- package.json 文件支持一种用于指定命令行任务的格式 : npm run
{ “scripts”: { “start-dev”: “node lib/server-development”, “start”: “node lib/server-production” }, } { “scripts”: { “watch”: “webpack —watch —progress —colors —config webpack.conf.js”, “dev”: “webpack —progress —colors —config webpack.conf.js”, “prod”: “NODE_ENV=production webpack -p —config webpack.conf.js”, }, } // 运行的时候如下: // $ npm run watch // $ npm run dev // $ npm run prod
<a name="be4b9a39"></a>
##### 4、npm 将软件包安装到哪里(本地|全局)
- 本地安装
- npm install lodash // lodash 会被安装到当前文件树中的 node_modules 子文件夹中;
- 这种情况下,npm 还会在当前文件夹中存在的 package.json 文件的 dependencies 属性中添加 lodash 条目
- 使用 -g 标志可以执行全局安装
- npm install -g lodash // npm 会把其安装在全局位置
- 全局位置在哪? npm root -g 命令会告知其在计算机上的确切位置
- macOS 或者 Linux 上,此位置可能是 /usr/local/lib/node_modules
- Windows 上,可能是 C:\Users\YOU\AppData\Roaming\npm\node_modules。
- 使用 nvm 管理 node.js,则软件包的位置可能是/Users/joe/.nvm/versions/node/v8.9.0/lib/node_modules
- 如何使用或者执行 npm 安装的软件包?
- 若要在代码中使用它,则只需使用 require 将其导入到程序中:const _ = require("lodash");
- 如果软件包是可执行文件,该怎么办?
- 这种情况,npm 会把可执行文件方法 node_modules/.bin/ 文件夹下
- 可以输入 ./node_modules/.bin/软件包 来运行它
- 最新版本的 npm 中包含的 npx 是更好的选择,只需运行 npx 软件包
<a name="3a7fd692"></a>
##### 5、package.json 指南
- package.json 文件是项目的清单。
- 它是用于工具的配置中心
- 也是 npm 和 yarn 存储所有已安装软件包的名称和版本的地方
- package.json 文件中的内容必须遵循 JSON 格式,否则已编程的方式访问其属性的程序则无法读取它。
<a name="68d96662"></a>
###### 文件结构
{ “name”: “test-project”, // 设置了应用程序/软件包的名称 “author”: “NodeJS中文网 mail@nodejs.cn (http://nodejs.cn)”, “author”: { // 软件包的作者名称 “name”: “NodeJS中文网”, “email”: “mail@nodejs.cn”, “url”: “http://nodejs.cn“ }, “contributors”: [“NodeJS中文网 mail@nodejs.cn (http://nodejs.cn))”], // 除作者外,该项目可以有一个或者多个贡献者,此属性是列出他们的数组 “contributors”: [ { “name”: “NodeJS中文网”, “email”: “mail@nodejs.cn”, “url”: “http://nodejs.cn“ } ], “bugs”: “https://github.com/nodejscn/node-api-cn/issues“, // 链接到软件包的问题跟踪器 “version”: “1.0.0”, // 表明了当前的版本 “description”: “A Vue.js project”, // 应用程序/软件包的简短描述 “main”: “src/main.js”, // 设置了应用程序的入口点;(当在应用程序中导入此软件包时,应用程序会在该位置搜索模块的导出) “homepage”: “http://nodejs.cn“, // 设置软件包的主页 “license”: “MIT”, // 指定软件包的许可证 “keywords”: [ // 此属性包含与软件包功能相关的关键字数组 “email”, “machine learning”, “ai” ], “repository”: “github:nodejscn/node-api-cn”, // 此属性指定了此程序包所在的位置 “repository”: { // 这种写法 可以显示地设置版本控制系统 “type”: “git”, // git/svn “url”: “https://github.com/nodejscn/node-api-cn.git“ }, “private”: true, // 如果设置为true,则可以防止应用程序/软件包被意外的发布到npm “scripts”: { // 定义了一组可以运行的node脚本 “dev”: “webpack-dev-server —inline —progress —config build/webpack.dev.conf.js”, “start”: “npm run dev”, “unit”: “jest —config test/unit/jest.conf.js —coverage”, “test”: “npm run unit”, “lint”: “eslint —ext .js,.vue src test/unit”, “build”: “node build/build.js” }, “dependencies”: { // 设置了作为生产依赖安装的npm软件包的列表 “vue”: “^2.5.2” }, “devDependencies”: { // 设置了作为开发依赖安装的npm软件包的列表 “autoprefixer”: “^7.1.2”, “babel-core”: “^6.22.1”, “babel-eslint”: “^8.2.1”, “babel-helper-vue-jsx-merge-props”: “^2.0.3”, “babel-jest”: “^21.0.2”, “babel-loader”: “^7.1.1”, “babel-plugin-dynamic-import-node”: “^1.2.0”, “babel-plugin-syntax-jsx”: “^6.18.0”, “babel-plugin-transform-es2015-modules-commonjs”: “^6.26.0”, “babel-plugin-transform-runtime”: “^6.22.0”, “babel-plugin-transform-vue-jsx”: “^3.5.0”, “babel-preset-env”: “^1.3.2”, “babel-preset-stage-2”: “^6.22.0”, “chalk”: “^2.0.1”, “copy-webpack-plugin”: “^4.0.1”, “css-loader”: “^0.28.0”, “eslint”: “^4.15.0”, “eslint-config-airbnb-base”: “^11.3.0”, “eslint-friendly-formatter”: “^3.0.0”, “eslint-import-resolver-webpack”: “^0.8.3”, “eslint-loader”: “^1.7.1”, “eslint-plugin-import”: “^2.7.0”, “eslint-plugin-vue”: “^4.0.0”, “extract-text-webpack-plugin”: “^3.0.0”, “file-loader”: “^1.1.4”, “friendly-errors-webpack-plugin”: “^1.6.1”, “html-webpack-plugin”: “^2.30.1”, “jest”: “^22.0.4”, “jest-serializer-vue”: “^0.3.0”, “node-notifier”: “^5.1.2”, “optimize-css-assets-webpack-plugin”: “^3.2.0”, “ora”: “^1.2.0”, “portfinder”: “^1.0.13”, “postcss-import”: “^11.0.0”, “postcss-loader”: “^2.0.8”, “postcss-url”: “^7.2.1”, “rimraf”: “^2.6.0”, “semver”: “^5.3.0”, “shelljs”: “^0.7.6”, “uglifyjs-webpack-plugin”: “^1.1.1”, “url-loader”: “^0.5.8”, “vue-jest”: “^1.0.2”, “vue-loader”: “^13.3.0”, “vue-style-loader”: “^3.0.1”, “vue-template-compiler”: “^2.5.2”, “webpack”: “^3.6.0”, “webpack-bundle-analyzer”: “^2.9.0”, “webpack-dev-server”: “^2.9.1”, “webpack-merge”: “^4.1.0” }, “engines”: { // 设置了此应用程序/软件包要与运行的Node.js或其他命令的版本 “node”: “>= 6.0.0”, “npm”: “>= 3.0.0” }, // 告知要支持哪些浏览器(及版本),Babel、Autoprefixer和其他工具会用到它,以将所需的polyfill和fallback添加到目标浏览器 “browserslist”: [ // 此配置意味着需要支持使用率超过1%的所有浏览器的最新的2个主版本,但不含IE8及更低的版本。 “> 1%”, “last 2 versions”, “not ie <= 8” ] }
<a name="2d765d32"></a>
###### 命令特有的属性
- package.json 文件还可以承载命令特有的配置,例如 Babel、ESlint 等
- 每个都有特有的属性,例如:eslintConfig、babel 等,它们是命令特有的,可以在相应的命令/项目文档中找到如何使用他们
<a name="b5dbb2ae"></a>
###### 软件包版本
- 鉴于使用了 semver(语义版本控制),所有的版本都有 3 个数字,第一个是主版本,第二个是次版本,第三个是补丁版本,具有以下规则:
- ~: 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
- ^: 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.1、0.14.0、依此类推。
- _: 如果写入的是 _,则表示接受所有的更新,包括主版本升级。
> : 接受高于指定版本的任何版本。
> =: 接受等于或高于指定版本的任何版本。
- <=: 接受等于或低于指定版本的任何版本。
- <: 接受低于指定版本的任何版本。
- 无符号: 仅接受指定的特定版本。
- latest: 使用可用的最新版本。
- 1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。
<a name="9952f2d1"></a>
##### 6、package-lock.json 文件
- 该文件旨在跟踪被安装的每个软件包的确切版本,以便产品可以以相同的方式被 100%复制(即使软件包的维护者更新了软件包)。
- 这解决了 package.json 一直尚未解决的特殊问题。在 package.json 中,可以使用 semver 表示法设置要升级到的版本(补丁版本或者次版本)
- 如果写入的是~0.13.0,则只更新补丁版本(即 0.13.1 可以,0.14.0 不可以)
- 如果写入的是^0.13.1,则更新补丁版本和次版本(即 0.13.1、0.14.0,以此类推)
- 如果写入的是 0.13.0,则始终使用确切的版本
- 当尝试使用 npm install 命令在另一台机器上复制项目时,如果指定了~语法并且软件包发布了补丁版本,则该软件包会被安装;^和次版本类似;如果指定了确切版本,则不会产生此问题。
- 可能是你或者其他人,会在某处尝试运行 npm install 初始化项目
- 因此,原始的项目和新初始化的项目实际上式不同的。即使补丁版本或者次版本不应该引入重大的更改,但还是可能引入缺陷
- package-lock.json 会固化当前安装的每个软件包的版本,当运行 npm install,npm 会使用这些确切的版本
- 当运行 npm update,package-lock.json 文件中的依赖的版本会被更新<br />####### 示例
> 运行 npm install cowsay 时获得的 package-lock.json 文件的示例结构
// 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字段 “resolved”: “https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz“ , // 以及校验软件包的integrity字符串 “integrity”: “sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkM Ajufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==”, // 安装 cowsay,其依赖于:get-stdin、optimist、string-width、strip-eof; // 当然这些软件包还需要其他的软件包,正如从require属性可以看到的 “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="
}
} }
<a name="c61e055d"></a>
#### 八、npm 包的版本
<a name="de523936"></a>
##### 1、查看 npm 包安装的版本
- npm list 查看所有已安装的 npm 软件包的最新版本信息
- npm list -g 查看全局安装的软件包的最新版本信息
- npm list --depth=0 仅获取顶层的软件包的最新版本信息
- npm list vue 获取指定软件包的最新版本信息
- npm view vue version 查看软件包在 npm 仓库上最新的可用版本
<a name="c47e44ec"></a>
##### 2、安装 npm 包的旧版本
- npm install @
- npm install -g @
<a name="65dc2b51"></a>
##### 3、将所有 Node.js 依赖包更新到最新版本
- npm update // 如果有新的次版本或补丁版本,则已安装的版本会被更新,并且 package-lock.json 文件会被新版本填充;package.json 则保持不变
- npm update // 不会更新到软件包的主版本,只会更新新的次版本或者补丁版本
- npm outdated // 可以发觉软件包的新版本
- 若要将所有的软件包更新到新的主版本,则需要全局安装 npm-check-updates 软件包
- npm install -g npm-check-updates
- 然后运行 ncu -u // 这会升级 package.json 文件的 dependencies 和 devDependencies 中的所有版本,以便 npm 可以安装新的主版本
- 然后运行更新 npm update 就可以更新到最新主版本
<a name="05c26a20"></a>
##### 4、卸载 npm 软件包
- 若要卸载本地安装:npm uninstall
- 如果使用 -S 或 --save 标志,则此操作还会移除 package.json 文件中的引用。
- npm uninstall -S
- npm uninstall --save
- 如果程序包是开发依赖项(列出在 package.json 文件的 devDependencies 中),则必须使用 -D 或 --save-dev 标志从文件中移除
- npm uninstall -D
- npm uninstall --save-dev
- 若要卸载全局安装的软件包,则需要添加 -g 或 --global 标志
- npm uninstall -g
- npm uninstall --global
<a name="56fff3b0"></a>
#### 九、Node.js 包运行器 npx
<a name="2252de0f"></a>
##### 1、轻松的运行本地命令
- npx 可以运行使用 Node.js 构建并通过 npm 仓库发布的代码。
- 运行 npx commandname 会自动地在项目的 node_modules 文件夹中找到命令的正确引用,而无需知道确切的路径,也不需要在全局和用户路径中安装软件包。
<a name="84255fab"></a>
##### 2、无需安装的命令执行
- npx 的另一个重要的特性是,无需先安装命令即可运行命令。
- 不需要安装任何东西。
- 可以使用 [@version ](/version ) 语法运行同一命令的不同版本。
// 运行 npx cowsay “你好”
< 你好 >
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
```
3、使用不同的 Node.js 版本运行代码
- 使用 @ 指定版本,并将其与 node npm 软件包 结合使用:
- npx node@10 -v #v10.18.1
- npx node@12 -v #v12.14.1
- 这有助于避免使用 nvm 之类的工具或其他 Node.js 版本管理工具。
4、直接从 URL 运行任意代码片段
- npx 并不限制使用 npm 仓库上发布的软件包。
- 可以运行位于 GitHub gist 中的代码
- 当然,当运行不受控制的代码时,需要格外小心,因为强大的功能带来了巨大的责任。
十、Node.js 事件循环!!!
1、介绍
- 事件循环是了解 Node.js 最重要的方面之一
- 因为它阐明了 Node.js 如何做到异步并且具有非阻塞的 I/O,所以它基本上阐明了 Node.js 的”杀手级应用”,正是这一点使它成功了
- Node.js javascript 代码运行在单个线程上,每次只处理一件事
- 这个限制实际上非常有用,因为它大大简化了编程方式,而不必担心并发问题
- 只需要注意如何编写代码,并避免任何可能阻塞线程的事情,例如同步的网络调用或无限的循环。
- 通常,在大多数浏览器中,每个浏览器选项卡都有一个事件循环,以使每个进程都隔离开,并避免使用有限的循环或繁重的处理来阻止整个浏览器的网页。