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


export default function foo() { console.log('foo'); }
其他模块加载该模块时,命令可以为该匿名函数指定任意名字 。
import customName from './export-default'; customName(); // 'foo’export default命令用于指定模块的默认输出 。显然,一个模块只能有一个默认输出,因此export default命令只能使用一次 。所以,import命令后面才不用加大括号,因为只可能对应一个方法或者对象 。
// 导入整个模块内容import * as person from './testExport.js' // 导入列表内的多个接口import {firstName,lastName} from './testExport.js'// 重命名导入import {firstName as name} from './testExport.js' // 运行整个模块而不导入任何值import './testExport.js';// 导入使用export default导出的模块import myDefault from './testExport.js';
测试导出和导入:
在src目录下新建.js和.js两个文件,.js文件里用来测试导出,.js用来测试导入 。
.js内部代码
let firstName = 'Michael'; let lastName = 'vicky'; // 列表导出export { firstName, lastName };
.js内部代码
// 导入列表内的多个接口import { firstName, lastName } from './testExport.js'// 重命名导入import { firstName as name } from './testExport.js'console.log(firstName, lastName, name);// 结果为 Michael vicky Michael
执行node src/.js命令,输出结果 。
node src/testImport.js
模块化开发的优点主要有这么几点:
使用模块化开发能解决文件之间的依赖关系 。
当你引入很多个JS文件的时候,很有可能会不清楚这些JS文件之间的依赖关系,从而导致加载顺序出错 。使用模块化开发之后就能避免这个问题 。
使用模块化开发可以避免命名的冲突 。
JS本身是没有命名空间的,为了减少命名冲突,经常使用对象或者闭包来减少命名冲突 。对象只能减少命名冲突的概率,闭包的过多使用会造成内存泄漏 。模块化开发之后,在模块内任何形式的命名都不会和其他模块的命名产生冲突,有效的解决了命名冲突的问题 。
使用模块化开发能进行代码的复用 。
当我们想要实现某个功能的时候,如果某个模块正好有这个功能,我们就可以直接引用该模块,不必再写多余的代码,这样可以提高代码整体的效率,减少重复冗余的代码 。
CJS模块化
(CJS) 和 AMD 模块,都只能在运行时确定模块之间的依赖关系,以及输入输出的变量 。比如,模块就是对象,输入时必须查找对象属性 。
// CommonJS模块 let { stat, exists, readfile } = require('fs');// 等同于如下代码块let _fs = require('fs'); let stat = _fs.stat;let exists = _fs.exists; let readfile = _fs.readfile;
上面代码的实质是整体加载fs模块(即加载fs的所有方法),生成一个对象(_fs),然后再从这个对象上面读取 3 个方法 。这种加载称为“运行时加载”,因为只有运行时才能得到这个对象,导致完全没办法在编译时做“静态优化” 。
模块化规范,服务器端工作,实现了 。
模块对象
Node内部提供一个构建函数 。所有模块都是的实例 。每个模块内部,都有一个对象,代表当前模块 。它有以下属性,通过.XXX来使用:
属性说明