【问题标题】:Karma + Webpack2: module parse failed and imports not foundKarma + Webpack2:模块解析失败并且找不到导入
【发布时间】:2017-10-28 11:42:06
【问题描述】:

我正在尝试使用 webpack2 为我的 React.js + Redux 项目编写测试来捆绑所有内容,我想使用 Karma + mocha 作为我的测试运行器。我已经设法按顺序获取了我的webpack.conf.jskarma.conf.js 文件并运行了简单的测试(以及编译我的包),但是只要测试有... 运算符或import 关键字,业力似乎就会窒息。

我的项目结构相当简单;配置文件位于项目的/,反应文件位于/components/,测试(名为*.test.js)位于/tests/。每当我使用 ... 包含测试时,我都会收到以下错误:

 Error: Module parse failed: /....../components/actions.jsx Unexpected token (5:2)
  You may need an appropriate loader to handle this file type.
  |
  | module.exports = {
  |   ...generatorActions,
  |   ...creatorActions
  | }
  at test/actions/actions.test.js:1088

如果我删除 ...,但保留导入语句,我会得到:

ERROR in ./components/actions.jsx
Module not found: Error: Can't resolve 'creatorActions' in '/..../components'
 @ ./components/actions.jsx 2:0-43
 @ ./test/actions/actions.test.js
Firefox 53.0.0 (Mac OS X 10.12.0) ERROR
  Error: Cannot find module "generatorActions"
  at test/actions/actions.test.js:1090

作为参考,文件actions.jsx 如下所示:

import generatorActions from 'generatorActions'
import creatorActions from 'creatorActions'

module.exports = {
  ...generatorActions,
  ...creatorActions
}

actions.test.js 看起来像这样:

const expect = require('expect')

const actions = require('../../components/actions.jsx')

describe('Actions', () => {
  it('Should exist', () => {
    expect(actions).toExist()
  })
})

我不明白的一个奇怪的事情是错误消息中的行(1088 和 1090)不能对应于 vanilla 文件,所以我只能假设它们对应于生成的 webpack 包 - 所以我相信 webpack 正在被调用。如果我完全注释掉actions.jsx 的内容,我已经通过了虚拟测试(一个简单的测试断言expect(1).toBe(1))。这是我的webpack.config.js

function buildConfig(env) {
  return require('./build/webpack/webpack.' + (env || 'dev') + '.config.js');
}

module.exports = buildConfig;

我的webpack.dev.config.js 看起来像:

var path = require('path');
var webpack = require('webpack');
const appRoot = require('app-root-path').path

module.exports = {
    context: path.resolve(appRoot, 'components'),
    devtool: 'eval',
    plugins: [
           new webpack.DefinePlugin({
            'process.env': {
                'NODE_ENV': JSON.stringify('development')
        }
    })
   ],
    entry: {
      app: './App.jsx',
    },
    output: {
      path: path.resolve(appRoot, 'public/'),
      filename: '[name].js'
    },
    resolve: {
      modules: [
        path.resolve(appRoot, "components"),
        path.resolve(appRoot, "components/common"),
        path.resolve(appRoot, "components/common/presentational"),
        path.resolve(appRoot, "components/common/components"),
        path.resolve(appRoot, "components/creator"),
        path.resolve(appRoot, "components/creator/actions"),
        path.resolve(appRoot, "components/creator/reducers"),
        path.resolve(appRoot, "components/creator/presentational"),
        path.resolve(appRoot, "components/creator/components"),
        path.resolve(appRoot, "components/generator"),
        path.resolve(appRoot, "components/generator/presentational"),
        path.resolve(appRoot, "components/generator/stateful"),
        path.resolve(appRoot, "components/generator/actions"),
        path.resolve(appRoot, "components/generator/reducers"),
        path.resolve(appRoot, "node_modules")
      ],
      extensions: ['.js', '.jsx']
    },
    module: {
      rules: [
        {
          test: /\.jsx?$/,
          exclude: /node_modules/,
          loader: 'babel-loader',
          query: {
            presets: [
              ["es2015", {modules: false}],
              'react',
              'stage-0',
              [
                "env", {"targets": {"browsers": ["last 2 versions"]}}
              ]
            ],
            plugins: [
              'syntax-dynamic-import',
              'transform-async-to-generator',
              'transform-regenerator',
              'transform-runtime',
              'babel-plugin-transform-object-rest-spread'
            ]
          }
        }
      ]
    }
  }

还有我的karma.conf

const webpackConfig = require('./webpack.config.js');

module.exports = function(config) {
  config.set({
    browsers: ['Firefox'],
    singleRun: true,
    frameworks: ['mocha'],

    files: [
      'test/**/*.test.js'
    ],

    preprocessors: {
      'test/**/*.js': ['webpack'],
      'components/**/*.js': ['webpack'],
      'components/*.js': ['webpack']
    },
    reporters: ['mocha'], //, 'coverage', 'mocha'],
    client:{
      mocha:{
        timeout: '5000'
      }
    },
    webpack: webpackConfig,

    webpackServer:{
      noInfo: true
    },
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: false,
    concurrency: Infinity
  })
}

【问题讨论】:

    标签: javascript reactjs mocha.js webpack-2 karma-mocha


    【解决方案1】:

    我终于明白了!我需要做的就是将我的karma.conf.js 中的const webpackConfig = require('./webpack.config.js'); 更改为const webpackConfig = require('./webpack.config.js')();

    【讨论】:

    • 这对我帮助很大!尽管就我而言,我不必使用require 作为函数。谢谢!
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2020-10-30
    • 2016-09-09
    • 2021-10-04
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多