Webpack 구성에서 여러 출력 경로를 만드는 방법


165

누구나 webpack.config.js 파일에 여러 개의 출력 경로를 만드는 방법을 알고 있습니까? 나는 몇 가지 다른 글꼴 파일과 함께 제공되는 bootstrap-sass를 사용하고 있습니다. 나머지 파일들 :

    output: {
      path: __dirname + "/js",
      filename: "scripts.min.js"
    }

웹 팩이 출력하는 것과 확장명이 .woff .eot 등인 경우 확장 유형을 볼 수있는 곳에서 다른 출력 경로로 전환했는지 확인하고 싶습니다. 이게 가능해?

나는 약간의 인터넷 검색을하고 몇 가지 솔루션이 제공되는 github 에서이 문제를 발견했습니다 .

그러나 해시 방법을 사용하여 출력을 지정할 수있는 진입 점을 알아야하는 것처럼 보입니다.

var entryPointsPathPrefix = './src/javascripts/pages';
var WebpackConfig = {
  entry : {
    a: entryPointsPathPrefix + '/a.jsx',
    b: entryPointsPathPrefix + '/b.jsx',
    c: entryPointsPathPrefix + '/c.jsx',
    d: entryPointsPathPrefix + '/d.jsx'
  },

  // send to distribution
  output: {
    path: './dist/js',
    filename: '[name].js'
  }
}

* https://github.com/webpack/webpack/issues/1189

그러나 필자의 경우 글꼴 파일과 관련하여 입력 프로세스는 추상화되어 있으며 출력 만 알고 있습니다. 다른 파일이 변환되는 경우 내 로더가 처리 해야하는 알려진 지점이 있습니다. 이 단계가 어디에서 발생했는지 알아내는 방법이 있다면 해시 방법을 사용하여 출력 경로를 사용자 정의 할 수는 있지만 이러한 파일이 어디에 필요한지 알 수 없습니다.

답변:


221

webpack이 2016 년 6 월 현재 구성 당 하나의 출력 만 지원하기 때문에 동일한 문제가 있는지 확실하지 않습니다. 이미 Github 에서 문제를 보았습니다 .

그러나 멀티 컴파일러를 사용하여 출력 경로를 분리합니다 . (의 구성 객체 분리 webpack.config.js).

var config = {
    // TODO: Add common Configuration
    module: {},
};

var fooConfig = Object.assign({}, config, {
    name: "a",
    entry: "./a/app",
    output: {
       path: "./a",
       filename: "bundle.js"
    },
});
var barConfig = Object.assign({}, config,{
    name: "b",
    entry: "./b/app",
    output: {
       path: "./b",
       filename: "bundle.js"
    },
});

// Return Array of Configurations
module.exports = [
    fooConfig, barConfig,       
];

공통 구성이있는 경우 확장 라이브러리 또는 Object.assignES6 또는 {...}ES7의 스프레드 연산자를 사용할 수 있습니다 .


스 니펫을 실행하지 않았습니다. 오류나 오타가 발생할 수 있습니다.
Yeo

나는 당신의 발췌 문장을 실행하고 매력처럼 작동했습니다 ... 아무도 이것을 발견하지 못했습니다. 구성을 같은 방식으로 내보내지만 선언이 다릅니다. var config = {entry : SOURCE_DIR + '/index.jsx', ....} 다중 컴파일러도 사용하지 않았습니다. :-\
Aubergine

아니면 npm에서 webpack && cp 등 을 할 수 있습니까?
SuperUberDuper

1
그것은 원래 폴더 (자동 테스트가 있음)와 패키지를 구현하는 앱의 폴더 모두에 npm 패키지를 배포하는 데 매우 유용합니다. 이런 식으로 npm 다운로드 단계를 건너 뛰고 새 버전이 안정적이며 npm에 게시 될 준비가 될 때까지 업데이트 된 패키지 코드를 라이브 테스트 할 수 있습니다.
Adrian Moisa

<pre> <code> var config = {// TODO : 공통 구성 모듈 추가 : {},}; </ code> </ pre> module{}개체가 잘못되었습니다. 필요하지 않습니다. 그것은 연장됩니다 / 키워드와 같은 수준에서 통합 name, entry, output(귀하의 예제에서). <pre> <code> {모듈 : {모드 : "development", devtool : "source-map"}}, 이름 : "a", 항목 : "./a/app", 출력 : {path : "/ a ", filename :"bundle.js "}} </ code> </ pre>
Rob Waa

249

Webpack은 여러 개의 출력 경로를 지원합니다.

출력 경로를 입력 키로 설정하십시오. 그리고 name출력 템플릿으로 사용하십시오 .

웹팩 설정 :

entry: {
    'module/a/index': 'module/a/index.js',
    'module/b/index': 'module/b/index.js',
},
output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
}

생성됨 :

└── module
    ├── a
    │   └── index.js
    └── b
        └── index.js

4
내 경우에는 하나의 출력에 chunkhash가 포함되지 않기를 원합니다. 간단한 해결책이 있습니까? 감사.
raRaRa

1
@zhengkenghong 나는 생성 된 출력 경로가 필요하다고 생각 dist합니다. 따라서 module/a/index.js출력 경로 대신 경로가되어야합니다. module/a/dist/index.js그렇지 않으면 입력 파일을 대체합니다.
dance2die

1
@Sung dist폴더가 이미 출력 경로에 구성되어 있습니다. 그래서 생성 된 파일은 실제로 dist/module/a/index.js언급하지 않았습니다.
zhengkenghong

4
나는 이것이 webpack 4 문서의 답변이므로 받아 들일만한 대답이어야한다고 생각합니다. -> webpack.js.org/concepts/output/#multiple-entry-points

1
@raRaRa 파티에 늦었지만, output.filename여기 에 설명 된 대로 함수를 사용하여이를 수행 할 수 있습니다. webpack.js.org/configuration/output/#outputfilename
Thomas

22

동일한 수준의 깊이와 폴더 ​​구조를 가진 여러 출력 경로로 살 수 있다면 webpack 2 에서이 작업을 수행 할 수있는 방법이 있습니다 (webpack 1.x로 아직 테스트하지 않은 경우)

기본적으로 문서 규칙을 따르지 않으며 파일 이름의 경로를 제공합니다.

module.exports = {
    entry: {
      foo: 'foo.js',
      bar: 'bar.js'
    },

    output: {
      path: path.join(__dirname, 'components'),
      filename: '[name]/dist/[name].bundle.js', // Hacky way to force webpack   to have multiple output folders vs multiple files per one path
    }
};

이 폴더 구조를 취할 것입니다

/-
  foo.js
  bar.js

그리고 그것을

/-
  foo.js
  bar.js
  components/foo/dist/foo.js
  components/bar/dist/bar.js

@ccnixon "여전히 허용"에 대한 webpack.js.org/configuration/output/#outputfilename seach에 문서화되어 있습니다 .
John Henckel

3

나는 희망적으로 원하는 것을 할 수있는 플러그인을 작성했으며, 알려진 또는 알려지지 않은 진입 점 ( glob 사용 )을 지정하고 정확한 출력을 지정하거나 입력 파일 경로와 이름을 사용하여 동적으로 생성 할 수있는 플러그인을 작성했습니다 . https://www.npmjs.com/package/webpack-entry-plus


3

webpack.config 파일에서 구성 배열을 반환 할 수 있습니다. 그러나 아티팩트 사본을 프로젝트 문서의 폴더에 저장하려는 경우 웹팩으로 인해 코드 작성 시간이 전체 빌드 시간의 두 배가 두 배가되기 때문에 최적의 솔루션이 아닙니다.

이 경우 FileManagerWebpackPlugin 플러그인을 대신 사용하는 것이 좋습니다.

const FileManagerPlugin = require('filemanager-webpack-plugin');
// ...
plugins: [
    // ...
    new FileManagerPlugin({
      onEnd: {
        copy: [{
          source: './dist/*.*',
          destination: './public/',
        }],
      },
    }),
],

1

하나의 출력 경로 만 가질 수 있습니다.

문서에서 https://github.com/webpack/docs/wiki/configuration#output

컴파일 결과에 영향을주는 옵션. 출력 옵션은 Webpack에 컴파일 된 파일을 디스크에 쓰는 방법을 알려줍니다. 진입 점이 여러 개있을 수 있지만 출력 구성은 하나만 지정됩니다.

해시 ([hash] 또는 [chunkhash])를 사용하는 경우 일관된 모듈 순서를 가져야합니다. OccurenceOrderPlugin 또는 recordsPath를 사용하십시오.


감사. 누군가가 해결 방법을 생각해 낼 수있는 경우를 대비하여 Q를 떠날 것입니다.
spb

2 개의 출력 경로가 필요한 사용 사례는 무엇입니까? 2 개의 응용 프로그램 또는 1 개의 응용 프로그램 및 1 개의 모듈을 원하는 것처럼 들립니다.
ex-zac-

파일 로더에서 생성 된 출력 전용 프로젝트가 필요하다고 생각했는데 모두 프로젝트의 루트로 들어가는 반면 자체 폴더에 원했습니다. 아래 답변에 따라 로더 자체의 출력 경로를 리디렉션하는 것으로 나타났습니다.
spb

1
이것은 사실이 아닙니다. 기술적으로 하나의 출력 경로 만 지정할 수 있지만 항목 객체의 각 키에 적용되므로 여러 출력을 가질 수 있습니다.- webpack.js.org
concepts

0

실제로 파일 로더 모듈에서 index.js로 이동하여 내용이 방출되는 위치를 변경했습니다. 이것은 아마도 최적의 솔루션은 아니지만 다른 방법이있을 때 까지이 로더가 처리하는 것이 정확히 글꼴이기 때문에 알기 때문에 괜찮습니다.

//index.js
var loaderUtils = require("loader-utils");
module.exports = function(content) {
    this.cacheable && this.cacheable();
    if(!this.emitFile) throw new Error("emitFile is required from module system");
    var query = loaderUtils.parseQuery(this.query);
    var url = loaderUtils.interpolateName(this, query.name || "[hash].[ext]", {
        context: query.context || this.options.context,
        content: content,
        regExp: query.regExp
    });
    this.emitFile("fonts/"+ url, content);//changed path to emit contents to "fonts" folder rather than project root
    return "module.exports = __webpack_public_path__ + " + JSON.stringify( url) + ";";
}
module.exports.raw = true;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.