nodejs 由于历史原因,由社区推动的commonjs规范在esmodule未推出时解决了js模块化的问题,随着esX在近几年的发展,静态导入导出的优势对编译友好等,使得esmodule规范越来越流行,越来越多的库宣布在未来只支持纯ESM导出,使得很多项目不得不迁移,这里记录一下我自己的迁移过程和学习记录(主要涉及到typescript、node、webpack组合项目迁移思路)。

场景与迁移方案

  • 环境 nodejs>=12
  1. 在package.json中指定顶级字段 type:"module"
  2. 将项目中 require/module.exports 语句替换为 import/export

文档中提到无论该"type"字段的值如何,.mjs文件始终被视为 ES 模块,.cjs文件始终被视为 CommonJS。默认的上下文中采用esm规范

  • nodejs>=12、typescript>=4.7
  1. 文档中提到置tsconfig.json
{
    "module": "Node16", /* 指定生成代码的module类型 */
    "moduleResolution": "Node16" /* 指定导入代码的方式 */
}

moduleResolution 用于指定 typescript 如何去查找代码中引入的文件

module 代表代码使用的模块化方案

target 代表最终代码会被编译成哪个版本

  • nodejs>=12、typescript>=5.0-beta

由于ts团队的设计原则,“不复写导入路径”使得在4.x的ts中在moduleResolution为node16时,必须填写完整的引入后缀,并且不支持将.ts自动转成.js,这就造成了一个现象,在ts文件中引入ts文件,写的后缀却是.js,这是不符合直觉的,具体参考此issue,引起了大量讨论

在即将到来的typescript5.0中,moduleResolution新增了一项为bundler,主要为包含一系列类似 Node 的解析功能和 ESM 语法的打包器和运行时而设计,具体参考此PR,即对于编码人员来说,现在可以省略掉后缀引入ts文件,同时,配合 "allowImportingTsExtensions": true 也可实现对ts后缀文件引用,即在5.0之后的配置应为这样

{
    "module": "Node16", 
    "moduleResolution": "bundler" 
}
  • nodejs>=12、webpack config.mjs

对于webpack来说,他是通过node运行,如果在config中的包只支持esm导出(比如:chalk),则对webpack的配置文件也应该进行cjs到esm的迁移,此方案是将config后缀修改为.mjs,再按要求完成代码迁移,webpack可直接原生运行

  • nodejs>=12、webpack config.ts

如果使用typescript来编写webpack的config需要两步,首先根据官方的提示,需要安装ts-node,swc之类的工具解析config.ts,运行时需设置环境变量指明loader或者require钩子

cross-env NODE_OPTIONS="--loader ts-node/esm"
cross-env NODE_OPTIONS="-r ts-node/register" 

之后ts-node需配置esm开启即可

  • nodejs>=12、electron

很遗憾electron目前还不支持运行esm脚本,只能运行cjs,但是electron的包已经支持esm导出了,说明官方也正在往这个方向逐渐靠拢,希望将来能吃上官方的吧,参考issue进展

不过依然可以通过指定loader来使electron间接运行esm脚本,可以使用tsxtsx is a CLI command (alternative to node) for seamlessly running TypeScript & ESM, in both commonjs & module package types.)基于esbuild,不过存在一定限制比如不支持eval。

cross-env NODE_OPTIONS=\"--loader tsx\" electron .

9 个评论

  1. Здравствуйте. Готов помочь увеличить посещаемость и доходность вашего сайта, а также решить все имеющиеся на сайте проблемы. Причем рост посещаемости будет идти за счет притока целевых посетителей из поисковых систем, что для вас максимально выгодно и перспективно.

    Немного информации о себе. Я специалист в области создания, доработки и продвижения сайтов. Также имею знания и опыт в ряде смежных областей. Опыт работы составляет больше 19 лет. Работу всегда выполняю качественно.

    Основные направления моей деятельности:

    1. Внутренняя оптимизация. Все необходимые работы по сайту с целью достижения наилучших позиций в поисковых системах, улучшение конверсионных качеств и юзабилити, решение всех встреченных ошибок, при необходимости внедрение нового или улучшение старого функционала.

    2. Продвижение в поисковых системах. Работа с улучшением позиций по значимым для вас поисковым запросам, что способно дать большой приток целевой аудитории на сайт.

    3. Создание сайтов различных типов. Могу создать лендинг, интернет-магазин, сайт компании, информационный сайт, блог и т. д.

    4. Работа с отзывами в интернете. Создание и продвижение хороших отзывов, а также удаление плохих.

    5. Настройка рекламных кампаний в различных сервисах контекстной рекламы (Яндекс Директ и т. д.).

    6. Создание, доработка и продвижение групп и каналов в социальных сетях. Сюда входит: youtube, телеграм, вконтакте и другие.

    Также могу помочь вам и в ряде иных вопросов. Пишите на почту: [email protected]

    Andremailn

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注