Webpack4.x 構(gòu)建多頁面打包(2019-01-25)

基礎請參考上篇入門: Webpack4.x 入門上手實戰(zhàn)(2018.08)

一、開始

根據(jù)入門篇構(gòu)建一個基礎的項目,在此基礎上進行升級艳丛,不再一一敘述,直接上代碼:

1趟紊、拆分配置文件:

可以根據(jù)自己的需求隨意拆分氮双,這里簡單舉例

在根目錄新建三個文件:webpack.config.jswebpack.entry.js霎匈、webpack.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 執(zhí)行入口文件
  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的圖片轉(zhuǎn)為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"
  }
}

二戴差、目錄結(jié)構(gòu)

src 文件夾里存放的就是多頁面的,根目錄的 index.htmlmain.js 請自行配置铛嘱,可用作多頁面跳轉(zhuǎn)

配置項目錄結(jié)構(gòu)

三暖释、打包后的目錄結(jié)構(gòu)

打包后的目錄結(jié)構(gòu)

四、細節(jié)上有不明白的可以留言 ~

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墨吓,一起剝皮案震驚了整個濱河市球匕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帖烘,老刑警劉巖亮曹,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚓让,居然都是意外死亡乾忱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門历极,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窄瘟,“玉大人,你說我怎么就攤上這事趟卸√愦校” “怎么了氏义?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長图云。 經(jīng)常有香客問我惯悠,道長,這世上最難降的妖魔是什么竣况? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任克婶,我火速辦了婚禮,結(jié)果婚禮上丹泉,老公的妹妹穿的比我還像新娘情萤。我一直安慰自己,他們只是感情好摹恨,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布筋岛。 她就那樣靜靜地躺著,像睡著了一般晒哄。 火紅的嫁衣襯著肌膚如雪睁宰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天寝凌,我揣著相機與錄音柒傻,去河邊找鬼。 笑死硫兰,一個胖子當著我的面吹牛诅愚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劫映,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼违孝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泳赋?” 一聲冷哼從身側(cè)響起雌桑,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祖今,沒想到半個月后校坑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡千诬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年耍目,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徐绑。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邪驮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傲茄,到底是詐尸還是另有隱情毅访,我是刑警寧澤沮榜,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站喻粹,受9級特大地震影響蟆融,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜守呜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一型酥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弛饭,春花似錦冕末、人聲如沸萍歉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枪孩。三九已至憔晒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔑舞,已是汗流浹背拒担。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攻询,地道東北人从撼。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像钧栖,于是被迫代替她去往敵國和親低零。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容