Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CommonJS 语法兼容占用了一些关键词 #494

Open
4 tasks done
Kaidesuyoo opened this issue Apr 30, 2024 · 9 comments
Open
4 tasks done

CommonJS 语法兼容占用了一些关键词 #494

Kaidesuyoo opened this issue Apr 30, 2024 · 9 comments

Comments

@Kaidesuyoo
Copy link

Describe the bug

如文档所说electron-vite 兼容一些 CommonJS 语法(包括 require、require.resolve、__filename、__dirname),所以当我使用这些词语作为变量名时electron-vite会抛出错误The symbol "xxx" has already been declared
image
我认为这对于从CommonJS 迁移至 ESM语法时会带来极大的便利,但是对于从最开始就是用ESM语法编写的人不太方便。

比如:当我使用ESM语法开发时,我会去实现ESM版本的__dirname,但是electron-vite却占用了这些命名:
image

我有试着关闭CommonJS 语法兼容,但是我并没有找到有关信息,似乎他是在electron-vite默认开启的,我们是否应该通过plugin的方式来让用户决定他们的是否需要兼容CommonJS 语法。

Electron-Vite Version

2.2.0

Electron Version

30.0.1

Vite Version

5.2.10

Validations

@alex8088
Copy link
Owner

  • 这个和electron-vite无关,也和迁移无关,这是常识性问题,因为构建目标是cjs,这些cjs内置变量是无法被占用的和改写的,nodejs的内置变量怎么可能被改写呢,所以运行时错误信息就会抛出的。
  • 无论你是esm编写还是cjs编写,electron-vite都会自己根据构建目标,做好兼容处理,所以你的这个处理是多余的,你用esm编写就按esm标准即可,当构建到cjs时,像import.meta.url, electron-vite就会去转换成支持cjs。这是现代构建工具的基本功能之一。

@Kaidesuyoo
Copy link
Author

  • 这个和electron-vite无关,也和迁移无关,这是常识性问题,因为构建目标是cjs,这些cjs内置变量是无法被占用的和改写的,nodejs的内置变量怎么可能被改写呢,所以运行时错误信息就会抛出的。
  • 无论你是esm编写还是cjs编写,electron-vite都会自己根据构建目标,做好兼容处理,所以你的这个处理是多余的,你用esm编写就按esm标准即可,当构建到cjs时,像import.meta.url, electron-vite就会去转换成支持cjs。这是现代构建工具的基本功能之一。

可是我的构建目标是es

@alex8088
Copy link
Owner

建议,你使用esm语法,构建目标也是esm,也就无需这样处理。

@Kaidesuyoo
Copy link
Author

建议,你使用esm语法,构建目标也是esm,也就无需这样处理。

正是因为我的源文件和构建目标都是是esm,但仍然出现了该问题,所以我才提出了该问题,稍后有空我会实现一个最小重现给您,感谢回复。

@alex8088
Copy link
Owner

  • 这个和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的关键字应该避免作为变量使用。

@alex8088
Copy link
Owner

如果一定要这样处理,建议不要占用这些内置的变量,换个名字也不会有问题

@alex8088
Copy link
Owner

你也可以直接使用__dirname, electron-vite 会自动处理

@Kaidesuyoo
Copy link
Author

是的,改变变量名是没问题的,我可能描述的不是很好,但是我最初的核心想法是我们是不是不应该默认开启commonJs语法兼容,因为用户初次使用时可能并不知道该库具有commomJs语法兼容,当它们去实现esm版本的__dirname又或是const require = createRequire(import.meta.url)时(因为这些在esm中并不是内置变量,我认为这样命名来保持他们的习惯并没有什么问题),就会触发electron-vite的语法兼容功能导致报错,这时会让用户花费大量时间去解决。

@Kaidesuyoo
Copy link
Author

或者尝试解决语法识别错误,因为它将esm语法识别为了cjs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants