V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ubuntugx
V2EX  ›  Node.js

node 模块小问题

  •  2
     
  •   ubuntugx · 2020-03-12 18:29:29 +08:00 · 3738 次点击
    这是一个创建于 1750 天前的主题,其中的信息可能已经有所发展或是发生改变。
    node 识别 es module 的时候,怎么做到兼容的
    比如 fs 这个模块,是 module.exports 这样导出的
    那么 require('fs') 和 import 'fs' 都可以生效是怎么兼容的

    找了一些官方博客和文档里没有找到相关内容,准备去 debug 源码了,请问有人了解这块么~
    5 条回复    2020-03-29 16:56:25 +08:00
    libook
        1
    libook  
       2020-03-12 18:54:58 +08:00
    不同的模式用不同的解释过程,这个你想了解细节还真得去看 Node 源码。

    不过 Node 是要求必须有地方能明确指出你当前文件到底是 ESM 还是 CommonJS,要么是通过文件扩展名,要么通过当前模块目录下的 package.json,目前看来 Node 是无法在同一文件内同时兼容两种模块语法的。
    unsad
        2
    unsad  
       2020-03-12 19:39:36 +08:00
    执行入口文件时有判断。shouldUseESMLoader,在源码里搜一下这个方法。
    JayLin1011
        3
    JayLin1011  
       2020-03-12 21:34:56 +08:00
    Node.js 本身不兼容 ES Module,仅支持 CommonJS 规范,但是有 babel 生态,比如 babel-register 等可以帮你把完成编译工作,所以你甚至可以在 Node 环境中使用 ES Module,当然,最新的 Demo 已经实现了模块化的大一统,面向未来 ES Module 仍是标准。
    ubuntugx
        4
    ubuntugx  
    OP
       2020-03-13 14:25:38 +08:00
    node 在去年 11 月份的更新了对 esm 的支持 https://medium.com/@nodejs/announcing-core-node-js-support-for-ecmascript-modules-c5d6dc29b663

    这里问了 esm 和 cjs 的兼容问题,可以在源码里搜索到:
    node 源码 lib/internal/modules/cjs/loader.js 搜一下 default
    还有 esm/translators.js
    之后仔细研究后补充博客
    ubuntugx
        5
    ubuntugx  
    OP
       2020-03-29 16:56:25 +08:00
    写了一篇博客讲 node 模块载入的事情 https://www.cnblogs.com/ubuntugx/p/12592584.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:42 · PVG 13:42 · LAX 21:42 · JFK 00:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.