如果其他人遇到这个问题,我得到了“构建然后休息”的方法,即我放弃了karma-webpack
Karma 预处理,转而支持单独的构建和测试命令(它们一个接一个地运行)。
这是我的特定于测试的 webpack 配置(例如 webpack.config.babel.test.js):
import webpack from 'webpack';
import { join, resolve, parse } from 'path';
import SplitByPathPlugin from 'webpack-split-by-path';
import file from 'file';
const plugins = [
new SplitByPathPlugin([
{
name: 'vendor',
path: resolve(__dirname, 'node_modules')
}
]),
new webpack.SourceMapDevToolPlugin({
test: /\.jsx?$/,
exclude: [/vendor/]
})
];
const entryPoints = {};
const testFileRegex = new RegExp('\.test\.jsx?$');
const pathPrefixRegex = new RegExp('^src/js/?');
file.walkSync('src/js/', (dirPath, dirs, files) => {
for (const file of files) {
if (file.match(testFileRegex)) {
const parsedPath = parse(file);
const entryKey = join(
dirPath.replace(pathPrefixRegex, ''),
parsedPath.name
);
entryPoints[entryKey] = './' + join(dirPath, parsedPath.name);
}
}
});
const config = {
entry: entryPoints,
output: {
filename: '/[name]-[chunkhash].js',
chunkFilename: '/[name]-[chunkhash].js',
path: resolve(__dirname, 'dist-test'),
pathinfo: true
},
module: {
loaders: [
{
test: /\.jsx?$/,
loader: 'babel-loader!eslint-loader',
exclude: [/node_modules/],
},
{
test: /\.json$/, loader: 'json'
}
],
},
bail: true,
resolve: {
extensions: ['', '.js', '.jsx', '.json'],
},
plugins: plugins,
stats: {
assets: false,
cached: false,
children: false,
chunks: false,
chunkModules: false,
chunkOrigins: false,
hash: false,
modules: false,
publicPath: false,
reasons: false,
source: false,
timings: false,
version: false,
warnings: false
},
node: {
child_process: 'empty',
fs: 'empty'
},
externals: {
'react/addons': true,
'react/lib/ExecutionEnvironment': true,
'react/lib/ReactContext': 'window'
}
};
export default config;
关键部分是它为每个测试文件创建一个入口点,并webpack-split-by-path
在生成块时使用插件自动将应用程序与供应商代码分开。
这是我使用的业力配置:
process.env.BABEL_ENV = 'test';
function karmaConfig(config) {
config.set({
basePath: '',
frameworks: ['mocha'],
files: [
{
pattern: 'dist-test/vendor-*.js',
watched: false
},
'dist-test/**/*.test-*js?(x)'
],
exclude: [],
reporters: ['progress'],
port: 9876,
colors: true,
browsers: ['Firefox', 'Chrome'],
singleRun: true,
logLevel: config.LOG_ERROR
})
}
export default karmaConfig;
关键部分是供应商文件在files
配置选项中首先列出并设置为不被监视,然后是测试文件。这确保了供应商代码总是首先为每个测试用例加载/插入。
我的问题是问是否有另一种方法,但这种方法效果很好。性能要好得多。
编辑 1
这种方法的唯一缺点(一开始我没有意识到)是你不能真正实现测试观察,因为你可以使用karma-webpack
和预处理(通过 webpack),因为构建和测试的解耦脚步。
编辑 2
这种方法会遇到每次更改应用程序代码时重新编译供应商代码的问题(即使您没有添加/删除任何供应商库)。这让事情变得多余。
您想要解决此问题并能够再次开始测试观看是这样的:
dist-test/
在监视模式下运行 Webpack,以便在应用程序代码更改时构建到您的目录中。
- 以监视模式运行 Karma,指向目录中正在更新的所有测试文件
dist-test/
。
这个解决方案是完美的,除了一个缺点,你不能在一个 npm/yarn 命令中运行这两个东西。
注意:Webpack 测试构建的输出文件名不应包含任何哈希(即文件名应在其内容更改之间保持一致)。这样当您更改测试文件时,您不会运行旧的和新的测试代码(因为 Webpack 不会删除旧文件)。.