【问题标题】:How to setup TypeScript + Babel + Webpack?如何设置 TypeScript + Babel + Webpack?
【发布时间】:2016-07-12 04:47:29
【问题描述】:

我有这些依赖:

"devDependencies": {
  "@types/node": "^4.0.27-alpha",
  "babel-core": "^6.10.4",
  "babel-loader": "^6.2.4",
  "babel-polyfill": "^6.9.1",
  "babel-preset-es2015": "^6.9.0",
  "babel-preset-stage-0": "^6.5.0",
  "ts-loader": "^0.8.2",
  "typescript": "^2.0.0",
  "webpack": "^1.13.1"
}

.babelrc

{
  "presets": [
    "es2015",
    "stage-0"
  ]
}

tsconfig.json

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "noImplicitAny": false,
        "sourceMap": false,
        "outDir": "built"
    },
    "exclude": [
        "node_modules"
    ]
}

webpack.config.js

module.exports = {
  entry: ['babel-polyfill', './src/'],
  output: {
    path: __dirname,
    filename: './built/bundle.js',
  },
  resolve: {
    modulesDirectories: ['node_modules'],
    extensions: ['', '.js', '.ts'],
  },
  module: {
    loaders: [{
      test: /\.tsx?$/, loaders: ['ts-loader', 'babel-loader'], exclude: /node_modules/
    }],
  }
};

/src/index.ts

async function foo() {
  const value = await bar();
  console.log(value);
}

function bar() {
  return new Promise((resolve, reject) => {
    return resolve(4);
  });
}

(async function run() {
  await foo();
}());

通过此设置,它确实可以工作,我可以构建并运行它(正确记录 4)。但是我总是在 webpack 上遇到一些错误:

ERROR in ./src/index.ts
(4,32): error TS2304: Cannot find name 'regeneratorRuntime'.

ERROR in ./src/index.ts
(6,12): error TS2304: Cannot find name 'regeneratorRuntime'.

ERROR in ./src/index.ts
(31,451): error TS2346: Supplied parameters do not match any signature of call target.

ERROR in ./src/index.ts
(40,33): error TS2304: Cannot find name 'regeneratorRuntime'.

ERROR in ./src/index.ts
(41,12): error TS2304: Cannot find name 'regeneratorRuntime'.

好像和babel-polyfill有关。

我错过了什么?

【问题讨论】:

    标签: javascript typescript webpack babeljs


    【解决方案1】:

    Babel 7 不需要 ts-loader。

    从 Babel 7 开始,ts-loader 是不必要的,因为Babel 7 understands TypeScriptTypeScript + Babel7 + Webpack setup are here 的完整详细信息。

    不使用 ts-loader 的设置概览。

    安装 Babel 的 TypeScript 支持。只有@babel/preset-typescript 是强制性的;其他三个添加了 TypeScript 支持的附加功能。

    npm install --save-dev @babel/preset-typescript 
    npm install --save-dev @babel/preset-env 
    npm install --save-dev @babel/plugin-proposal-class-properties 
    npm install --save-dev @babel/plugin-proposal-object-rest-spread
    

    配置额外的.babelrc 插件和预设。

    {
        "presets": [
            "@babel/preset-env",
            "@babel/preset-typescript"
        ],
        "plugins": [
            "@babel/proposal-class-properties",
            "@babel/proposal-object-rest-spread"
        ]
    }
    

    并更新您的webpack.config.js(为清楚起见省略其他代码)。

    module: {
      rules: [
      {
         test: /\.(js|jsx|tsx|ts)$/,
         exclude: /node_modules/,
         loader: 'babel-loader'
        }
      ]
    },
    resolve: {
      extensions: ['*', '.js', '.jsx', '.tsx', '.ts'],
    },
    

    【讨论】:

    • 是否需要在webpack文件中重复presets配置?在 babelrc 中指定它们还不够吗?
    • 这是正确的答案^ 移动到 babel@7。
    • 顺便说一下,Babel 文档指定了@babel/preset-env 而不是@babel/env。
    • ts-loader 和使用 Babel 7 和 babel-loader 之间的一个区别是 ts-loader 在编译期间进行类型检查; babel-loader 没有。此答案中链接的使用 TypeScript 和 Babel 7 的说明建议单独调用 tsc 进行类型检查。
    • ts-loader 也有额外的选项,比如自定义 tsconfig 路径。不建议使用 babel-loader 代替 ts-loader(至少现在是 2020 年)
    【解决方案2】:

    加载器总是从右到左执行,所以改为

    test: /\.tsx?$/, loaders: ['babel-loader', 'ts-loader'], exclude: /node_modules/
    

    修复了这个问题,因为它将首先运行ts-loader

    完整的 webpack.config.js 文件

    module.exports = {
      entry: ['babel-polyfill', './src/'],
      output: {
        path: __dirname,
        filename: './dist/index.js',
      },
      resolve: {
        extensions: ['', '.js', '.ts'],
      },
      module: {
        loaders: [{
          test: /\.ts$/, loaders: ['babel-loader', 'ts-loader'], exclude: /node_modules/
        }],
      }
    };
    

    示例项目brunolm/typescript-babel-webpack

    【讨论】:

    • 如果这样做会怎样`模块:{加载器:[{测试:/\.ts$/,加载器:['ts-loader'],排除:/node_modules/},{测试:/\.js*/,加载器:“babel-loader”,查询:{预设:['react','es2015','stage-0'] } }],}`
    【解决方案3】:

    (4,32):错误 TS2304:找不到名称“regeneratorRuntime”。

    这是babel 的输出被馈送到ts 的症状。此顺序错误

    修复

    您的编译设置应该将 TS 输出提供给 Babel。

    或者,您可以使用 @babel/preset-typescript 仅使用 Babel 编译 TypeScript。

    更多

    使用 Babel 编译 TypeScript:https://babeljs.io/docs/en/babel-preset-typescript

    【讨论】:

    • 修复应该避免链接到分散信息的外部站点。相反,请考虑在您的答案中提供相同的想法。
    猜你喜欢
    • 2015-09-23
    • 2023-04-09
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2021-02-12
    • 2019-12-29
    • 2017-03-25
    • 2016-11-11
    相关资源
    最近更新 更多