vite-plugin-esmodule
是一个Vite插件,用来将ESModule
转换为CommonJS
,在 Electron开发的时候,遇到了使用Vite时无法在Electron/Node
环境中使用 ESModule
的问题 无法在主线程中使用 ESM 包。
vite-plugin-esmoodule
插件其实很简单,代码只有几百行,但是插件的思路我觉得挺好,但是也感觉这种方式不是很完美的,它的依赖只有三个:
webpack
vite-plugin-optimuzer
lib-sem
vite-plugin-exmodule
的使用方式:
esmodule
接收一个数组,数组中是需要转换为CommonJS
的包的名称,然后使用 vite-plugin-optimuzer
插件,本质上 esmodule
插件就是将optimuzer
封装了一层。
esmodule
会根据不同的环境输出不同的包,例如在Electron渲染进程中,会编译出ESM包,如果是在主进程或者Node进程中,则会编译出CommonJS
包,而且编译出来的包,不在原包的目录下,而是编译到node_modules/.vite-plugin-esmodule
文件夹下,在这个文件夹下会存在两个包,一个是 CommonJS
,一个是ESModule
。
编译ESM
到 CommonJS
是通过 Webpack
来实现的:
一些ESM包依赖于CJS包,这是很容易混淆的。在这种情况下,使用Webpack更加可靠。
当文件被打包到指定文件夹之后,会通过vite-plugin-optimuzer
注册Vite
配置:
这里主要注册的配置是 Vite
的 alias
别名配置,例如如下配置:
这个配置的作用是当我们在代码中使用 import 'get-port'
时,在打包的时候,会去打包 node_modules/.vite-plugin-esmodule/get-port.js
文件
这里的zx
包,index.js
文件和index.electron-renderer
是两个不同模块的文件。
总结这个插件的核心流程:
- 根据传入的模块名称,通过webpack将其编译出
ESModule
和CommonJS
两个不同的模块。
- 将打包好的模块放入到
node_modules/.vite-plugin-esmodule
文件夹下
- 通过
vite-plugin-optimizer
注册Vite
alias别名配置