最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • import, export, exports, module.exports, require, 解构导入, 它们之间到底是什么关系?Cjs 和 ESM

    正文概述 掘金(Threeki水机)   2021-03-10   1072

    开始

    1.一切从一个报错说起

    > node b.js
    
    /Users/test/src/import_export/b.js:1
    import a from './a.js'
    ^^^^^^
    
    SyntaxError: Cannot use import statement outside a module
        at Module._compile (internal/modules/cjs/loader.js:895:18)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
        at Module.load (internal/modules/cjs/loader.js:815:32)
        at Function.Module._load (internal/modules/cjs/loader.js:727:14)
        at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
        at internal/main/run_main_module.js:17:11
    

    2.先看发生了什么 - js代码

    // a.js
    
    const a = 1
    export a
    
    // b.js
    
    import a from './a.js'
    console.log(a, 'a');
    

    然后当我执行 node b.js 时,就发生了上面导报错

    3.发生了什么?为什么会这样?

    • 我们在平时的前端项目中,经常会混用 import, export, exports, module.exports, require 这些关键字 来导入导出 文件间的变量。这就导致了,我们对于它们的认识的混乱,好像这些在项目中都能正常运行,怎么单独拿出来,就报错了?
    • 原因是,前端项目中 为了降低开发者 开发项目的门槛,项目创立者会在 webpack 中做额外的配置,使得 import, export, exports, module.exports, require 这些关键字 可以混用,而不会报错。

    4.问题报错原因

    • 上面的代码中,实际上我们犯了一个最基本的错误,就是在 NodeJS 中,使用了 ES6 Module 的导入导出的关键字。
    • NodeJS 的导入导出 模块规范,是 CommonJS 规范。NodeJS 目前不支持 ES6 Module 的导入导出的规范。

    什么是CommonJS?什么是ES6 Module

    简单理解

    CommonJS就是

    • 使用import .. from .. export, export default 关键字的代码
    • CommonJS 是 NodeJS 默认支持的 导入导出 模块规范
    // a.js
    
    const a = 1
    module.exports = { a }
    
    // b.js
    
    const { a } = require('./a.js')
    console.log(a)  // 1
    

    ES6 Module 就是

    • 使用 import .. from .. export, export default 关键字的代码
    • ES6 Module 是 JavaScript ES6 提出并实现的 导入导出 模块规范,目前在主流浏览器 都已支持
    // a.js
    
    export const a = 1
    
    // b.js
    
    import { a } from './a.js'
    console.log(a) // 1
    

    ES6 Module 代码如何执行?

    • 下面是 在浏览器中执行的 测试代码
    • 简单的ES6模块import改变文字颜色实例页面
    HTML代码:
    <p>我是p,我的颜色是?</p>
    
    
    script代码:
    <script type="module">
      // 导入firstBlood模块
      import { pColor } from './firstBlood.mjs';
      // 设置颜色为红色
      pColor('red')
    </script>
      
      
    firstBlood.mjs代码:
    // export一个改变p元素颜色的方法
    export function pColor (color) {
      const p = document.querySelector('p');
      p.style.color = color;
    }
    
    • 执行结果:可以看到<p>文字变红了:

    import, export, exports, module.exports, require, 解构导入, 它们之间到底是什么关系?Cjs 和 ESM

    参考文章

    • 图说 ES Modules 【深度好文 极力推荐!!】
      • 【英文原文】ES modules: A cartoon deep-dive
    • 深入解析ES Module(一):禁用export default object
    • 万岁,浏览器原生支持ES6 export和import模块啦!

    起源地下载网 » import, export, exports, module.exports, require, 解构导入, 它们之间到底是什么关系?Cjs 和 ESM

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元