课程名称: Node.js工程师养成计划
课程章节: Node 原生开发基础入门
课程讲师: 北瑶
课程内容:
1. Node.js 是什么?
- Node.js 不是一种独立的编程语言
- Node.js 不是 JavaScript 框架
- Node.js 是一个除了浏览器之外, 可以让 JavaScript 运行的环境
为什么浏览器和 Node.js 都可以运行 JavaScript 代码?
因为浏览器和 Node.js 都内置了 JavaScript V8 Engine (引擎). 它可以将 JavaScript 代码编译为计算机能够识别的机器码
JavaScript Code ==> JavaScript Engine (v8) ==> Machine Code
浏览器中运行的 JavaScript 和 Node.js 中运行的 JavaScript 有区别吗?
在浏览器中, 需要操作浏览器窗口以及 HTML 文档, 所以在 JavaScript V8 Engine 中添加了控制它们的 API, 就是 DOM 和 BOM. 所以 JavaScript 在浏览器中运行时是可以控制浏览器窗口对象和DOM文档对象的。
在 Node.js 中, 是没有 DOM 和 BOM 的, 这是浏览器环境中特有的, 在 Node.js 中添加了很多系统级别的 API,比如对操作系统中的文件和文件夹进行操作。获取操作系统信息,比如系统内存总量是多少,系统临时目录在哪,对系统的进程进行操作等等。
Node.js 能做什么?
- 后端 Web 服务器开发与网络爬虫开发
- 脚手架命令行工具
- 图形界面应用程序开发
2. 本地开发环境搭建
安装成功后, 打开命令行, 输入: node -v
, 则会显示 node 的版本号, 表示安装成功. 如果命令行显示'node' 不是内部或外部命令……
的提示,则表示 node 没有加入到系统环境变量中,我们需要找到 node 的安装路径,将路径添加到系统环境变量之后,重新开启命令行就可以了
3. 文件操作与模块化编程的概念
文件操作
Node.js 是可以操作系统级别的运行环境, 而一个操作系统最基本的能力就是对文件的管理, 那么如何使用 Node.js 调用系统提供的 api 完成对文件的一些操作呢? 比如将一个字符串写入到一个文件, 查看这个文件内容并追加 .
在浏览器中,使用 JS 操作 DOM 节点,需要使用浏览器提供的 Document API , 而在 Node 操作文件也是同理,Node 一定给我们提供了相关的 API 文档地址: https://nodejs.org/dist/latest-v16.x/docs/api/fs.html
Node.js 提供了 fs 这个 api, 里面有操作文件的几乎所有操作
- 文件读写
// 引入模块
var fs = require('fs');
// 向 a.txt 文件中写入内容
fs.writeFile('./a.txt', '赟赟', function (err) {
console.log(err);
})
// 向 a.txt 文件中读取内容
fs.readFile('./a.txt', 'utf8', function (err, data){
console.log(err);
// 回调函数 读取成功执行
console.log(data)
})
- 追加内容
// 引入模块
var fs = require('fs');
fs.readFile('a.txt', 'utf8', function(err, data) {
let txt = data + '赟赟';
fs.writeFile('a.txt', txt, function(e) {
if(!e){
console.log('追加成功')
}
})
})
require('fs')
到底什么意思?
4. 内置模块与模块化编程
fs 是一个 node 的内置模块, node 都是以模块的形式给我们提供的, 而要使用这些模块, 首先就是需要使用 require('模块名');
的方式引入。
模块化方案
- CommonJS
- AMD
- ECMAScript Module 简称 ESM 规范
ESM 规范
模块导出操作(exports)
命名导出, 导出一个具体的值
var val = '导出的内容';
export { val };
// 可重命名
export { val as value }
// 可立即导出
export var val = '导出内容'
默认导出(Default Export)
导出一个值作为源模块的默认导出:
export default val;
当该文件只有一个导出时, 建议用此方法
导入(Imports)
命名导入
import { val } from './a';
console.log(val)
// 可重命名
import { val as value } from './a';
但是,上面的代码执行,会出现如下的报错信息:(node:6044) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
意思就是 node 想要加载 ESM 模块化的代码,需要修改文件后缀名为.mjs 来支持或者在 \package.json 中添加 type选项,值为 module 。
{
"type": "module"
}
为什么呢? package.json
文件有什么作用呢?
CommonJS 规范
一个 JavaScript 文件就是一个模块, 在模块文件中定义的变量和函数默认只能在模块文件内部使用, 如果需要在其他文件中使用, 必须显式声明将其进行导出
在每一个模块文件中,都会存在一个 module 对象,即模块对象。在模块对象中保存了和当前模块相关信息。
在模块对象中有一个属性 exports,它的值是一个对象,模块内部需要被导出的成员都应该存储在到这个对象中。
console.log(module)
== shell ==
Module {
id: '.',
path: 'D:\\CodeR9000P\\fe-base-study\\node-base',
exports: {},
filename: 'D:\\CodeR9000P\\fe-base-study\\node-base\\m1.js',
loaded: false,
children: [],
paths: [
'D:\\CodeR9000P\\fe-base-study\\node-base\\node_modules',
'D:\\CodeR9000P\\fe-base-study\\node_modules',
'D:\\CodeR9000P\\node_modules',
'D:\\node_modules'
]
}
模块导出
// 模块的导出就是向 `module.exports` 对象中添加元素
var val = '赟赟'
module.exports.val = val;
模块导入
// 导入的就是 module.exports 对象
var m1 = require('./m1')
console.log(m1.a)
包管理 npm 基础命令的使用
还记得
package.json
文件又有什么作用的问题吗?现在我们就来解决这个它
要搞清楚 package.json 文件的作用,我们需要先了解 Node 开发下的一个强大的配套工具 npm 。
npm 就是 node 中自带的包管理工具;
执行命令: npm init
,对项目进行初始化,此时 package.json 文件就出现了。
项目管理的元数据配置文件 package.json
"name": "usenpm", // 项目名
"version": "1.0.0", // 版本号
"description": "这是我们第一次使用npm", // 描述信息
"main": "index.js", // 入口文件
"scripts": { // npm 设置的一些指令
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [ // 关键字
"第一次"
],
"author": "xiling", // 作者
"license": "ISC" // 当前项目的协议
其中 scripts 选项中,可以配置自定义执行脚本命令,而在前面我们配置的,Node 加载 ESM 代码,也是在这里进行的配置。
安装第三方包: npm install 包名
项目下载依赖: npm install
学习心得
通过这章的学习, 明白了浏览器 和 Node.js运行环境的区别, 对模块化编程的概念, 元数据配置文件有更深的了解
课程截图
模块化编程的三种概念