如何在Webpack中创建多个页面?

时间:2017-06-15 02:59:57

标签: javascript node.js webpack pug webpack-dev-server

这看起来像是一个业余问题,但我在使用Webpack创建其他页面时遇到了麻烦

这是我的webpack.config.js文件

var HtmlWebpackPlugin = require('html-webpack-plugin')
var HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var webpack = require('webpack')
var path = require('path')

var isProd = process.env.NODE_ENV === 'production' // true or false
var cssDev = ['style-loader', 'css-loader', 'sass-loader']
var cssProd = ExtractTextPlugin.extract({
  fallback: 'style-loader',
  loader: ['css-loader', 'sass-loader'],
  publicPath: '/dist'
})
var cssConfig = isProd ? cssProd : cssDev

module.exports = {
  entry: {
    app: './src/app.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].bundle.js'
  },
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.js$/,
        use: 'eslint-loader',
        exclude: /node_modules/
      },
      {
        test: /\.scss$/,
        use: cssConfig
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: 'babel-loader'
      },
      {
        test: /\.pug$/,
        use: 'pug-loader'
      }
    ]
  },
  devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    hot: true,
    open: true
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Project Demo',
      hash: true,
      alwaysWriteToDisk: true,
      template: './src/index.pug'
    }),
    new HtmlWebpackHarddiskPlugin(),
    new ExtractTextPlugin({
      filename: 'app.css',
      disable: !isProd,
      allChunks: true
    }),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin()
  ]
}

基本上,我的配置文件目前使用HtmlWebpackPlugin从<{1}}文件夹中输入我的index.pug,然后输出 {{ 1}}进入src文件夹。

但是,如果我想创建不同的页面怎么办?例如,一个关于页面。

我知道如果我在index.html文件夹中创建dist,它将不会由Webpack处理,因为我已将其包含在我的配置文件中。但是,我不知道如何做到这一点。

我怎么能输入不同的pug文件,例如我about.pug文件夹中的src about.pug gallery.pug,然后拥有所有这些输出<{1}}我contact.pug文件夹中的src dist about.html

2 个答案:

答案 0 :(得分:3)

正如@Derek所提到的,您可以以编程方式生成HtmlWebpackPlugin个实例列表。

const path = require('path')
const fs = require('fs')

// Store .html file names in src/ in an array
const pages =
  fs
    .readdirSync(path.resolve(__dirname, 'src'))
    .filter(fileName => fileName.endsWith('.html'))

module.exports = {
  // Use .map() on the array of file names to map each file name
  // to the plugin instance, then spread the mapped array into
  // the plugins array.
  plugins: [
    ...pages.map(page => new HtmlWebpackPlugin({
      template: page,
      filename: page
    }))
  ]
 }

答案 1 :(得分:0)

我相信您可以创建HtmlWebpackPlugin的多个实例:

plugins: [
    new HtmlWebpackPlugin({
      title: 'Project Demo',
      hash: true,
      alwaysWriteToDisk: true,
      template: './src/index.pug'
    }),
    new HtmlWebpackPlugin({
      title: 'Page2',
      hash: true,
      alwaysWriteToDisk: true,
      template: './src/page2.pug'
    }),
...