业力+ Webpack(babel-loader)+ ES6“意外的令牌导入”

本尼·博特玛(Benny Bottema)

/ edit:我完全剥离了配置,以最小程度地说明了问题。我还向GitHub上传了一个可运行的项目,您可以检出该项目,因此您可以自己查看。

GitHub上有问题的用例:webpack-angular15-es6-karma下载7z存档

npm install
npm run build
npm run test

我知道有两个相关的问题,但是世界发展得如此之快,并且有太多的因素/依赖关系,以至于我无法用当前提出的解决方案来解决这个问题。

我有一个webpack配置,可以处理我的所有源代码,并且效果很好。

为了进行测试,我重用了该配置以处理一个单一的中央条目脚本,该脚本同时加载了源代码和测试文件。我找不到另一种将模块从源代码导入测试代码进行测试的方法。

Karma可以很好地重用我的webpack配置,但是浏览器一打开就会报告错误。

源代码使用ES6导入和webpack require语句。

package.json:

npm运行构建>>> webpack --config webpack.config.js --display-error-details --colors --progress

npm运行测试>>>业力启动-单次运行--no-auto-watch karma.config.js

{
  "name": "ProblemDemo",
  "scripts": {
    "build": "rimraf dist && webpack --config webpack.config.js --display-error-details --colors --progress",
    "test": "karma start --single-run --no-auto-watch karma.config.js"
  },
  "dependencies": {
    "angular": "^1.5.7",
    "angular-filter": "^0.5.8"
  },
  "devDependencies": {
      "webpack": "1.13.1",
      "html-loader": "0.4.3",
      "babel-loader": "5.3.2",
      "html-webpack-plugin": "1.6.1",
      "rimraf": "^2.5.3",
      "run-sequence": "1.1.2",
      "jasmine-core": "^2.4.1",
      "karma": "^0.13.19",
      "karma-chrome-launcher": "^0.2.2",
      "karma-coverage": "^0.5.3",
      "karma-jasmine": "^0.3.6",
      "karma-webpack": "^1.7.0",
      "loader-utils": "^0.2.12"
  }
}

karma.config.js:

module.exports = function (config) {
    config.set({
        browsers: ['Chrome'],
        coverageReporter: {
            reporters: [
                { type: 'html', subdir: 'html' },
                { type: 'lcovonly', subdir: '.' }
            ]
        },
        files: ['./tests.webpack.js'],
        frameworks: ['jasmine'],
        preprocessors: { './tests.webpack.js': ['webpack'] },
        reporters: ['progress', 'coverage'],
        webpack: configureWebpack()
    });

    function configureWebpack(webpackConfigFunction) {
        var webpackConfig = require('./webpack.config');
        webpackConfig.entry = undefined; // karma will pass the proper argument for entry
        return webpackConfig;
    }
};

如您所见,我没有使用karma-babel插件:我不确定为什么会需要这些插件,因为我已经有了一个具有import / require语句的代码的有效构建。

test_entry.js:

var testsContext = require.context('./test', true, /\.js$/);
testsContext.keys().forEach(testsContext);

var srcContext = require.context('./app', true, /\.js$/);
srcContext.keys().forEach(srcContext);

Webpack的构建成功完成(并发出预期的文件大小的test_entry.js块),但是随后Karma打开Chrome,并且在页面加载后立即出现以下错误:

Chrome 51.0.2704(Windows 7 0.0.0)错误

未捕获到的SyntaxError:意外的令牌导入

在the_path / test_entry.js:41

test_entry.js没有41行,也不包含import语句,无论如何它们都应该得到照顾。怎么了

如果您也想了解webpack的配置:

// webpack.config.js, works perfectly for normal builds but not with Karma
var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
	debug: true,
	entry: {
		app: ['./app/index.js'],
		vendor: ['./app/vendor.js']
	},
	output: {
		path: path.join(__dirname, 'dist'),
		filename: 'js/[name].js'
	},
	plugins: [
		new HtmlWebpackPlugin({
			template: './app/index.html',
			inject: 'body',
			minify: false
		}),
		new webpack.optimize.CommonsChunkPlugin('vendor', 'js/vendor.js'),
		new webpack.SourceMapDevToolPlugin({
			filename: '[file].map',
			exclude: /vendor/
		})
	],
	resolve: {
		extensions: ['', '.js'],
		alias: {
			app: path.join(__dirname, 'app')
		}
	},
	module: {
		loaders: [
			{
				test: /\.js$/,
				loader: 'babel-loader',
				include: path.join(__dirname, 'app'),
				exclude: path.join(__dirname, 'node_modules')
			},
			{
				test: /\.html$/,
				loader: 'html-loader'
			}
		]
	},
	resolveLoader: {
		root: path.join(__dirname, 'node_modules')
	},
};

如果您想查看test_entry.js所需的测试,我将无法运行它:

import jasmine from 'jasmine-core';
import readableNumberFilter from './file_path/readableNumber.filter';

// for some reason needed, or else unexpected token errors during build:
var describe = jasmine.describe;
var it = jasmine.it;
var expect = jasmine.expect;

describe('readableNumber Filter', function () {
	describe('readableNumber Filter formatting', () => {
		it('it should support optional arguments', function () {
			expect(readableNumberFilter("50.3")).toEqual("50,30");
		});
	});
});


编辑20-7-2016

更新后的babel-loader依赖关系仍然存在此问题(包括设置es2015预设选项)。“ babel-core”:“ ^ 6.11.4”,“ babel-loader”:“ ^ 6.2.4”,“ babel-preset-es2015”:“ ^ 6.9.0”,

博格丹·萨夫鲁克(Bogdan Savluk)

问题是您没有在转储测试源-src/global/filters/dateFormat.filter.spec.js未转储文件

您需要更改此加载器配置:

{
    test: /\.js$/,
    loader: 'babel-loader',
    include: path.join(__dirname, 'app'),
    exclude: path.join(__dirname, 'node_modules')
},

如下所示,使其工作:

{
    test: /\.js$/,
    loader: 'babel-loader',
    include: [
        path.join(__dirname, 'app'),
        path.join(__dirname, 'test')
    ],
    exclude: path.join(__dirname, 'node_modules')
},

webpack.optimize.CommonsChunkPlugin插件也存在问题-应禁用业力:https//github.com/webpack/karma-webpack/issues/22

比禁用此插件后,您的测试文件中有错误:

import jasmine from 'jasmine-core';

import readableNumberFilter from 'readableNumber.filter';

var describe = jasmine.describe;
var it = jasmine.it;
var expect = jasmine.expect;

describe('readableNumber Filter', function () {
    describe('readableNumber Filter formatting', () => {
        it('it should support optional arguments', function () {
            expect(readableNumberFilter("50.3")).toEqual("50,30");
        });
    });
});

此测试中几乎没有错误:

  1. import jasmine from 'jasmine-core';-你不应该这样做(因缘会做,也将增加describeitexpect
  2. import readableNumberFilter from 'readableNumber.filter'; -这不是您如何实例化角度服务以对其进行测试的方法。

您应该执行以下操作(此测试实际上适用于上述所有修复程序):

import angular from 'angular';
import 'angular-mocks';

import testModule from '../../../../app/src/global/index';

const { module, inject } = angular.mock;

describe('readableNumber Filter', () => {
    beforeEach(module(testModule));

    let $filter;

    beforeEach(inject((_$filter_) => {
        $filter = _$filter_;
    }));

    describe('readableNumber Filter formatting', () => {
        it('it should support optional arguments', () => {
            const result = $filter('readableNumber')("50.3");
            expect(result).toEqual("50,30");
        });
    });
});

注意:您将需要安装模块angular-mocks


为了支持代码覆盖率报告,您将需要配置测试Webpack配置以使用babel-istanbul-loader顺便说一句,您还需要升级到Babel6。

另外,您还需要使webpack配置更具可配置性(用于测试和生产的配置会稍有不同)。

我已向您发送了包含所有这些修复程序的请求请求:https : //github.com/bbottema/webpack-angular15-es6-karma/pull/1


关于使用webpack构建angular 1.x项目,包括通过业力进行代码覆盖率测试-也许您会对我的项目感兴趣:https : //github.com/zxbodya/angular-webpack-seed-这是具有所有必需条件的入门模板配置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

意外的令牌导入(webpack es6)

来自分类Dev

React.js-babel-loader-意外令牌

来自分类Dev

简单的Webpack + React + ES6 + babel示例不起作用。意外的令牌错误

来自分类Dev

webpack + babel-反应,意外的令牌“导入”

来自分类Dev

Webpack 和 Babel-Loader - 对象 Rest Operator 上的意外令牌,安装了 transform-object-rest-spread 插件

来自分类Dev

babel-loader,webpack,ES2015模块:“元素类型无效”

来自分类Dev

Webpack babel-loader es2015 预设设置不起作用

来自分类Dev

Webpack,Babel:ES6导入与Fabric.js的需求

来自分类Dev

Webpack loader摆脱了es6 / 7中的括号

来自分类Dev

Webpack loader摆脱了es6 / 7中的括号

来自分类Dev

Webpack无法解析全局安装的babel或babel-loader

来自分类Dev

业力无法加载导入的文件

来自分类Dev

业力无法加载导入的文件

来自分类Dev

Webpack Babel加载错误-未捕获的SyntaxError:意外的令牌导入

来自分类Dev

将ES7异步/等待与节点,Webpack和babel-loader一起使用时出错

来自分类Dev

Webpack,React,JSX,Babel-意外令牌<

来自分类Dev

Webpack,React,JSX,Babel-意外令牌<

来自分类Dev

业力Webpack源图不起作用

来自分类Dev

Webpack 2 sass-loader 意外字符“@”

来自分类Dev

使用webpack和babel-loader编译时出错

来自分类Dev

带有babel-loader的Webpack无法识别JSX代码

来自分类Dev

webpack + babel-loader产生包含`eval()`的输出

来自分类Dev

Webpack:为什么'style-loader!css-loader!postcss-loader'不处理导入的文件?

来自分类Dev

Webpack:为什么'style-loader!css-loader!postcss-loader'不处理导入的文件?

来自分类Dev

webpack / babel / es6导入问题-(0,_whatwgFetch2.default)不是函数

来自分类Dev

ES6模块,babel / webpack。导入/导出语句不起作用

来自分类Dev

使用webpack和ts-loader重新导出ES6模块

来自分类Dev

角度业力测试指令错误:意外请求:GET

来自分类Dev

模块解析失败:使用babel-loader发生意外的令牌(9:37)

Related 相关文章

  1. 1

    意外的令牌导入(webpack es6)

  2. 2

    React.js-babel-loader-意外令牌

  3. 3

    简单的Webpack + React + ES6 + babel示例不起作用。意外的令牌错误

  4. 4

    webpack + babel-反应,意外的令牌“导入”

  5. 5

    Webpack 和 Babel-Loader - 对象 Rest Operator 上的意外令牌,安装了 transform-object-rest-spread 插件

  6. 6

    babel-loader,webpack,ES2015模块:“元素类型无效”

  7. 7

    Webpack babel-loader es2015 预设设置不起作用

  8. 8

    Webpack,Babel:ES6导入与Fabric.js的需求

  9. 9

    Webpack loader摆脱了es6 / 7中的括号

  10. 10

    Webpack loader摆脱了es6 / 7中的括号

  11. 11

    Webpack无法解析全局安装的babel或babel-loader

  12. 12

    业力无法加载导入的文件

  13. 13

    业力无法加载导入的文件

  14. 14

    Webpack Babel加载错误-未捕获的SyntaxError:意外的令牌导入

  15. 15

    将ES7异步/等待与节点,Webpack和babel-loader一起使用时出错

  16. 16

    Webpack,React,JSX,Babel-意外令牌<

  17. 17

    Webpack,React,JSX,Babel-意外令牌<

  18. 18

    业力Webpack源图不起作用

  19. 19

    Webpack 2 sass-loader 意外字符“@”

  20. 20

    使用webpack和babel-loader编译时出错

  21. 21

    带有babel-loader的Webpack无法识别JSX代码

  22. 22

    webpack + babel-loader产生包含`eval()`的输出

  23. 23

    Webpack:为什么'style-loader!css-loader!postcss-loader'不处理导入的文件?

  24. 24

    Webpack:为什么'style-loader!css-loader!postcss-loader'不处理导入的文件?

  25. 25

    webpack / babel / es6导入问题-(0,_whatwgFetch2.default)不是函数

  26. 26

    ES6模块,babel / webpack。导入/导出语句不起作用

  27. 27

    使用webpack和ts-loader重新导出ES6模块

  28. 28

    角度业力测试指令错误:意外请求:GET

  29. 29

    模块解析失败:使用babel-loader发生意外的令牌(9:37)

热门标签

归档