2017-03-23 12 views
0
글로벌

로 webworker을 노출하고, 우리는 내가 내려고 빙빙 돌고 있었어요 현재 require('worker-loader?inline!downloadTrackWorker')웹팩이 내가 반응/REDUX 응용 프로그램에 대한 테스트를 작성하기 위해 노력하고있어

를 통해 수입 webworkers의 무리가 이 코드를 분리하는 방법을 알아내어 webworker를로드하는 데 문제가없는 node.js에서 테스트를 실행할 수 있습니다.

내가 한 가지 해결책은 내 웹팩에 웹 근로자를 전 세계에 노출시키는 것이고, 이는 내 테스트에서 스텁이나 모의를 정의 할 수 있음을 의미합니다. 내 웹팩 설정에서

, 내가 추가 한

module: { 
    loaders: [...], 
    rules: [{ 
     test: require.resolve(APP_DIR + '/helpers/downloadTrackWorkerLoader'), 
     loader: 'expose-loader', 
     options: 'DownloadTrackWorker' 
    }] 
} 

내 trackWorkerLoader 내가 또한 inline없이 위를 해봤 단순히

const DownloadTrackWorker = require('worker-loader?inline!./downloadTrackWorker.js'); 

module.export = DownloadTrackWorker; 

이지만, 행운.

두 가지 문제가 있습니다.

  1. 내 콘솔 DownloadTrackWorker을 찾아 내 업데이트 webpack.config와
  2. 정의되지 않은, 내가 웹팩이

    ReactDOM.render(
        <Provider store={store}> 
        <Player /> 
        </Provider>, 
        document.getElementById('root') 
    ); 
    
에서 may need appropriate loader을 구문 분석 할 수없는 오류가 발생

내가 잘못하고있는 것에 대한 제안 사항이 있습니까? 내가 보는 이슈가 관련되어 있다는 생각이 들었다.

+0

Webpack은 전역을 노출시키지 않습니다. 그래서 당신은 항상'DownloadTrackWorker'를 정의하지 않을 것입니다. 'importTrackWorker를 "path-to/trackWorkerLoader"에서 여러분이 사용하는 파일에 가져와야합니다. –

+0

@ApoorvJoshi 나는 이것을 오해하고 있습니까? https://github.com/webpack-contrib/expose-loader 노출 로더를 사용하고 있습니다. 그것은 그것이 세계적인 범위에 추가된다고 말한다. 그러므로 나는 포함 할 필요가 없다. – pedalpete

답변

1

내 콘솔에서 DownloadTrackWorker을 찾아, 그것은 Readme - Usage에서 expose-loader 노트로

정의되지 않은, 당신은 번들에 포함되므로 노출하기 위해 가져와야합니다. 규칙은 아무것도 포함하지 않고 테스트를 만족하는 앱의 가져 오기에 적용됩니다. 그 외에도 로더를 올바른 파일에 적용하지 않습니다. 당신은 expose-loadertrackWorkerLoader.js에 적용 할, 그래서 올바른 규칙은 다음과 같습니다이 올바르게 세계적으로 DownloadTrackWorker 노출됩니다

require('./path/to/helpers/trackWorkerLoader'); 

:

{ 
    test: require.resolve(APP_DIR + '/helpers/trackWorkerLoader'), 
    loader: 'expose-loader', 
    options: 'DownloadTrackWorker' 
} 

이제 당신이 앱에 어딘가에을 가져와야 변수가 있지만 module.exports 대신 trackWorkerLoader.js에 오타가있는 경우 module.export이 있습니다. 현재 실제로 아무것도 내보내고 있지 않습니다.그것은해야한다 :

대신에 (자신의 선택에 대해 이야기하지 않음) requireworker-loader를 인라인 당신은 또한 규칙으로 정의 할 수의
module.exports = DownloadTrackWorker; 

:

{ 
    test: require.resolve(APP_DIR + '/helpers/downloadTrackWorker'), 
    loader: 'worker-loader', 
    options: { 
     inline: true 
    } 
} 

그리고 지금 당신은 단순히없이 필요할 수 있습니다 trackWorkerLoader.js에 로더를 지정할 필요 : 내 업데이트 웹팩와

const DownloadTrackWorker = require('./downloadTrackWorker'); 

module.exports = DownloadTrackWorker; 

의 .config, 나는 웹팩 당신은 동시에 두 module.loadersmodule.rules을 정의하고 적절한 로더에게

이 필요할 수 있습니다 구문 분석 할 수 없습니다 오류가 발생합니다. 호환성을 위해 module.loaders이 여전히 존재하지만 module.rules이 있으면 완전히 무시됩니다. 따라서 이전에 구성한 로더가 적용되지 않습니다. 모든 규칙을 module.rules으로 옮기십시오.

+0

당신은 '규칙들'에 대해 옳았습니다. 마이클, 감사합니다. 가져올 필요에 따라 어쩌면 내가 문서를 잘못 읽었을 수도 있지만, 구체적으로'설정 파일에 다음과 같이 설정할 수 있습니다 :'라고 말합니다. 나는 수입에 대한 대안으로 그것을 의미했다. 그것은 나의 목적에 잘 어울릴 것이다. 나는 그 잘못을 정말로 읽고 있니? 이상하게도 내 색인에서 가져 오기 및 하위 파일에서 호출 할 때도 'DownloadTrackWorker'는 여전히 정의되지 않습니다. – pedalpete

+0

아니요, 설정 파일에서 지정하는 것은'require ('expose-loader? options! ./ file.js')와 같이 인라이닝 대신 사용할 수 있습니다. 나는'expose-loader'에 대한 대답을 정교하게하고'worker-loader'를 인라이닝하는 대안을 추가했습니다. 이것은 정확히'expose-loader'를위한 것이 었습니다. 'trackWorkerLoader'와'downloadTrackWorkerLoader'를 사용하는 오타 였을 수도 있습니다 만, 어쨌든 당신이 가져올 항목을 분명히하기 위해 언급했습니다. –

+0

이 마이클을 명확히 해 주셔서 고마워요, 안타깝게도, 내 번들로 작업자를 참조 할 필요가 없도록 전 세계를 만들려고 할 때 잘못된 트리를 짖고 있음을 의미합니다. 이렇게하면 쉽게 테스트 할 수 있습니다. 감사합니다 – pedalpete