Webpack.config如何仅将index.html复制到dist文件夹


188

我正在尝试自动化进入/ 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旁边目录中的main.html包含到/ dist文件夹中。我怎样才能做到这一点?

更新1 2017_____________

我现在最喜欢的方法是将html-webpack-plugin模板文件与一起使用。也要感谢大家接受的答案!这种方式的优势在于,索引文件还将开箱即用地添加了cachbusted js链接!

Answers:


161

选项1

在您的index.js文件(即webpack条目)中,index.html通过文件加载器插件向您添加需求,例如:

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

使用webpack构建项目后,index.html将位于输出文件夹中。

选项2

使用html-webpack-plugin完全避免使用index.html。只需让webpack为您生成文件即可。


2
我可以以某种方式加载它,在配置文件本身中写一些东西吗?
codeVerine

尝试了第一种方法,并复制了文件。但是我正在复制的CSS不能正常工作。(我需要它在webpack外部,因为Handsontable无法与webpack一起使用。)
Vaccano

@Vaccano for CSS,您不应使用此方法。使用样式加载器和css加载器,请参见此处:stackoverflow.com/questions/34039826/…–
VitalyB

4
在webpack v2中,您显然不能省略-loader后缀。例如require('file-loader?name=[name].[ext]!../index.html');
仔细考虑了

1
@codeVerine是的,通过向webpack配置文件中的数组添加类似内容{ test: /index\.html/, loader: 'file-loader', query: { name: '[name].[ext]' }来使用loaders,只有我无法让webpack-dev-server为其提供服务,很有趣的是,导致请求404 /(根不存在) !)。
Brian McCutchon '17

67

我将在VitalyB的答案中添加一个选项:

选项3

通过npm。如果通过npm运行命令,则可以将此设置添加到package.json中(也可以在此处检出webpack.config.js)。对于开发运行npm start,在这种情况下无需复制index.html,因为Web服务器将从源文件目录运行,并且bundle.js将在同一位置可用(bundle.js仅驻留在内存中,但是就像与index.html一起位于一样)。对于生产运行npm run build,dist文件夹将包含您的bundle.js,并使用良好的旧cp命令复制index.html,如下所示:

"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

有一个copy-webpack-plugin,如本Stackoverflow答案中所述

但是通常,除了第一个文件(如index.html)和较大的资产(如大图像或视频)外,通过css,html,images等直接包含在您的应用中,require并且webpack会为您提供该文件(好吧,在使用加载程序和可能的插件正确设置后)。


11
选项3应该是选项1
Gil Epshtain,

2
我尝试了选项3,但是热重载index.html无效。您不经常编辑index.html吗?严重的问题。
石头

3
如果您想支持跨OS开发环境,请使用ncp而不是cp
Vivek Maharajh 2016年

32

您可以使用CopyWebpackPlugin。它是这样工作的:

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

现在,Webpack不仅通过捆绑来替代Gulp和Grunt,而且还通过许多其他与构建相关的任务来替代了该解决方案,这就是我在大多数项目中所见的解决方案。脚本package.json仅用于简单的事情,例如启动测试运行器或开发服务器。
罗伯特·

15

我会说答案是:您不能。(或至少:您不应该)。这不是Webpack应该做的。Webpack是捆绑程序,不应将其用于其他任务(在这种情况下:复制静态文件是另一任务)。您应该使用Grunt或Gulp之类的工具来执行此类任务。将Webpack集成为Grunt任务Gulp任务是很常见的。它们都具有其他任务,这些任务可用于复制您描述的文件,例如grunt-contrib-copygulp-copy

对于其他资产(不是index.html),您可以将它们与Webpack捆绑在一起(这正是Webpack的用途)。例如,var image = require('assets/my_image.png');。但是我认为您的index.html需求不需要成为捆绑软件的一部分,因此对于捆绑软件而言,这不是工作。


59
我正是去了webpack,所以我不需要使用grunt或gulp。还有其他选择吗?如果需要使用gulp,为什么还要打扰webpack?
SuperUberDuper 2015年

4
这个问题是颠倒的。如果可以使用grunt或gulp,为什么还要使用webpack?它们是非常好的任务/构建系统。Webpack(或browserify或r.js)是可用于将大量JS文件(和其他资源)捆绑到一个大(或多个)javascript捆绑包中的工具。您应该为作业使用正确的工具。同样,从grunt或gulp运行webpack,browserify或其他捆绑程序是很常见的。
布罗迪·加内(Brodie Garnet)2015年

1
webpack有很多方法可以做到这一点。你可以使用file-loader它基本上只是将文件复制/图像输出目录,并为您的网址,当你需要它:var url = require('myFile');。如我所说,一个捆绑包可以是一个或多个文件。
布罗迪·加内(Brodie Garnet)2015年

1
我可能会使用
brocolli

1
这是对我的正确答案。在大型/复杂项目中,Webpack构建性能是一个重要的考虑因素。各种文件复制插件为webpack增添了不必要的成本,让webpack专注于JS捆绑是一个更好的主意。
艾薇·宋

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目录中,只需将源指定为模板即可使用HtmlWebpackPluginindex.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

如果只想使用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文件。main.js如果在webpack的conf文件中未指定其他名称,则似乎是捆绑软件的默认输出名称。我想这不是一个长期的好方法,但是我希望它可以帮助您了解Webpack的工作原理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.