从 node_modules 导入枚举时 webpack encore 失败
webpack encore fails when importing enum from node_modules
我正在尝试使用我在另一个项目中创建的库中的一些枚举。
库是用Vue和typescript做的,用rollup打包,项目是用Synfony做的,前面也是用Vue和typescript做的,用Webpack Encore构建。
该库是我项目的依赖项,因此我尝试像这样导入枚举:
import { MyEnum } from 'myLibrary/src/enum/MyEnum';
枚举看起来像这样
// node_modules/myLibrary/src/enum/MyEnum.ts
export enum MyEnum {
One = 'one',
Two = 'two',
Three = 'three'
}
但是当我构建时出现这个错误(使用 Symfony 的 Webpack Encore):
ERROR Failed to compile with 1 errors 4:37:05 PM
Error loading ./node_modules/myLibrary/src/enum/MyEnum.ts
FIX To process TypeScript files:
1. Add Encore.enableTypeScriptLoader() to your webpack.config.js file.
我明明已经在webpack.config.js里加上了enableTypeScriptLoader()
,我不知道怎么解决
如果我在我的项目中创建相同的枚举文件并将其导入,它可以工作,但我必须将它保存在我的库中并且我不想重复代码。我以同样的方式从同一个库中导入接口,它工作正常。
我尝试了一些不起作用的方法:
export const enum
有点工作,但我收到 TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment or type query.
错误,我必须在另一个对象中重新声明枚举才能在我的模板中使用它:/
export declare enum
但仍然出现 Add Encore.enableTypeScriptLoader()
错误
知道如何解决这个问题吗?
编辑
我的浏览器中有另一条错误消息,其中添加了一些信息:
Module parse failed: Unexpected token (4:7)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
> export enum MyEnum {
| One = 'one',
| Two = 'two'
我还测试了在用 Vue Cli 制作的新项目中从同一个库导入相同的枚举,我没有错误。
我很确定这个问题来自 Webpack Encore。
已找到解决方案,此 Webpack Encore 问题中的一些细节:https://github.com/symfony/webpack-encore/issues/1060
这是解决方法:
- 1/ 在
enableTypeScriptLoader
选项中添加allowTsInNodeModules
:
Encore.enableTypeScriptLoader((options) => {
options.allowTsInNodeModules = true;
});
- 2/ 更新规则以更改排除 node_modules 的
exclude
选项,并排除 node_modules 但我自己的模块(其中 @myCompany
是 [=31 中的文件夹=] 我自己的模块在哪里。
Encore.configureLoaderRule('typescript', (rule) => {
rule.exclude = /node_modules\/(?!@myCompany)/;
});
这会在编译时生成警告,但目前这是我找到的解决此问题的唯一方法。
我正在尝试使用我在另一个项目中创建的库中的一些枚举。 库是用Vue和typescript做的,用rollup打包,项目是用Synfony做的,前面也是用Vue和typescript做的,用Webpack Encore构建。
该库是我项目的依赖项,因此我尝试像这样导入枚举:
import { MyEnum } from 'myLibrary/src/enum/MyEnum';
枚举看起来像这样
// node_modules/myLibrary/src/enum/MyEnum.ts
export enum MyEnum {
One = 'one',
Two = 'two',
Three = 'three'
}
但是当我构建时出现这个错误(使用 Symfony 的 Webpack Encore):
ERROR Failed to compile with 1 errors 4:37:05 PM
Error loading ./node_modules/myLibrary/src/enum/MyEnum.ts
FIX To process TypeScript files:
1. Add Encore.enableTypeScriptLoader() to your webpack.config.js file.
我明明已经在webpack.config.js里加上了enableTypeScriptLoader()
,我不知道怎么解决
如果我在我的项目中创建相同的枚举文件并将其导入,它可以工作,但我必须将它保存在我的库中并且我不想重复代码。我以同样的方式从同一个库中导入接口,它工作正常。
我尝试了一些不起作用的方法:
export const enum
有点工作,但我收到TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment or type query.
错误,我必须在另一个对象中重新声明枚举才能在我的模板中使用它:/export declare enum
但仍然出现Add Encore.enableTypeScriptLoader()
错误
知道如何解决这个问题吗?
编辑
我的浏览器中有另一条错误消息,其中添加了一些信息:
Module parse failed: Unexpected token (4:7)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
> export enum MyEnum {
| One = 'one',
| Two = 'two'
我还测试了在用 Vue Cli 制作的新项目中从同一个库导入相同的枚举,我没有错误。 我很确定这个问题来自 Webpack Encore。
已找到解决方案,此 Webpack Encore 问题中的一些细节:https://github.com/symfony/webpack-encore/issues/1060
这是解决方法:
- 1/ 在
enableTypeScriptLoader
选项中添加allowTsInNodeModules
:
Encore.enableTypeScriptLoader((options) => {
options.allowTsInNodeModules = true;
});
- 2/ 更新规则以更改排除 node_modules 的
exclude
选项,并排除 node_modules 但我自己的模块(其中@myCompany
是 [=31 中的文件夹=] 我自己的模块在哪里。
Encore.configureLoaderRule('typescript', (rule) => {
rule.exclude = /node_modules\/(?!@myCompany)/;
});
这会在编译时生成警告,但目前这是我找到的解决此问题的唯一方法。