qwe*_*rty 7 node.js typescript webpack es6-modules
我正在尝试使用 构建一个小node.js + ts项目webpack。
tsconfig.json
{
"compilerOptions": {
"lib": ["ESNext"],
"target": "ES2020",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"types": ["node"],
"allowSyntheticDefaultImports": true,
"rootDir": "./"
},
}
Run Code Online (Sandbox Code Playgroud)
我将其添加到package.json行中"type": "module"
webpack.config.ts
import * as path from 'path';
import * as webpack from 'webpack';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const PATHS = {
entry: path.resolve(__dirname, 'src/server/index.ts'),
output: path.resolve(__dirname, 'dist'),
};
const config: webpack.Configuration = {
target: 'node',
entry: PATHS.entry,
output: {
path: PATHS.output,
filename: 'bundle.js',
},
module: {
rules: [
{
test: /\.ts(x?)$/,
use: 'ts-loader',
exclude: '/node_modules/',
},
],
},
resolve: {
extensions: ['*', '.js', '.jsx', '.json', '.ts', '.tsx'],
},
};
export default config;
Run Code Online (Sandbox Code Playgroud)
通过运行命令"build": "webpack --config config/webpack.config.ts --mode development",我收到错误:
[webpack-cli] 无法加载“/node_esm/webpack.config.ts”配置 [webpack-cli] TypeError [ERR_UNKNOWN_FILE_EXTENSION]:/node_esm/webpack.config.ts 的文件扩展名“.ts”未知
我尝试添加到我的config.json "ts-node": { "esm": true}this 中并没有帮助解决我的问题。为了使用 webpack 构建应用程序,我需要做什么?
UPD 我尝试更改 tsconfig。第一个选项是打开 tsconfig.json 文件并查找 compilerOptions。将目标设置为“ES5”并将模块设置为“CommonJS”(或完全删除模块选项)。
{
"compilerOptions": {
"target": "ES5",
"module": "CommonJS",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"types": ["node"],
"allowSyntheticDefaultImports": true,
"rootDir": "./"
}
}
Run Code Online (Sandbox Code Playgroud)
错误保持不变。第二个选项是添加 ts-node 的设置:
您可以为 tsc 保留 "module": "ESNext",如果您使用 webpack 或其他构建工具,请为 ts-node 设置覆盖。
{
"compilerOptions": {
"target": "ES2020",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"types": ["node"],
"allowSyntheticDefaultImports": true,
"rootDir": "./"
},
"ts-node": {
"compilerOptions": {
"module": "CommonJS"
}
}
}
Run Code Online (Sandbox Code Playgroud)
此时我也尝试添加
{
"compilerOptions": {
"module": "ESNext" // or ES2015, ES2020
},
"ts-node": {
// Tell ts-node CLI to install the --loader automatically, explained below
"esm": true
}
}
Run Code Online (Sandbox Code Playgroud)
如打字稿文档中所述。第三个选项是安装 tsconfig-paths 包,它也没有帮助。在所有情况下,错误仍然与之前编写的相同。
package.json
{
"name": "node_esm",
"version": "1.0.0",
"description": "",
"type": "module",
"main": "index.js",
"scripts": {
"watch": "webpack --config config/webpack.config.ts --mode development --watch",
"build": "webpack --config config/webpack.config.ts --mode development"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"cross-env": "^7.0.3",
"express": "^4.18.2"
},
"devDependencies": {
"@types/express": "^4.17.15",
"@types/node": "^18.11.18",
"@types/webpack": "^5.28.0",
"circular-dependency-plugin": "^5.2.2",
"clean-webpack-plugin": "^4.0.0",
"nodemon": "^2.0.20",
"ts-loader": "^9.4.2",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.1.2",
"tsconfig-paths-webpack-plugin": "^4.0.0",
"typescript": "^4.9.4",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1",
"webpack-node-externals": "^3.0.0"
}
}
Run Code Online (Sandbox Code Playgroud)
主要问题是 Webpack 使用ts-nodeAPI,而不是 CLI,因此您需要适当配置节点加载器。
我使用以下配置让它工作。
package.json
"scripts": {
"build": "NODE_OPTIONS='--loader ts-node/esm' webpack --mode development"
},
Run Code Online (Sandbox Code Playgroud)
请参阅有关本机 ECMAScript 模块的 ts-node 文档...
如果您不使用我们的 CLI,请将加载器标志传递给节点。
如果您计划在 Windows 上构建它,您可能需要使用cross-env或env-cmd之类的东西。
注意:我不需要任何特别的东西tsconfig.json。不需要任何ts-node部分,因为这仅适用于 CLI。
啊啊啊,我刚刚在 Webpack CLI 参考中找到了这个故障排除指南
类型错误 [ERR_UNKNOWN_FILE_EXTENSION]:./webpack.config.ts 的未知文件扩展名“.ts”
在 TypeScript 中使用本机 ESM(即在 package.json 中键入:“module”)时,您可能会遇到此错误。
webpack-cli 支持 CommonJS 和 ESM 格式的配置,首先它尝试使用 require() 加载配置,一旦失败并出现错误代码“ERR_REQUIRE_ESM”(本例的特殊代码),它会尝试加载使用 import() 进行配置。但是,如果没有启用加载器挂钩,则 import() 方法将无法与 ts-node 一起使用(如 TypeStrong/ts-node#1007 中所述)。
要修复上述错误,请使用以下命令:
Run Code Online (Sandbox Code Playgroud)NODE_OPTIONS="--loader ts-node/esm" npx webpack --entry ./src/index.js --mode production
该页面的 SEO 一定很糟糕。希望在这里链接它有助于提高它一点。
| 归档时间: |
|
| 查看次数: |
2092 次 |
| 最近记录: |