Webpack4.x 构建多页面打包(2019-01-25)

基础请参考上篇入门: Webpack4.x 入门上手实战(2018.08)

一、开始

根据入门篇构建一个基础的项目,在此基础上进行升级,不再一一叙述,直接上代码:

1、拆分配置文件:

可以根据自己的需求随意拆分,这里简单举例

在根目录新建三个文件:webpack.config.jswebpack.entry.jswebpack.plugins.js

webpack.config.js 是必备的配置文件


const path = require('path')
const entry = require('./webpack.entry.js')

const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require("extract-text-webpack-plugin")

const pluginsConfig = require("./webpack.plugins.js")
const pxtorem = require('postcss-pxtorem')
const autoprefixer = require('autoprefixer')

const optimizeCss = require('optimize-css-assets-webpack-plugin')

module.exports = {
  // JS 执行入口文件
  entry: entry,
  output: {
    // 把所有依赖的模块合并输出到一个 bundle.js 文件
    filename: './js/[name].bundle.js',
    // 输出文件都放到 superStyle 目录下
    path: path.resolve(__dirname, './superStyle'),
  },
  plugins: pluginsConfig,
  optimization: {
    // minimize: true,
    minimizer: [new optimizeCss({})],

  },
  devServer: {
    contentBase: './superStyle',
    port: 7777,
    host: '0.0.0.0',
    openPage: 'page'
  },
  module: {
    rules: [
        {
          test: /\.(png|jpg|gif|eot|svg|ttf|woff)$/,
          use:[{
            loader:'url-loader',
            options:{ 
                limit:2000, // 表示小于2kb的图片转为base64,大于5kb的是路径
                // outputPath:'../images', //定义输出的图片文件夹
                name: 'images/[name].[hash:7].[ext]',
                publicPath:"../"
            }
          }]
        },
        {
            test: /\.js$/,
            loader: 'babel-loader',
            exclude: /node_modules/
        },
        {
            test: /\.(css|less)$/,
            use: ExtractTextPlugin.extract({
                fallback: "style-loader",
                // publicPath:'../',
                use: [
                    // require.resolve('style-loader'),
                    {
                        loader: 'css-loader',
                        // options: {
                        //     importLoaders: n
                        // }
                    },
                    {
                        loader: 'postcss-loader',
                        options: {
                          ident: 'postcss',
                          plugins: () => [
                            pxtorem({
                              rootValue: 100,
                              propWhiteList: []
                            }),
                            require('postcss-flexbugs-fixes'),
                            autoprefixer({
                              browsers: [
                                'iOS >= 7',
                                'Android >= 4',
                                '>1%',
                                'Firefox ESR',
                                'not ie < 9'
                              ],
                              flexbox: 'no-2009'
                            })
                          ]
                        }
                    },
                    {
                        loader: 'less-loader',
                        options: { javascriptEnabled: true }
                    }
                ]
            })
        }
    ]
  }
};

webpack.entry.js 入口配置


module.exports = {
    index: './src/js/index.js',
    login: './src/js/login.js'
}

webpack.plugins.js 插件设置

const webpack = require("webpack")
const entry = require('./webpack.entry.js')

// 分离css  > extract-text-webpack-plugin@next
const ExtractTextPlugin = require("extract-text-webpack-plugin")
// 清除目录
const CleanWebpackPlugin = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require('html-webpack-plugin')
// 压缩
const optimizeCss = require('optimize-css-assets-webpack-plugin')

let html = []

Object.keys(entry).forEach(k => {
    let h = new HtmlWebpackPlugin({
        title: k,
        filename: `./page/${k}.html`,
        template: `./src/page/${k}.html`,
        inject: true,
        chunks: [k]
    })
    html.push(h)
})

module.exports = [
    new CleanWebpackPlugin(['superStyle']),
    new ExtractTextPlugin("./style/[name].css"),
    new optimizeCss({
        assetNameRegExp: /\.style\.css$/g,
        cssProcessor: require('cssnano'),
        cssProcessorOptions: { discardComments: { removeAll: true } },
        canPrint: true
    }),
    new HtmlWebpackPlugin({
        title: "",
        filename: `./index.html`,
        template: `./index.html`,
        inject: true,
        chunks: ['main']
    })
].concat(html)

package.json


{
  "name": "dive-into-webpack",
  "version": "1.0.0",
  "scripts": {
    "dev": "webpack-dev-server --open",
    "build": "webpack"
  },
  "dependencies": {},
  "devDependencies": {
    "autoprefixer": "^9.4.5",
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1",
    "clean-webpack-plugin": "^1.0.0",
    "css-loader": "^0.28.11",
    "extract-text-webpack-plugin": "^4.0.0-beta.0",
    "file-loader": "^3.0.1",
    "html-webpack-plugin": "^3.2.0",
    "less": "^3.9.0",
    "less-loader": "^4.1.0",
    "optimize-css-assets-webpack-plugin": "^5.0.1",
    "postcss-flexbugs-fixes": "^4.1.0",
    "postcss-loader": "^3.0.0",
    "postcss-pxtorem": "^4.0.1",
    "style-loader": "^0.18.2",
    "url-loader": "^1.1.2",
    "webpack": "^4.16.5",
    "webpack-cli": "^3.1.0",
    "webpack-dev-server": "^3.1.14"
  }
}

二、目录结构

src 文件夹里存放的就是多页面的,根目录的 index.htmlmain.js 请自行配置,可用作多页面跳转

配置项目录结构

三、打包后的目录结构

打包后的目录结构

四、细节上有不明白的可以留言 ~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容