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 的进程,所有这些都会被立即非正常地终止。
  • 使用 Node.js 启动服务器,例如 HTTP 服务器:
  1. const express = require('express')
  2. const app = express()
  3. app.get('/', (req, res) => {
  4. res.send('你好')
  5. })
  6. const server = app.listen(3000, () => console.log('服务器已就绪'))
  7. process.on('SIGTERM', () => {
  8. server.close(() => {
  9. console.log('进程已终止')
  10. })
  11. })

一、如何从 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() 轻松地计算函数运行所需的时间
      1. const doSomething = () => console.log('测试')
      2. const measureDoingSomething = () => {
      3. console.time('doSomething()')
      4. //做点事,并测量所需的时间。
      5. doSomething()
      6. console.timeEnd('doSomething()')
      7. }
      8. measureDoingSomething()
  • 6、stdout 和 stderr

    • console.log 非常适合在控制台中打印消息。 这就是所谓的标准输出(或称为 stdout)。
    • console.error 会打印到 stderr 流,它不会出现在控制台中,但是会出现在错误日志中。
  • 7、为输出着色

    • 可以使用转义序列在控制台中为文本的输出着色。 转义序列是一组标识颜色的字符。
      • console.log(‘\x1b[33m%s\x1b[0m’, ‘你好’)
    • 控制台输出着色的最简单方法是使用库。 Chalk 是一个这样的库,除了为其着色外,它还有助于其他样式的设置(例如使文本变为粗体、斜体或带下划线)
      1. // 可以使用 npm install chalk 进行安装,然后就可以使用它:
      2. const chalk = require('chalk')
      3. 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)

  1. <a name="8815bf22"></a>
  2. #### 五、在 node.js 中从命令行接收输入
  3. - Node.js 提供了 readline 模块 :
  4. - 可以实现:每次一行地从可读流(例如:process.stdin 流,在 Node.js 程序执行期间该流就是终端输入)获取数据。

const readline = require(‘readline’).createInterface({ input: process.stdin, output: process.stdout })

readline.question(你叫什么名字?, name => { console.log(你好 ${name}!) readline.close() }) // question() 方法会显示第一个参数(即问题),并等待用户的输入; 当按下回车键时,则它会调用回调函数。

  1. <a name="f68c9340"></a>
  2. #### 六、使用 exports 从 node.js 文件中公开功能
  3. - Node.js 文件可以导入其他 Node.js 文件公开的功能。
  4. - 例如:const library = require("./library");
  5. - 可以引入当前文件夹中的 library.js 文件中的公开功能
  6. - 在此文件中,必须先公开功能,然后其他文件才能将其导入
  7. - 默认情况下,文件中定义的任何其他对象和变量都是私有的,不会公开到外界
  8. - module 系统提供的 module.exports API
  9. - 当将对象或者函数赋值为新的 exports 属性时,这就是要龚刚开的内容。因此,可以将其导入应用程序 dde 其他部分或者其他应用程序中
  10. - 可以通过两种方式进行操作
  11. - 1、将对象赋值給 module.exports(这是模块系统提供的对象),这会使文件只导出该对象

const car = { brand: ‘Ford’, model: ‘Fiesta’ } module.exports = car //在另一个文件中 const car = require(‘./car’)

  1. - 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

  1. <a name="fe5e4090"></a>
  2. #### 七、npm 包管理简介
  3. - npm 是 node.js 标准的软件包管理器
  4. - Yarn 是 npm 的一个替代选择
  5. <a name="4ea4ab9f"></a>
  6. ##### 1、npm 下载依赖包
  7. - 安装所有依赖
  8. - 如果项目具有 package.json 文件,运行 npm install,它会在 node_modules 文件夹(如果尚不存在则会创建)中安装项目所需的所有东西
  9. - 安装单个软件包
  10. - npm install // 安装并添加条目到 package.json 文件的 dependencies。
  11. - npm install --save // 安装并添加条目到 package.json 文件的 dependencies。
  12. - npm install --save-dev // 安装并添加条目到 package.json 文件的 devDependencies。
  13. - 区别:devDependencies 通常是开发的工具(例如测试的库);而 dependencies 则是与生产环境中的应用程序相关。
  14. - 更新软件包
  15. - 检查所有的软件包是否为最新版本并更新 npm update
  16. - 指定单个软件包进行更新 npm update
  17. <a name="655d935a"></a>
  18. ##### 2、版本控制
  19. - npm 可以指定软件包的任何特定版本
  20. - 指定库的显式版本还有助于使得每个人都使用相同的软件包版本,以便整个团队运行相同的版本,直至 package.json 文件被更新
  21. <a name="d91d9ae1"></a>
  22. ##### 3、运行任务
  23. - 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

  1. <a name="be4b9a39"></a>
  2. ##### 4、npm 将软件包安装到哪里(本地|全局)
  3. - 本地安装
  4. - npm install lodash // lodash 会被安装到当前文件树中的 node_modules 子文件夹中;
  5. - 这种情况下,npm 还会在当前文件夹中存在的 package.json 文件的 dependencies 属性中添加 lodash 条目
  6. - 使用 -g 标志可以执行全局安装
  7. - npm install -g lodash // npm 会把其安装在全局位置
  8. - 全局位置在哪? npm root -g 命令会告知其在计算机上的确切位置
  9. - macOS 或者 Linux 上,此位置可能是 /usr/local/lib/node_modules
  10. - Windows 上,可能是 C:\Users\YOU\AppData\Roaming\npm\node_modules。
  11. - 使用 nvm 管理 node.js,则软件包的位置可能是/Users/joe/.nvm/versions/node/v8.9.0/lib/node_modules
  12. - 如何使用或者执行 npm 安装的软件包?
  13. - 若要在代码中使用它,则只需使用 require 将其导入到程序中:const _ = require("lodash");
  14. - 如果软件包是可执行文件,该怎么办?
  15. - 这种情况,npm 会把可执行文件方法 node_modules/.bin/ 文件夹下
  16. - 可以输入 ./node_modules/.bin/软件包 来运行它
  17. - 最新版本的 npm 中包含的 npx 是更好的选择,只需运行 npx 软件包
  18. <a name="3a7fd692"></a>
  19. ##### 5、package.json 指南
  20. - package.json 文件是项目的清单。
  21. - 它是用于工具的配置中心
  22. - 也是 npm 和 yarn 存储所有已安装软件包的名称和版本的地方
  23. - package.json 文件中的内容必须遵循 JSON 格式,否则已编程的方式访问其属性的程序则无法读取它。
  24. <a name="68d96662"></a>
  25. ###### 文件结构

{ “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” ] }

  1. <a name="2d765d32"></a>
  2. ###### 命令特有的属性
  3. - package.json 文件还可以承载命令特有的配置,例如 Babel、ESlint 等
  4. - 每个都有特有的属性,例如:eslintConfig、babel 等,它们是命令特有的,可以在相应的命令/项目文档中找到如何使用他们
  5. <a name="b5dbb2ae"></a>
  6. ###### 软件包版本
  7. - 鉴于使用了 semver(语义版本控制),所有的版本都有 3 个数字,第一个是主版本,第二个是次版本,第三个是补丁版本,具有以下规则:
  8. - ~: 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
  9. - ^: 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.1、0.14.0、依此类推。
  10. - _: 如果写入的是 _,则表示接受所有的更新,包括主版本升级。
  11. > : 接受高于指定版本的任何版本。
  12. > =: 接受等于或高于指定版本的任何版本。
  13. - <=: 接受等于或低于指定版本的任何版本。
  14. - <: 接受低于指定版本的任何版本。
  15. - 无符号: 仅接受指定的特定版本。
  16. - latest: 使用可用的最新版本。
  17. - 1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。
  18. <a name="9952f2d1"></a>
  19. ##### 6、package-lock.json 文件
  20. - 该文件旨在跟踪被安装的每个软件包的确切版本,以便产品可以以相同的方式被 100%复制(即使软件包的维护者更新了软件包)。
  21. - 这解决了 package.json 一直尚未解决的特殊问题。在 package.json 中,可以使用 semver 表示法设置要升级到的版本(补丁版本或者次版本)
  22. - 如果写入的是~0.13.0,则只更新补丁版本(即 0.13.1 可以,0.14.0 不可以)
  23. - 如果写入的是^0.13.1,则更新补丁版本和次版本(即 0.13.1、0.14.0,以此类推)
  24. - 如果写入的是 0.13.0,则始终使用确切的版本
  25. - 当尝试使用 npm install 命令在另一台机器上复制项目时,如果指定了~语法并且软件包发布了补丁版本,则该软件包会被安装;^和次版本类似;如果指定了确切版本,则不会产生此问题。
  26. - 可能是你或者其他人,会在某处尝试运行 npm install 初始化项目
  27. - 因此,原始的项目和新初始化的项目实际上式不同的。即使补丁版本或者次版本不应该引入重大的更改,但还是可能引入缺陷
  28. - package-lock.json 会固化当前安装的每个软件包的版本,当运行 npm install,npm 会使用这些确切的版本
  29. - 当运行 npm update,package-lock.json 文件中的依赖的版本会被更新<br />####### 示例
  30. > 运行 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=”,

  1. "requires": {
  2. "minimist": "~0.0.1",
  3. "wordwrap": "~0.0.2"
  4. }
  5. },
  6. "string-width": {
  7. "version": "2.1.1",
  8. "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
  9. "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
  10. "requires": {
  11. "is-fullwidth-code-point": "^2.0.0",
  12. "strip-ansi": "^4.0.0"
  13. }
  14. },
  15. "strip-ansi": {
  16. "version": "4.0.0",
  17. "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
  18. "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
  19. "requires": {
  20. "ansi-regex": "^3.0.0"
  21. }
  22. },
  23. "strip-eof": {
  24. "version": "1.0.0",
  25. "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
  26. "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
  27. },
  28. "wordwrap": {
  29. "version": "0.0.3",
  30. "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
  31. "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
  32. }

} }

  1. <a name="c61e055d"></a>
  2. #### 八、npm 包的版本
  3. <a name="de523936"></a>
  4. ##### 1、查看 npm 包安装的版本
  5. - npm list 查看所有已安装的 npm 软件包的最新版本信息
  6. - npm list -g 查看全局安装的软件包的最新版本信息
  7. - npm list --depth=0 仅获取顶层的软件包的最新版本信息
  8. - npm list vue 获取指定软件包的最新版本信息
  9. - npm view vue version 查看软件包在 npm 仓库上最新的可用版本
  10. <a name="c47e44ec"></a>
  11. ##### 2、安装 npm 包的旧版本
  12. - npm install @
  13. - npm install -g @
  14. <a name="65dc2b51"></a>
  15. ##### 3、将所有 Node.js 依赖包更新到最新版本
  16. - npm update // 如果有新的次版本或补丁版本,则已安装的版本会被更新,并且 package-lock.json 文件会被新版本填充;package.json 则保持不变
  17. - npm update // 不会更新到软件包的主版本,只会更新新的次版本或者补丁版本
  18. - npm outdated // 可以发觉软件包的新版本
  19. - 若要将所有的软件包更新到新的主版本,则需要全局安装 npm-check-updates 软件包
  20. - npm install -g npm-check-updates
  21. - 然后运行 ncu -u // 这会升级 package.json 文件的 dependencies 和 devDependencies 中的所有版本,以便 npm 可以安装新的主版本
  22. - 然后运行更新 npm update 就可以更新到最新主版本
  23. <a name="05c26a20"></a>
  24. ##### 4、卸载 npm 软件包
  25. - 若要卸载本地安装:npm uninstall
  26. - 如果使用 -S 或 --save 标志,则此操作还会移除 package.json 文件中的引用。
  27. - npm uninstall -S
  28. - npm uninstall --save
  29. - 如果程序包是开发依赖项(列出在 package.json 文件的 devDependencies 中),则必须使用 -D 或 --save-dev 标志从文件中移除
  30. - npm uninstall -D
  31. - npm uninstall --save-dev
  32. - 若要卸载全局安装的软件包,则需要添加 -g 或 --global 标志
  33. - npm uninstall -g
  34. - npm uninstall --global
  35. <a name="56fff3b0"></a>
  36. #### 九、Node.js 包运行器 npx
  37. <a name="2252de0f"></a>
  38. ##### 1、轻松的运行本地命令
  39. - npx 可以运行使用 Node.js 构建并通过 npm 仓库发布的代码。
  40. - 运行 npx commandname 会自动地在项目的 node_modules 文件夹中找到命令的正确引用,而无需知道确切的路径,也不需要在全局和用户路径中安装软件包。
  41. <a name="84255fab"></a>
  42. ##### 2、无需安装的命令执行
  43. - npx 的另一个重要的特性是,无需先安装命令即可运行命令。
  44. - 不需要安装任何东西。
  45. - 可以使用 [@version ](/version ) 语法运行同一命令的不同版本。

// 运行 npx cowsay “你好”


< 你好 >

  1. \ ^__^
  2. \ (oo)\_______
  3. (__)\ )\/\
  4. ||----w |
  5. || ||

```

3、使用不同的 Node.js 版本运行代码
  • 使用 @ 指定版本,并将其与 node npm 软件包 结合使用:
    • npx node@10 -v #v10.18.1
    • npx node@12 -v #v12.14.1
  • 这有助于避免使用 nvm 之类的工具或其他 Node.js 版本管理工具。

4、直接从 URL 运行任意代码片段

十、Node.js 事件循环!!!

1、介绍
  • 事件循环是了解 Node.js 最重要的方面之一
    • 因为它阐明了 Node.js 如何做到异步并且具有非阻塞的 I/O,所以它基本上阐明了 Node.js 的”杀手级应用”,正是这一点使它成功了
  • Node.js javascript 代码运行在单个线程上,每次只处理一件事
  • 这个限制实际上非常有用,因为它大大简化了编程方式,而不必担心并发问题
  • 只需要注意如何编写代码,并避免任何可能阻塞线程的事情,例如同步的网络调用或无限的循环。
  • 通常,在大多数浏览器中,每个浏览器选项卡都有一个事件循环,以使每个进程都隔离开,并避免使用有限的循环或繁重的处理来阻止整个浏览器的网页。