electron-vite
electron-vite copied to clipboard
CommonJS 语法兼容占用了一些关键词
Describe the bug
如文档所说electron-vite 兼容一些 CommonJS 语法(包括 require、require.resolve、__filename、__dirname),所以当我使用这些词语作为变量名时electron-vite会抛出错误The symbol "xxx" has already been declared
。
我认为这对于从CommonJS 迁移至 ESM语法时会带来极大的便利,但是对于从最开始就是用ESM语法编写的人不太方便。
比如:当我使用ESM语法开发时,我会去实现ESM版本的__dirname,但是electron-vite却占用了这些命名:
我有试着关闭CommonJS 语法兼容,但是我并没有找到有关信息,似乎他是在electron-vite默认开启的,我们是否应该通过plugin的方式来让用户决定他们的是否需要兼容CommonJS 语法。
Electron-Vite Version
2.2.0
Electron Version
30.0.1
Vite Version
5.2.10
Validations
- [X] Follow the Code of Conduct.
- [X] Read the Contributing Guidelines.
- [X] Read the docs.
- [X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
- 这个和electron-vite无关,也和迁移无关,这是常识性问题,因为构建目标是cjs,这些cjs内置变量是无法被占用的和改写的,nodejs的内置变量怎么可能被改写呢,所以运行时错误信息就会抛出的。
- 无论你是esm编写还是cjs编写,electron-vite都会自己根据构建目标,做好兼容处理,所以你的这个处理是多余的,你用esm编写就按esm标准即可,当构建到cjs时,像import.meta.url, electron-vite就会去转换成支持cjs。这是现代构建工具的基本功能之一。
- 这个和electron-vite无关,也和迁移无关,这是常识性问题,因为构建目标是cjs,这些cjs内置变量是无法被占用的和改写的,nodejs的内置变量怎么可能被改写呢,所以运行时错误信息就会抛出的。
- 无论你是esm编写还是cjs编写,electron-vite都会自己根据构建目标,做好兼容处理,所以你的这个处理是多余的,你用esm编写就按esm标准即可,当构建到cjs时,像import.meta.url, electron-vite就会去转换成支持cjs。这是现代构建工具的基本功能之一。
可是我的构建目标是es
建议,你使用esm语法,构建目标也是esm,也就无需这样处理。
建议,你使用esm语法,构建目标也是esm,也就无需这样处理。
正是因为我的源文件和构建目标都是是esm,但仍然出现了该问题,所以我才提出了该问题,稍后有空我会实现一个最小重现给您,感谢回复。
- 这个和electron-vite无关,也和迁移无关,这是常识性问题,因为构建目标是cjs,这些cjs内置变量是无法被占用的和改写的,nodejs的内置变量怎么可能被改写呢,所以运行时错误信息就会抛出的。
- 无论你是esm编写还是cjs编写,electron-vite都会自己根据构建目标,做好兼容处理,所以你的这个处理是多余的,你用esm编写就按esm标准即可,当构建到cjs时,像import.meta.url, electron-vite就会去转换成支持cjs。这是现代构建工具的基本功能之一。
可是我的构建目标是es
了解你的情况,构建目标为es时,electron-vite也会对___dirname这些做兼容处理,因为认为你使用了cjs语法,就会在头部插入和你实现同样的代码,就会有这个错误信息。既然是esm为何还要这样处理,同时require作为nodejs的关键字应该避免作为变量使用。
如果一定要这样处理,建议不要占用这些内置的变量,换个名字也不会有问题
你也可以直接使用__dirname, electron-vite 会自动处理
是的,改变变量名是没问题的,我可能描述的不是很好,但是我最初的核心想法是我们是不是不应该默认开启commonJs语法兼容,因为用户初次使用时可能并不知道该库具有commomJs语法兼容,当它们去实现esm版本的__dirname又或是const require = createRequire(import.meta.url)
时(因为这些在esm中并不是内置变量,我认为这样命名来保持他们的习惯并没有什么问题),就会触发electron-vite的语法兼容功能导致报错,这时会让用户花费大量时间去解决。
或者尝试解决语法识别错误,因为它将esm语法识别为了cjs