ES6模块化与工程化、export导出、import导入、CJS模块化、模块对象

目录
模块化与工程化
ES6模块化
导出
导入
CJS模块化
模块对象
导出
导入
差异
拓展:(授课不做要求)
path模块
模块
url模块
模块化与工程化
一直没有模块体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来 。这对开发大型的、复杂的项目形成了巨大障碍 。
在 ES6 之前,社区制定了一些模块加载方案,最主要的有和 AMD 两种 。前者用于服务器,后者用于浏览器 。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代和 AMD 规范,成为浏览器和服务器通用的模块解决方案 。
注意:从 v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持 。在v12的版本里面,需要在.json中设置"type": "",
Tip:模块化是项目工程化的前提 。
ES6模块化
ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量 。
ES6 模块不是对象,而是通过命令显式指定输出的代码,再通过命令输入 。上面代码的实质是从fs模块加载 3 个方法,其他方法不加载 。这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比模块的加载方式高 。
ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use ";
Tip:用来从模块中导出,用来从模块中导入 。
// ES6模块使用示例import { stat, exists, readFile } from 'fs';
导出
一个模块就是一个独立的文件 。该文件内部的所有变量,外部无法获取 。如果你希望外部能够读取模块内部的某个变量,就必须使用关键字输出该变量 。命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系,也就是说外部接口需要用这个接口名来引用 。
在编写文档的时候编者的node版本是v14.16.0,查看node版本使用node -v命令 。
【ES6模块化与工程化、export导出、import导入、CJS模块化、模块对象】在src下创建.js文件,内部内容如下:
let firstName = 'Michael'; let lastName = 'vicky'; // 列表导出export { firstName, lastName };
运行.js文件,使用node src/.js
node src/testModule.js
正常情况如下:
如果出现以下错误:
上图蓝色框中的内容就是解决该错误的方法,在.json中添加"type": "",以保证该功能正常运行 。
再次执行node src/.js就可以了 。
node src/testModule.js
let firstName = 'Michael'; let lastName = 'vicky'; // 列表导出export { firstName, lastName }; // 重命名导出export { firstName as first, lastName as last};// 导出单个属性 export let a = 3; // 导出一个函数export function multiply(x, y) { return x * y; }; // 默认导出,一个模块只能有一个默认导出,不能使用 var、let 或 const 用于导出默认值 export default 。export default {}export default functionfoo(){}let b = 1;// 报错,因为没有提供对外的接口 。应该export let b = 1; 或者export {b}export b;
需要特别注意的是,命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系,不能直接导出一个值 。
导入
静态的 语句用于导入由另一个模块导出的绑定 。
命令: 使用命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载,但是,用户肯定希望快速上手,未必愿意阅读文档,去了解模块有哪些属性和方法 。为了给用户提供方便,让他们不用阅读文档就能加载模块,就要用到 命令,为模块指定默认输出