commonjs和es6
时间: 2024-06-17 12:04:36 浏览: 117
详谈commonjs模块与es6模块的区别
5星 · 资源好评率100%
CommonJS和ES6都是模块化的实现方式,但是二者有以下区别:
1. CommonJS是同步加载模块,而ES6模块是异步加载模块。
2. CommonJS的模块输出的是一个值的拷贝,而ES6输出的是值的引用。
3. CommonJS模块是运行时加载,ES6模块是编译时输出接口。
以下是手写CommonJS的范例,其中MyModule.prototype.load()方法是用来加载模块的核心方法,包括了查找模块、读取模块代码、编译执行模块等步骤。MyModule._extensions['.js']方法是用来处理.js文件的:
```javascript
const fs = require('fs');
const path = require('path');
const vm = require('vm');
function MyModule(id) {
this.id = id;
this.exports = {};
}
MyModule._cache = {};
MyModule._extensions = {
'.js'(module, filename) {
const content = fs.readFileSync(filename, 'utf8');
module._compile(content, filename);
}
};
MyModule.prototype.load = function() {
const ext = path.extname(this.id);
MyModule._extensions[ext](this, this.id);
};
MyModule.prototype._compile = function(content, filename) {
const wrapper = `(function(exports,require,module,__filename,__dirname){${content}})`;
const compiledWrapper = vm.runInThisContext(wrapper, { filename });
const dirname = path.dirname(filename);
compiledWrapper.call(this.exports, this.exports, myRequire, this, filename, dirname);
};
function myRequire(id) {
const absPath = path.resolve(id);
if (MyModule._cache[absPath]) {
return MyModule._cache[absPath].exports;
}
const module = new MyModule(absPath);
module.load();
MyModule._cache[absPath] = module;
return module.exports;
}
```
阅读全文