Node.js

# Node.js 简介

Node.js (opens new window) 是一个基于 Chrome V8 引擎的 JavaScript 运行时。

简单的讲 Node.js 就是脱离了浏览器的 JavaScript 运行环境,也可以说是运行在服务端的 JavaScript。

Node.js API文档 (opens new window)

# npm: 包管理器

Node.js 完全是基于模块化构建的,因此需要一个高质量的包管理器;有鉴于此 npm 诞生了。

类似Python的包管理器pip,npm是Node.js默认的包管理器。

npm官方文档 (opens new window)

# 包和模块

参考文档:About packages and modules (opens new window)

# 什么是模块

npm文档中的描述:要由 Node.js 的require()函数加载,模块必须是以下之一

  • 一个有package.json文件的文件夹,并且package.json中有"main"字段。
  • 一个 JavaScript 文件。

参考Node.js中文网 (opens new window)对模块的介绍再补充一点:如果目录中不存在 package.json (opens new window) 文件,或者 "main" (opens new window) 条目丢失或无法解析,则 Node.js 将尝试从该目录中加载 index.jsindex.node 文件。 例如,如果前面的示例中没有 package.json (opens new window) 文件,则 require('./some-library') 将尝试加载:

  • ./some-library/index.js
  • ./some-library/index.node

如果这些尝试失败,Node.js 将报告整个模块丢失,并显示默认错误:

Error: Cannot find module 'some-library'
1

# 什么是包

简单的讲,有package.json文件的模块就是一个包。

npm 文档中详细描述了包的格式:

  • a) 一个包含由文件描述的程序的package.json文件夹。
  • b) 一个包含 (a) 的gz压缩文件。
  • c)一个 解析为 (b) 的 URL。
  • d)一个在npm仓库中发布的 (c),格式为<name>@<version>
  • e)一个指向(d)的标签,格式为<name>@<tag>
  • f)一个<name>latest标签的 (e) 。
  • g) 一个giturl,在克隆时会得到 (a)。

# npm常用命令

参考文档:CLI Commands (opens new window)

  • npm init:创建一个package.json文件,可用于设置新的或现有的 npm 包。

  • npm install:安装一个包。此命令安装一个包和它所依赖的任何包。未指定包名时将安装以下文件中的包(有优先级顺序):

    • npm-shrinkwrap.json
    • package-lock.json
    • yarn.lock

    可选参数:

    • -g, --global: 使用该参数则全局安装,默认是只在当前目录安装。

    • -P, --save-prod: 包名将出现在你的 dependencies 里。 这是默认的,除非使用了 -D-O 参数。

    • -D, --save-dev: 包名 将出现在你的 devDependencies

    • -O, --save-optional: 包名将出现在你的 optionalDependencies

    • --no-save: 阻止包名出现在 dependencies

  • npm uninstall: 删除包。

  • npm run <command>: 运行任意包脚本。简单的讲就是运行写在scripts下的<command>对应的命令。如果没有指定<command>,将列出所有可用脚本命令。

# CommonJS

CommonJS是一个项目,其目标是为JavaScript (opens new window)网页浏览器 (opens new window)之外创建模块 (opens new window)约定。创建这个项目的主要原因是当时缺乏普遍可接受形式的JavaScript脚本模块单元,模块在与运行JavaScript脚本的常规网页浏览器所提供的不同的环境下可以重复使用。Node.js中require这个函数、这种导入模块的写法就是借鉴了CommonJS的规范。

特别注意它不是js官方的规范,浏览器并不支持require这种写法。

虽然2013年5月,Node.js (opens new window)包管理器npm (opens new window)的作者Isaac Z. Schlueter,宣布Node.js已经废弃了CommonJS。但其实意思是Node.js以后不完全遵守CommonJS规范了,不代表借鉴的require写法也弃用了。现在仍然是使用这种写法。

目前大多数浏览器都是支持ES6。例如import写法,浏览器是支持的,但是Node.js原生js不支持这种写法。