V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqoo
V2EX  ›  程序员

NPM 包未来趋势是用 ES Module 吗

  •  
  •   iqoo · 2022-06-05 19:32:45 +08:00 · 4150 次点击
    这是一个创建于 902 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发现很多常用库的最新版本只能使用 ES Module 引用,比如 get-port 、node-fetch 等,这个是未来的趋势吗?

    19 条回复    2022-06-06 18:10:22 +08:00
    learningman
        1
    learningman  
       2022-06-05 20:17:43 +08:00
    不太可能,python2 到 3 用了 12 年,放弃 cjs 的代价只会更大,毕竟 npm 那个递归引用设计。。。
    Kaciras
        2
    Kaciras  
       2022-06-05 20:34:42 +08:00
    是的
    zhuweiyou
        3
    zhuweiyou  
       2022-06-05 20:45:49 +08:00
    浏览器端是, 服务端不太可能
    ChrisFreeMan
        4
    ChrisFreeMan  
       2022-06-05 20:55:58 +08:00
    不用怀疑,就是未来趋势,本就是为了解决 cjs 的痛点
    DOLLOR
        5
    DOLLOR  
       2022-06-05 21:03:51 +08:00
    如果是 TS 的话一律用 ESM 就完事了,编译的时候可以根据需要,自行选择输出为 ESM 、CJS 、AMD 、UMD 格式。
    makelove
        6
    makelove  
       2022-06-05 21:31:11 +08:00
    不是未来趋势,而是已是现实
    不过好在转了 esm 后还是能用 cjs 的,只不过只能整个引入模块,稍稍不方便一点点
    CoverL
        7
    CoverL  
       2022-06-05 22:31:00 +08:00
    cdn 服务都开始支持了
    beginor
        8
    beginor  
       2022-06-05 22:48:31 +08:00 via Android
    浏览器都支持了,esm 肯定是标准的标准
    duan602728596
        9
    duan602728596  
       2022-06-05 23:52:46 +08:00
    是的。而且 esm 引入 cjs 模块的成本不大,cjs 通过 import()仍然可以引入 esm 模块。
    Zwying
        10
    Zwying  
       2022-06-05 23:59:40 +08:00   ❤️ 1
    node_module 这个黑洞迟早被淘汰
    molvqingtai
        11
    molvqingtai  
       2022-06-06 01:48:52 +08:00
    是的,现在构建工具都依赖 esm 实现 no-bundle ,比如 vite
    Inocr
        12
    Inocr  
       2022-06-06 08:07:09 +08:00
    @DOLLOR TS 在 Node 端使用 ESM ,相对路径需要加上 .js ,目前还是很不友好的

    ```
    relative import paths need full extensions (we have to write import "./foo.js" instead of import "./foo")
    ```
    wangtian2020
        13
    wangtian2020  
       2022-06-06 08:43:16 +08:00
    只有我一个现在是 Nodejs 用 点 mjs 文件写吗?
    makelove
        14
    makelove  
       2022-06-06 09:04:46 +08:00
    @Inocr 并不需要加.js ,都是运行时在命令行上加 --es-module-specifier-resolution=node ,这样和原来不样不用.js 。 加.js 是麻烦,因为和前端不能共用文件了(或需要特别配制)。
    Inocr
        15
    Inocr  
       2022-06-06 09:34:26 +08:00
    @makelove 好吧,当时一看提示 ExperimentalWarning ,就有点怵,毕竟要上生产。那就只有个 tsconfig paths alias 需要解决下了,谷歌了很方案,都没有找到合适,不过这个问题倒不是很大,改成相对路径就好
    xling
        16
    xling  
       2022-06-06 09:38:38 +08:00
    加"type"="module"就行了,现在 nodejs 的 lts 版本已经是 16 了
    libook
        17
    libook  
       2022-06-06 10:47:45 +08:00
    个人认为,主流场景下,建议以 ECMAScript 官方标准为导向,官方出了 ESM ,将来大方向就是逐渐迁移到 ESM ,如果 ESM 本身不完善,那么就肯定会去完善 ESM 本身,毕竟 ES 标准迭代挺快的。
    moen
        18
    moen  
       2022-06-06 17:16:20 +08:00   ❤️ 1
    deno 默认 esm 就可以 top-level await ,用 node 的时候不改 esm 模式都不舒服
    zhouyg
        19
    zhouyg  
       2022-06-06 18:10:22 +08:00
    是的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2250 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 01:41 · PVG 09:41 · LAX 17:41 · JFK 20:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.