2016-12-21 9 views
0

나는 Karma 테스트 러너에 대해 느린 "부팅"시간을 경험했으며 실행을 프로파일 링 한 후, 가장 큰 속도 저하가 소스 맵 생성으로 인해 발생한다는 것을 깨달았습니다.karma-webpack에서 공급 업체 코드의 소스 맵을 작성하지 못하게하는 방법은 무엇입니까?

좀 더 구체적으로 말하자면, 전처리기로 karma-webpack과 webpack을 사용하고 있기 때문에, 테스트 파일이 karma에 의해로드 될 때마다, webpack에 피드 맵을 생성합니다.

내 앱과 공급 업체 코드를 분할/청크하지 않았기 때문에 각 테스트 파일은 동일한 공급 업체 소스 맵 (인라인 됨)을 얻고있었습니다.

node_modules/ 개의 파일에 대한 소스 매핑을 단순히 방지함으로써이 문제를 해결할 수 있다고 생각했지만 입력 소스/모듈 파일이 아닌 최종 애셋 파일을 기반으로하여 소스 매핑 된 파일 만 제외 할 수 있음을 알게되었습니다.

그래서 this 플러그인을 사용하면 각 공급 업체 모듈을 수동으로 나열하는 대신 앱과 공급 업체 코드를 별도의 청크로 자동 분할 할 수 있습니다. ReferenceError: Can't find variable: webpackJsonp

내가 공급 업체 및 응용 프로그램 코드가있는 분할 있음이이 카르마는 사실을 따기되지 않은 사실로 인해 발생 확신 : 카르마를 실행할 때

는 그러나 나는이 오류가 발생하기 시작 별도의 청크로 작성되므로 files 옵션 (예 : 벤더 파일이 아닌 테스트 파일 자체)으로 구성된 코드 만 포함됩니다.

files 설정 옵션을 구문 분석하고 처리하는 경우 카르마에 대해 알고하지 않기 때문에 각 테스트 파일, 나는 그것이 files 옵션 공급 업체 청크를 지정할 수 생각하지 않습니다 의미, 사전 처리 전에 같이 보인다 그것은 그것을 (너무 일찍) 찾으려고 할 당시에. 내가 볼 수

유일한 해결 방법은 다음과 같습니다

  • 변화는 공급 업체 및 응용 프로그램 청크 파일의 분리를 처리 할 수 ​​있도록 카르마이 구현되는 방법.
  • karma-webpack을 사용하고 사전 처리하는 대신 테스트 모드에서 응용 프로그램을 빌드 한 다음 테스트 빌드 디렉토리의 Karma를 실행하여 공급 업체 청크가 충분히 빠를 수 있도록하십시오.

내가 놓친 해결책이 있습니까?

나는 그것이 일반적인 문제로 보이지 않는 것이 이상하다는 것을 안다.

편집 한

나는 this를 찾았지만 사람들은 웹팩 설정에 여러 진입 점의 사용 (즉, 응용 프로그램에 대한 하나 및 공급 업체에 대한 하나)이 제안되어있다. 나는 이것이 카르마와 함께 작동하는지 시험해 볼 것이지만, 여전히 당신이 vendor 배열에 넣은 것을 수동으로 추적해야한다는 큰 단점 (내 의견으로는)이있다. 나는. 패키지를 설치할 때마다 배열에 배열을 추가해야하며 그 반대의 경우도 마찬가지입니다.나는 (반면 그 것이다 webpack-split-by-path 플러그인) 공급 업체의 파일을 제외 소스 맵 웹팩 플러그인을 구성하기 전에

편집 2

합니다 (웹팩 설정에서) 여러 진입 점을 사용하여도 작동하지 않습니다.

"먼저 빌드 한 다음 테스트"방법을 구현하려고합니다.

답변

0

다른 사람들이이 문제를 겪는다면 별도의 빌드 및 테스트 명령을 사용하여 karma-webpack 및 카르마 사전 처리를 포기한 "빌드 후 나머지"접근 방식을 사용할 수 있습니다. .

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.config.babel.test.js)에 고유 한 내 웹팩 설정입니다 청크를 생성 할 때 응용 프로그램을 공급 업체 코드와 자동으로 구분하는 플러그인 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 설정 옵션에 먼저 나열하고 테스트 파일 다음에 시청하지 않도록 설정되어 있습니다. 이렇게하면 공급 업체 코드가 항상 각 테스트 케이스별로로드/삽입됩니다.

내 질문에 다른 방법이 있는지 묻는 있지만이 접근법을 꽤 잘 작동합니다. 성능이 훨씬 좋습니다.

편집 한

(I 처음에는 몰랐어요)이 방법의 유일한 단점은 당신이 karma-webpack 및 사전 처리를 할 수 당신이 정말로 (테스트 관찰을 달성 할 수 없다는 것입니다 by webpack) 빌드 및 테스트 단계의 분리 때문입니다. 2

이 접근

편집 (당신이 추가/벤더 라이브러리을 제거하지 않은 경우에도 ) 당신이 당신의 응용 프로그램 코드를 변경 재 transpiling 공급 업체 코드의 문제에서 모든 시간을 겪었다. 이것은 느리게 물건을 느리게했다.

는 당신이 다시보고 테스트를 시작 할 수 있도록이 문제를 해결하기 위해 어떻게하고 싶은 것은 이것이다 : 시계 모드에서

  1. 실행 웹팩, 당신의 dist-test/ 디렉토리 때마다 응용 프로그램 코드 변경으로 구축 할 수 있습니다.
  2. 시계 모드에서 카르마를 실행하여 dist-test/ 디렉토리에서 업데이트되는 모든 테스트 파일을 가리 킵니다.

이 솔루션은 하나의 단점을 제외하고는 하나의 npm/yarn 명령에서이 두 가지를 모두 실행할 수 없다는 점을 제외하고는 완벽합니다.

참고 : Webpack 테스트 빌드의 출력 파일 이름에 해시 (예 :파일 이름은 내용 변경간에 일관성을 유지해야합니다. 이렇게하면 테스트 파일을 변경할 때 Webpack이 이전 파일을 삭제하지 않기 때문에 이전 테스트 코드와 새 테스트 코드를 실행하지 않게됩니다..