Webpack.config index.html을 dist 폴더에 복사하는 방법


189

/ dist로 들어가는 자산을 자동화하려고합니다. 다음과 같은 config.js가 있습니다.

module.exports = {
  context: __dirname + "/lib",
  entry: {
    main: [
      "./baa.ts"
    ]
  },
  output: {
    path: __dirname + "/dist",
    filename: "foo.js"
  },
  devtool: "source-map",
  module: {
    loaders: [
      {
        test: /\.ts$/,
        loader: 'awesome-typescript-loader'
      },
      { test: /\.css$/, loader: "style-loader!css-loader" }
    ]
  },
  resolve: {
    // you can now require('file') instead of require('file.js')
    extensions: ['', '.js', '.json']
  }
}

또한 webpack을 실행할 때 / lib 옆에있는 디렉토리의 / dist 폴더에 main.html을 포함하고 싶습니다. 어떻게해야합니까?

업데이트 1 2017_____________

내가 가장 좋아하는 방법 html-webpack-plugin은 템플릿 파일과 함께 사용하는 것 입니다. 받아 들인 답변 덕분에! 이 방법의 장점은 인덱스 파일에 캐시 된 js 링크가 상자에서 추가된다는 것입니다!

답변:


162

옵션 1

당신의에서 index.js파일 (예 : 웹팩 항목)은 당신을 필요로 추가 index.html를 통해 파일 로더 플러그인, 예를 들면 :

require('file-loader?name=[name].[ext]!../index.html');

webpack으로 프로젝트를 빌드 index.html하면 출력 폴더에 있습니다.

옵션 2

index.html이 전혀 없도록 html-webpack-plugin 을 사용하십시오 . 간단히 웹팩이 파일을 생성하도록합니다.


2
어떻게 든 구성 파일 자체에 무언가를 작성하여로드 할 수 있습니까?
codeVerine

첫 번째 방법을 시도하고 파일을 복사했습니다. 그러나 복사 한 CSS가 올바르게 작동하지 않았습니다. (Handsontable을 웹팩과 함께 사용할 수 없기 때문에 웹팩 외부에 필요했습니다.)
Vaccano

CSS의 경우 @Vaccano에서는이 방법을 사용하지 않아야합니다. 스타일 로더와 CSS 로더를 사용하십시오. 여기를 참조하십시오 : stackoverflow.com/questions/34039826/…
VitalyB

4
webpack v2에서는 분명히 -loader접미사를 생략 할 수 없습니다 . 예를 들면require('file-loader?name=[name].[ext]!../index.html');
overthink

1
@codeVerine 예, webpack 구성 파일 { test: /index\.html/, loader: 'file-loader', query: { name: '[name].[ext]' }loaders배열에 비슷한 것을 추가하여 사용 하면 webpack-dev-server가 서비스를 제공 할 수 없었기 때문에 404를 요청할 수 있습니다 /(루트는 존재하지 않습니다) !).
Brian McCutchon 2012

67

VitalyB의 답변에 옵션을 추가하겠습니다.

옵션 3

npm을 통해. npm을 통해 명령을 실행하면 package.json 에이 설정 을 추가 할 수 있습니다 (webpack.config.js도 확인하십시오). run을 개발 npm start하기 위해 웹 서버가 소스 파일 디렉토리에서 실행되고 bundle.js가 동일한 위치에서 사용 가능하기 때문에이 경우 index.html을 복사 할 필요가 없습니다 (bundle.js는 메모리에만 있지만 index.html과 함께있는 것처럼 사용할 수 있습니다). 프로덕션 실행 npm run build을 위해 dist 폴더에는 bundle.js가 포함되며 index.html은 아래에서 볼 수 있듯이 오래된 cp 명령으로 복사됩니다.

"scripts": {
    "test": "NODE_ENV=test karma start",
    "start": "node node_modules/.bin/webpack-dev-server --content-base app",
    "build": "NODE_ENV=production node node_modules/.bin/webpack && cp app/index.html dist/index.html"
  }

업데이트 : 옵션 4

복사 웹팩 - 플러그인은 이에 설명 된대로 유래 답변

그러나 일반적으로 index.html과 같은 첫 번째 파일과 큰 이미지 또는 비디오와 같은 더 큰 자산을 제외하고는 CSS, html, 이미지 등을 앱에 직접 require포함 시키십시오. (로더 및 플러그인으로 올바르게 설정 한 후).


11
옵션 3은 옵션 1이어야합니다
Gil Epshtain

2
옵션 3을 시도했지만 index.html의 핫 리로드가 작동하지 않았습니다. index.html을 자주 편집하지 않습니까? 심각한 질문입니다.

3
크로스 OS 개발 환경을 지원하려면 cp 대신 ncp 를 사용하십시오.
Vivek Maharajh

33

CopyWebpackPlugin을 사용할 수 있습니다 . 다음과 같이 작동합니다.

module.exports = {
  plugins: [
    new CopyWebpackPlugin([{
      from: './*.html'
    }])
  ]
}

Webpack은 번들링뿐만 아니라 다른 많은 빌드 관련 작업을 통해 Gulp와 Grunt를 대체 했으므로이 솔루션은 대부분의 프로젝트에서 본 것입니다. 스크립트 package.json는 테스트 실행기 또는 개발자 서버 시작과 같은 간단한 작업에만 사용됩니다.
Robert Jack Will

15

나는 대답은 말할 수 없다 : 당신은 할 수 없다. (또는 최소한 :해서는 안됩니다). 이것은 Webpack이해야 할 일이 아닙니다. Webpack은 번 들러이며 다른 작업에는 사용해서는 안됩니다 (이 경우 정적 파일 복사는 다른 작업 임). 그런 작업을 수행하려면 Grunt 또는 Gulp와 같은 도구를 사용해야합니다. Webpack을 Grunt 작업 또는 Gulp 작업 으로 통합하는 것이 매우 일반적 입니다. 둘 다 grunt-contrib-copy 또는 gulp-copy 와 같이 파일을 복사하는 데 유용한 다른 작업이 있습니다 .

(가 아닌 index.html) 다른 자산의 경우 Webpack과 함께 번들로 묶을 수 있습니다. 예를 들면 다음과 같습니다 var image = require('assets/my_image.png');. 그러나 귀하의 index.html요구가 번들의 일부가 아니어야 한다고 가정 하므로 번 들러에게는 적합하지 않습니다.


59
나는 정확하게 웹팩에 갔으므로 grunt 나 gulp를 사용할 필요가 없습니다. 다른 대안이 있습니까? gulp를 사용해야하는 경우 왜 webpack을 사용해야합니까?
SuperUberDuper

4
문제는 거꾸로 있습니다. grunt 또는 gulp를 사용할 수있는 경우 왜 webpack을 사용해야합니까? 그들은 매우 좋은 작업 / 빌드 시스템입니다. 웹팩 (또는 browserify 또는 r.js)은 많은 JS 파일 (및 기타 리소스)을 하나의 큰 (또는 여러) 자바 스크립트 번들로 번들링하는 데 사용할 수있는 도구입니다. 작업에 올바른 도구를 사용해야합니다. 다시 말하지만, 웹팩, browserify 또는 grunt 또는 gulp에서 다른 번 들러를 실행하는 것이 매우 일반적입니다.
Brodie Garnet

1
웹팩은 여러 가지 방법으로이를 수행 할 수 있습니다. 당신은 사용할 수 있습니다 file-loader당신이 그것을 필요로 할 때 당신에게 URL을 제공하는 기본적으로 그냥 복사 출력 디렉토리에 파일 / 이미지 : var url = require('myFile');. 내가 말했듯이 번들은 하나 이상의 파일이 될 수 있습니다 .
Brodie Garnet

1
brocolli를 부모 빌드 프로세스로 사용할 수 있습니다
SuperUberDuper

1
이것은 나에게 정답입니다. 대규모 / 복잡한 프로젝트에서 웹팩 빌드 성능은 중요한 고려 사항입니다. 다양한 파일 복사 플러그인은 웹팩에 불필요한 비용을 추가하여 웹팩이 JS 번들링에 집중할 수 있도록하는 것이 더 좋습니다.
Evi Song

14

항목 구성에 직접 색인을 추가하고 파일 로더를 사용하여 색인을로드 할 수 있습니다

module.exports = {

  entry: [
    __dirname + "/index.html",
    .. other js files here
  ],

  module: {
    rules: [
      {
        test: /\.html/, 
        loader: 'file-loader?name=[name].[ext]', 
      },
      .. other loaders
    ]
  }

}

5

기존 index.html파일을 dist디렉토리에 복사하려면 소스 를 템플리트 로 지정하여 HtmlWebpackPlugin 을 사용하면 됩니다 .index.html

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  // ...
  plugins: [    
    new HtmlWebpackPlugin({
      template: './path/to/index.html',
    })
  ],
  // ...
};

작성된 dist/index.html파일은 기본적으로 소스 파일과 동일하며 .js 파일<script> 과 같은 번들 자원 에는 webpack에 의해 태그 가 삽입 된다는 차이점이 있습니다. 축소 및 추가 옵션을 구성 할 수 있으며 github에 문서화되어 있습니다.


3

이것은 Windows에서 잘 작동합니다.

  1. npm install --save-dev copyfiles
  2. 에서 package.jsonI 복사 작업이 :"copy": "copyfiles -u 1 ./app/index.html ./deploy"

이렇게하면 내 index.html이 앱 폴더에서 배포 폴더로 이동합니다.


나는 거기에 대한 답변을 사용하여 작동합니다 : stackoverflow.com/questions/38858718/…
IsraGab

3

index.html 만 가져 오려면 @hobbeshunter의 대답을 확장하려면 CopyPlugin을 사용할 수도 있습니다. 다른 패키지를 사용하는 것 보다이 방법을 사용하는 주된 동기는 모든 단일 유형에 대해 많은 패키지를 추가하고 구성하는 등의 악몽이기 때문입니다. 가장 쉬운 방법은 모든 것에 CopyPlugin 을 사용 하는 것입니다.

npm install copy-webpack-plugin --save-dev

그때

const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  plugins: [
    new CopyPlugin([
      { from: 'static', to: 'static' },
      { from: 'index.html', to: 'index.html', toType: 'file'},
    ]),
  ],
};

보시다시피 전체 정적 폴더와 모든 내용을 dist 폴더에 복사합니다. CSS 나 파일 또는 다른 플러그인이 필요하지 않습니다.

이 방법은 모든 것에 적합하지는 않지만 간단하고 빠르게 작업을 수행 할 수 있습니다.


-1

나는 또한 발견 쉽게 충분히 일반에 넣어index.html 파일dist/ 디렉토리 및 추가 <script src='main.js'></script>index.html내 번들 웹팩 파일을 포함 할 수 있습니다. webpack의 conf 파일main.js 에 다른 것을 지정하지 않으면 번들의 기본 출력 이름 인 것 같습니다 . 나는 그것이 장기적이고 좋지 않은 해결책이라고 생각하지만 웹 팩 이 어떻게 작동 하는지 이해하는 데 도움이되기를 바랍니다 .

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