使用 webpack typescript 和 esm 构建 Express 服务器

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 构建应用程序,我需要做什么?

  • 节点:v16.18.1
  • ts-加载程序:v9.4.2
  • 打字稿:v4.9.4
  • 网页包:v5.75.0
  • webpack-cli:5.0.1

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)

Phi*_*hil 4

主要问题是 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 中所述)。

要修复上述错误,请使用以下命令:

NODE_OPTIONS="--loader ts-node/esm" npx webpack --entry ./src/index.js --mode production
Run Code Online (Sandbox Code Playgroud)

该页面的 SEO 一定很糟糕。希望在这里链接它有助于提高它一点。