- 1. Node.js介绍
- 2. Node.js和浏览器的区别
- 3. 模块化
- 4. 模块化深入理解
- 5. npm包管理器
- 6. 如何从 Node.js 读取环境变量
- 7. 使用 exports 从 Node.js 文件中公开功能
- 8. 如何使用或执行 npm 安装的软件包
本文知识点参看下面文档
http://nodejs.cn/learn/introduction-to-nodejs
1. Node.js介绍在了解Node.js
之前要先了解下V8
引擎。
-
V8
是驱动Google Chrome
浏览器的JavaScript
引擎的名称 -
V8
提供了JavaScript
执行的运行时环境,DOM
和其他Web
平台API
由浏览器提供。
V8是JavaScript引擎名称,它提供了JavaScript脚本执行的运行时环境
Node.js
是在浏览器之外运行 V8 JavaScript
引擎,所以Node.js
也可以运行JavaScript
脚本,这使得 Node.js
的性能非常好
Node.js
具有如下介绍:
- 通过
Node.js
可以使JavaScript
脚本在服务器中运行 Node.js
就是一款使用JavaScript
编写的web
服务器Node.js
底层是使用c++
的编写的Node.js
的中JavaScript
引擎使用的chrome
的V8
引擎
Node.js
特点:
- 非阻塞、异步的I/O
- 事件和回调函数
- 单线程(主线程单线程,后台I/O线程池)
- 跨平台
浏览器和 Node.js
都使用 JavaScript
作为其编程语言,但构建在浏览器中运行的应用程序与构建 Node.js
应用程序完全不同。尽管它始终是 JavaScript
,但有一些关键的差异使体验完全不同。
-
在浏览器中,开发者所做的大部分工作都是与
DOM
或其他Web
平台API
(如Cookies
)进行交互,这些在Node.js
中不存在,因为没有浏览器提供的document
、window
和所有其他对象 -
在浏览器中,没有
Node.js
通过其模块提供的所有友好的 API,比如文件系统访问功能 -
另一个不同之处是
Node.js
使用CommonJS
模块系统,而在浏览器中,正在实施的ES Modules
标准。在Node.js
中使用require()
,在浏览器中使用import
ES5
中没有原生支持模块化,只能通过script
标签引入JavaScript
文件来实现模块化
在Node.js
中为了对模块管理,引入了CommonJS
规范
-
模块的引用
- 使用
require()
函数来引入一个模块 - 例子:var 变量 = require(“模块的标识”)
- 使用
-
模块的定义
-
在
Node.js
中一个JavaScript
文件就是一个模块 -
默认情况下,在
JavaScript
文件中编写的内容,都是独立运行在一个函数中而不是全局作用域,所以一个模块的中的变量和函数在其他模块中无法访问 -
导出变量和函数两种方式
-
使用
exports
exports.属性 = 属性值 exports.方法 = 函数
-
使用
module.exports
module.exports.属性 = 属性值 module.exports.方法 = 函数
module.exports = {}
-
-
-
模块的标识
-
模块的标识就是模块的名字或路径,
Node.js
通过模块的标识来寻找模块 -
对于核心模块(
npm
中下载的模块),直接使用模块的名字对其进行引入var fs = require("fs"); var express = require("express");
-
对于自定义的文件模块,需要通过文件的路径来对模块进行引入,路径可以是绝对路径,如果是相对路径必须以./或 …/开头
var router = require(“./router”);
-
在Node.js
中有一个全局对象 global
,它的作用和网页中window
类似。
- 在全局中创建的变量都会作为
global
的属性保存 - 在全局中创建的函数都会作为
global
的方法保存
当Node.js
在执行模块中的代码时,它会自动将模块化的所有代码放在如下函数中
function (exports, require, module, __filename, __dirname) {
// 模块化代码
}
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参
-
exports
:该对象用来将变量或函数暴露到外部 -
require
:函数,用来引入外部的模块 -
module
module
代表的是当前模块本身exports
就是module
的属性- 既可以使用
exports
导出,也可以使用module.exports
导出
-
__filename
:当前模块的完整路径`C:\Users\scorpios\projects\node\module.js`
-
__dirname
:当前模块所在文件夹的完整路径
C:\Users\scorpios\projects\node
通过npm
下载的包都放到node_modules
文件夹中,通过npm
下载的包,直接通过包名引入即可。
- 通过
npm
可以对Node.js
中的包进行上传、下载、搜索等操作 npm
会在安装完Node.js
以后,自动安装
Node.js
在使用模块名字来引入模块时,它会首先在当前目录的node_modules
中寻找是否含有该模块
- 如果有则直接使用,如果没有则去上一级目录的
node_modules
中寻找 - 如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止
- 直到找到磁盘的根目录,如果依然没有,则报错
npm
常用命令
Node.js
的 process
核心模块提供了 env
属性,该属性承载了在启动进程时设置的所有环境变量。
这是访问 NODE_ENV
环境变量的示例,该环境变量默认情况下被设置为 development
。
注意:process
不需要 "require
"引入,它是自动可用的。
process.env.NODE_ENV // "development"
7. 使用 exports 从 Node.js 文件中公开功能
const library = require('./library')
可以导入存在于当前文件夹中的 library.js
文件中公开的功能。在此文件中,必须先公开功能,然后其他文件才能将其导入。
默认情况下,文件中定义的任何其他对象或变量都是私有的,不会公开给外界。
这就是 module
系统提供的 module.exports
API 可以做的事。
当将对象或函数赋值为新的 exports
属性时,这就是要被公开的内容,因此,可以将其导入应用程序的其他部分或其他应用程序中。
可以通过两种方式进行操作。
第一种方式是将对象赋值给 module.exports
(这是模块系统提供的对象),这会使文件只导出该对象:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
module.exports = car
//在另一个文件中
const car = require('./car')
第二种方式是将要导出的对象添加为 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
module.exports
和 export
之间有什么区别?
前者公开了它指向的对象。 后者公开了它指向的对象的属性。
8. 如何使用或执行 npm 安装的软件包当使用 npm
将软件包安装到 node_modules
文件夹中或全局安装时,如何在 Node.js 代码中使用它?
假设使用以下命令安装了流行的 JavaScript 实用工具库 lodash
:
npm install lodash
这会把软件包安装到本地的 node_modules
文件夹中。
若要在代码中使用它,则只需使用 require
将其导入到程序中:
const _ = require('lodash')
如果软件包是可执行文件,该怎么办?
在这种情况下,它会把可执行文件放到 node_modules/.bin/
文件夹下。