Mar*_*lon 3 javascript typescript webpack
我正在使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果我删除koComp变量,并直接在方法中注册组件Register,webpack 会很高兴。最初我有一个私有静态函数,正如你从底部评论中看到的那样,但 webpack 也有同样的问题。
我已经用谷歌搜索过,其他人在 typescript 输出es2016代码时得到了这个,所以他们必须通过 babel 传递它,但是我的目标是 es5 所以我希望我的没问题?我也没有使用任何像 .tsx 文件这样的 React 东西。
我已经使用了ts-loader和awesome-typescript-loader,两者都有相同的错误。
这是我的tsconfig.json
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"module": "es2015",
"target": "es5",
"moduleResolution": "node",
"noImplicitAny": true,
"sourceMap": false,
"importHelpers": true
}
}
Run Code Online (Sandbox Code Playgroud)
最初我已经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()
],
};
Run Code Online (Sandbox Code Playgroud)
版本:
Typescript: 2.2.2
Webpack: 2.3.3
awesome-typescript-loader: 3.1.2
ts-loader: 2.0.3
Run Code Online (Sandbox Code Playgroud)
我可以直接注册它们,但我想知道发生了什么导致此错误。
编辑
在挖掘和删除代码之后,如果任何导出的模块在任何方法等上输入了参数,那么 webpack 似乎会失败。这真的很奇怪,因为我认为 webpack 正在处理从加载器生成的转译的 javascript?这表明它正在尝试使用原始 .ts 文件。
TL:DR WebPack 不支持同时使用loaders和rules部分 - 必须使用其中之一。
经过几个小时的调试,这是由于在文件loaders的部分中定义了打字稿加载器webpack.config.js。将其移入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()
],
};
Run Code Online (Sandbox Code Playgroud)
两者ts-loader以及在各自 github 页面的部分at-loader中定义它们的状态。loaders但 Webpack 2文档声明将它们放在该rules部分中。至少可以说非常令人困惑。
| 归档时间: |
|
| 查看次数: |
11368 次 |
| 最近记录: |