美文网首页
node 环境下一个文件如何同时支持 import 和 requ

node 环境下一个文件如何同时支持 import 和 requ

作者: 月半女那 | 来源:发表于2022-05-10 16:15 被阅读0次

    JavaScript 现在有两种模块。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 CJS。
    CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用require()和module.exports,ES6 模块使用import和export。
    ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。
    如何让require 和 import在同一文件中使用

    1. npm init -y 会默认生成一个package.json
    2. 在package.json这种添加 type :'module'
      一旦设置了以后,该项目的 JS 脚本,就被解释成 ES6 模块。
    index.js
    
    // ES6 模块需要支持静态代码分析,而 CommonJS 模块的输出接口是module.exports,是一个对象,无法被静态分析,所以只能整体加载。
    import  lib from './lib.cjs'
    import * as newLib from './newLib.js'
    
    console.log(lib.count) // 3
    lib.incCounter();
    console.log(lib.count) // 3
    
    console.log(newLib.count) // 3
    newLib.incCounter();
    console.log(newLib.count) // 4
    
    lib.cjs
    let count = 3;
    
    function incCounter(){
        return count++;
    }
    
    module.exports  = {
        count,
        incCounter
    }
    
    newLib.js
    let count = 3;
    
    function incCounter(){
        return count++;
    }
    
    export  {
        count,
        incCounter
    }
    

    如果这时还要使用 CommonJS 模块,那么需要将 CommonJS 脚本的后缀名都改成.cjs。则.js脚本会被解释成 CommonJS 模块。

    • CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用require()和module.exports,ES6 模块使用import和export。
    • 它们采用不同的加载方案。从 Node.js v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持。

    Node.js 要求 ES6 模块采用.mjs后缀文件名。也就是说,只要脚本文件里面使用import或者export命令,那么就必须采用.mjs后缀名。Node.js 遇到.mjs文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict"。

    相关文章

      网友评论

          本文标题:node 环境下一个文件如何同时支持 import 和 requ

          本文链接:https://www.haomeiwen.com/subject/vujkcrtx.html