【问题标题】:Webpack + Typescript : Getting Module Parse failed - why?Webpack + Typescript:获取模块解析失败 - 为什么?
【发布时间】:2017-04-05 20:51:14
【问题描述】:

我正在使用 Typescript 和 Webpack 构建一个 knockoutJs 项目,但遇到了一个非常奇怪的问题。

webpack 失败的模块是这样的:

import esPlayerVM from "./components/es-player";
import esPlayerTemplate from "./components/es-player.tmpl.html";
import fsButtonVm from "./components/fullscreen-button";
import fsButtonHtml from "./components/fullscreen-button.tmpl.html";


export default class Registrator {

    static Register() {
        var koComp = (elName: string, vm: any, html: string) => {
            ko.components.register(elName, { viewModel: vm, template: html });
        }

        koComp('es-player', esPlayerVM, esPlayerTemplate);
        koComp('fullscreen-button', fsButtonVm, fsButtonHtml);
        //ko.components.register('es-player', { viewModel: esPlayerVM, template: esPlayerTemplate });
        //this.RegisterComponent('fullscreen-button', fsButtonVm, fsButtonHtml);
    }
}

Webpack 输出如下:

ERROR in ./ComponentRegistration.ts
Module parse failed: C:\Users\Marlon\Documents\Projects\eps-ko\src\ComponentRegistration.ts Unexpected token (10:28)
You may need an appropriate loader to handle this file type.
|
|     static Register() {
|         var koComp = (elName: string, vm: any, html: string) => {
|             ko.components.register(elName, { viewModel: vm, template: html });
|         }
 @ ./Main.ts 16:0-50

如果我删除koComp 变量,并直接在Register 方法中注册组件,webpack 很高兴。最初我有一个私有静态函数,正如您从底部评论中看到的那样,但 webpack 也有同样的问题。

我用谷歌搜索过,当打字稿输出es2016 代码时,其他人会得到这个,所以他们必须通过 babel 传递它,但是我的目标是 es5,所以我希望我的没问题?我也没有使用任何像 .tsx 文件这样的 react 东西。

ts-loaderawesome-typescript-loader 我都用过,两者都有同样的错误。

这是我的tsconfig.json

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "module": "es2015",
        "target": "es5",
        "moduleResolution": "node",
        "noImplicitAny": true,
        "sourceMap": false,
        "importHelpers": true
    }
}

最初我将modules 设置为commonjs,但在尝试ts-loader 时,我遵循了他们的示例。

这是我的webpack.config

const path = require('path');
const webpack = require('webpack');

const ExtractTextPlugin = require('extract-text-webpack-plugin');
const { CheckerPlugin } = require('awesome-typescript-loader')

// Create multiple instances
const extractCSS = new ExtractTextPlugin('es-player.bundle.css');

module.exports = {
  context: path.resolve(__dirname, './src'),
  entry: {
    app: './Main.ts',
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'es-player.bundle.js',
  },
  //devtool: "cheap-eval-source-map",
  resolve: {
    extensions: ['.ts', '.tsx']
  },    
  module: {
    loaders: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        loader: 'ts-loader'
      }
    ],
    rules: [
      {
        test: /\.css$/,
        use: extractCSS.extract([ 'css-loader', 'postcss-loader' ])
      },
      {
        test: /\.less$/i,
        use: extractCSS.extract([ 'css-loader', 'less-loader', 'postcss-loader' ])
      },
      {
        test: /\.tmpl.html?$/,
        use: 'raw-loader'
      }
    ]
  },
  plugins: [
    extractCSS
    //new CheckerPlugin()
  ],
};

版本:

Typescript: 2.2.2
Webpack: 2.3.3
awesome-typescript-loader: 3.1.2
ts-loader: 2.0.3

我可以直接注册它们,但我想知道是什么导致了这个错误。

编辑

在挖掘和删除代码之后,如果任何导出的模块在任何方法等上输入了参数,似乎 webpack 就会失败。这真的很奇怪,因为我认为 webpack 正在使用从加载器生成的转译 javascript?这表明它正在尝试使用原始 .ts 文件。

【问题讨论】:

    标签: javascript typescript webpack


    【解决方案1】:

    TL:DR WebPack 不支持同时使用 loadersrules 部分 - 必须使用其中之一。

    经过数小时的调试,这是由于在webpack.config.js 文件的loaders 部分中定义了打字稿加载器。将其移至 rules 部分解决了该问题。

    修改后的webpack.config.js文件如下:

    const path = require('path');
    const ExtractTextPlugin = require('extract-text-webpack-plugin');
    const { CheckerPlugin } = require('awesome-typescript-loader')
    
    const extractCSS = new ExtractTextPlugin('es-player.bundle.css');
    
    module.exports = {
      context: path.resolve(__dirname, './src'),
      entry: {
        app: './Main.ts',
      },
      output: {
        path: path.resolve(__dirname, './dist'),
        filename: 'es-player.bundle.js',
      },
      //devtool: "cheap-eval-source-map",
      resolve: {
        extensions: ['.js', '.ts', '.tsx']
      },    
      module: {
        rules: [
          {
            test: /\.css$/,
            use: extractCSS.extract([ 'css-loader', 'postcss-loader' ])
          },
          {
            test: /\.less$/i,
            use: extractCSS.extract([ 'css-loader', 'less-loader', 'postcss-loader' ])
          },
          {
            test: /\.tmpl.html?$/,
            use: 'raw-loader'
          },
          {
            test: /\.tsx?$/,
            exclude: /node_modules/,
            loader: 'awesome-typescript-loader'
          }
        ]
      },
      plugins: [
        extractCSS,
        new CheckerPlugin()
      ],
    };
    

    ts-loaderat-loader 状态在各自 github 页面上的 loaders 部分中定义它们。但是 Webpack 2 docs 状态将它们放在 rules 部分。至少可以说非常令人困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2017-06-01
      • 1970-01-01
      • 2023-03-14
      • 2016-03-06
      • 2016-05-13
      • 2017-09-21
      相关资源
      最近更新 更多