ESM 和 CommonJS 的区别

# ESMCommonJS 的区别

不同点:

  • this 指向不同

    CommonJSthis 指向的是当前 module, 默认是 exports

    var args = [self.exports, require, self, filename, dirname]
    return compiledWrapper.apply(self.exports, args)
    
    1
    2

    ESM 由于语言层面的设计指向的是 undefined

  • __filename, __dirnameCommonJS 中存在, 而 ESM 中不存在

    在 CommonJS 中, 模块的执行需要用函数包裹, 并制定一些常用值. 所以我们在全局中可以直接用 __filename, __dirname.

    NativeModule.wrapper = [
      '(function (exports, require, module, __filename, __dirname) {',
      '\n});'
    ]
    
    1
    2
    3
    4

相同点:

  • ESMCommonJS 都有缓存

    加载一次后将其缓存起来, 后续再次加载就直接用缓存中的