webpack 多頁面配置

webpack 配置介紹刁俭。

entry:打包入口,在這里的js文件以及在里面被引用的文件會被webpack 找到 打包韧涨。

module:模塊 最常用的就是配置各種加載器 表示進(jìn)行轉(zhuǎn)換時牍戚,應(yīng)該使用哪個 loader。

output:打包輸出配置虑粥,輸出在哪里如孝,輸出的命名規(guī)則等。

plugins:插件配置娩贷,這個大大加強(qiáng)了webpack的靈活性第晰,現(xiàn)在已經(jīng)有大量的 人貢獻(xiàn)的插件。

項目結(jié)構(gòu)


image.png

entry配置

entry 參數(shù)有多種彬祖,可以 字符串茁瘦,對象 數(shù)組都可以。對象適合多頁面配置储笑,字符串?dāng)?shù)組適合單頁應(yīng)用甜熔。

這里主要介紹下多頁面。拿我們的項目 為例突倍,一個文件夾為一個頁面單位腔稀,js html都在此文件夾里面

首先 使用node 的 fs模塊 遍歷頁面文件夾 找到里面的 index.js, 拼上 文件夾名稱 組成鍵值對羽历,

    // 找出page 下面文件夾 組裝entry入口配置
    let entry = {};
    // 獲取目錄下所有文件夾名稱(包含文件),有必要的話可以判斷是不是文件夾
    const directories = (fs.readdirSync(filePath) || []);
    directories.filter((item) => {
        // 找到頁面文件夾之后 再找到里面的 index.js 組成鍵值對
        const jsPath = `${config.pageBasePath}/${item}/index.js`;
        if (fs.existsSync(jsPath)) {
            entry[item] = jsPath;
        }
    });
    return entry;

組成如下的 鍵值對入口配置

    {  
        pageName: 'xx/xx/index.js'
    }

plugins 插件

生成頁面配置

由于多頁面 我們需要找到 每一個頁面 并輸出焊虏。

    // 找出 所有的頁面文件夾名
    const directories = (fs.readdirSync(filePath) || []);
    // 遍歷所有的頁面 組裝打包輸出的 html 配置
    const htmlPlugin = directories.map((item) => {
        // 業(yè)余頁面 主頁地址
        const htmlPath = `${config.pageBasePath}/${item}/index.tpl`;
        if (fs.existsSync(htmlPath)) {
            // 組裝 打包html 參數(shù)
            return new HtmlWebpackPlugin({
                minify: false,
                template: htmlPath, //
                filename: `${item}.html`, // 生成的html頁面的名字為one.html `${item}.html`
                title: 'one', //它的title為one,記得要在src/one.html中加入<%= %>
                hash: true,
                chunks: [item] // chunks主要用于多入口文件秕磷,選擇你要使用那些js文件
            })
        }
    });
    return htmlPlugin;

HtmlWebpackPlugin 打包 html插件配置:

title: 用來生成頁面的 title 元素
filename: 輸出的 HTML 文件名炕淮,默認(rèn)是 index.html, 也可以直接配置帶有子目錄。
template: 模板文件路徑跳夭,支持加載器涂圆,比如 html!./index.html
inject: true | 'head' | 'body' | false  ,注入所有的資源到特定的 template 或者 templateContent 中,如果設(shè)置為 true 或者 body币叹,所有的 javascript 資源將被放置到 body 元素的底部润歉,'head' 將放置到 head 元素中。
favicon: 添加特定的 favicon 路徑到輸出的 HTML 文件中颈抚。
minify: {} | false , 傳遞 html-minifier 選項給 minify 輸出
hash: true | false, 如果為 true, 將添加一個唯一的 webpack 編譯 hash 到所有包含的腳本和 CSS 文件踩衩,對于解除 cache 很有用嚼鹉。
cache: true | false,如果為 true, 這是默認(rèn)值驱富,僅僅在文件修改之后才會發(fā)布文件锚赤。
showErrors: true | false, 如果為 true, 這是默認(rèn)值,錯誤信息會寫入到 HTML 頁面中
chunks: 允許只添加某些塊 (比如褐鸥,僅僅 unit test 塊)
chunksSortMode: 允許控制塊在添加到頁面之前的排序方式线脚,支持的值:'none' | 'auto' | 'dependency' |'manual' | {function} - default: 'auto'
excludeChunks: 允許跳過某些塊,(比如叫榕,跳過單元測試的塊) 

關(guān)于 chunksSortMode 推薦使用 manual 手動排序浑侥,按照chunks 數(shù)組的順序插入頁面。

壓縮js 配置

使用 webpack-parallel-uglify-plugin 進(jìn)行壓縮 可以多線程操作晰绎,效率更高

    new ParallelUglifyPlugin({
        // 傳遞給 UglifyJS 的參數(shù)
        sourceMap: true,
        uglifyJS: {
            output: {
                // 最緊湊的輸出
                beautify: false,
                // 刪除所有的注釋
                comments: false,
            },
            compress: {
                // 在UglifyJs刪除沒有用到的代碼時不輸出警告
                // 刪除所有的 `console` 語句寓落,可以兼容ie瀏覽器
                drop_console: true,
                // 內(nèi)嵌定義了但是只用到一次的變量
                collapse_vars: true,
                // 提取出出現(xiàn)多次但是沒有定義成變量去引用的靜態(tài)值
                reduce_vars: true,
            }
        },
    }),
環(huán)境變量配置

配置環(huán)境變量 在打包的時候 傳入?yún)?shù)控制。

        new webpack.DefinePlugin({
            'process.env': JSON.stringify(staticData)
        }),
打包代碼加入注釋(版權(quán)類的)
  new webpack.BannerPlugin('版權(quán)所有荞下,翻版必究'),

module loader配置

主要配置 css相關(guān)和 html相關(guān)的 loader伶选,

    module: {
        rules: [
            {
               test: /\.css$/,  // 正則匹配所有.css后綴的樣式文件
               use: ['style-loader', 'css-loader'], // 使用這兩個loader來加載樣式文件
               include: [
                    path.resolve(__dirname, './src') // 配置路徑 當(dāng)前l(fā)oader 只對某個路徑下的文件生效
               ],
            },
            {
                test: /\.less$/,
                use: ['style-loader','css-loader', 'less-loader']
            },
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,  // 優(yōu)化處理加快速度
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            },
            {
                test: /\.tpl$/,
                loader: 'art-template-loader',
            },
        ],
    },

也可以在項目里面 使用 require 加載文件指定loader; 會覆蓋上面的配置。
比如:

  require('style-loader!css-loader?modules!./styles.css');

output 輸出配置

path 打包之后的文件輸出目標(biāo)地址尖昏。
filename 輸出的文件命名規(guī)則考蕾。

    // 打包輸出配置
    output : {
        path : path.join(__dirname, 'build/sources'), // 打包輸出的路徑  打包后的文件存放的地方
        filename: '[name].bundle.js', // bundle  輸出之后的文件名 [hash].
        publicPath: 'sources/', // 規(guī)定所有已經(jīng)解析的文件目錄,url相對于index.html会宪。
    },

resolve 路徑別名配置

    // 配置路徑別名 
    resolve:{
        alias: {
            src: path.resolve(__dirname, "src/"),
            commonJs: path.resolve(__dirname, "src/scripts/common/"),
        }
    },

devtool 配置

devtool里的有7種SourceMap模式 開發(fā)環(huán)境使用 eval 比較方便

模式 解釋
eval 每個module會封裝到 eval 里包裹起來執(zhí)行,且會在末尾追加注釋 //@ sourceURL.
source-map 生成一個SourceMap文件.
hidden-source-map 和 source-map 一樣蚯窥,但不會在 bundle 末尾追加注釋.
inline-source-map 生成一個 DataUrl 形式的 SourceMap 文件.
eval-source-map 每個module會通過eval()來執(zhí)行掸鹅,并且生成一個DataUrl形式的SourceMap.
cheap-source-map 生成一個沒有列信息(column-mappings)的SourceMaps文件,不包含loader的 sourcemap(譬如 babel 的 sourcemap)
cheap-module-source-map 生成一個沒有列信息(column-mappings)的SourceMaps文件拦赠,同時 loader 的 sourcemap 也被簡化為只包含對應(yīng)行的巍沙。

devServer 配置服務(wù)參數(shù)

    devServer: {
        
        // 服務(wù)端口配置
        port: '8066',
        // 自定義請求頭數(shù)據(jù) Response Headers
        headers: {
            key: 'value'
        },
        // 熱更新配置
        contentBase: path.join(__dirname, 'build/'),
        publicPath: '/sources',
        hot: true,
        
        // 轉(zhuǎn)發(fā)配置
        proxy: {
            '/api': {
                target: 'http://localhost:3000',
                secure: false
            }
        }
    }

devServer 可以配置 代理轉(zhuǎn)發(fā),熱更新 服務(wù)端口等荷鼠。


話外:
npm install module-name -save 自動把模塊和版本號添加到dependencies部分
npm install module-name -save-dev 自動把模塊和版本號添加到devdependencies部分
dependencies 是生產(chǎn)環(huán)境使用句携。
devdependencies 是開發(fā)環(huán)境。
比如:
art-template jquery numeral 等第三方組件 是需要在生產(chǎn)環(huán)境使用的允乐,必須安裝到 dependencies 矮嫉。

style-loader sass-loader webpack 等 是在打包構(gòu)建時候需要,生產(chǎn)環(huán)境并不需要的 安裝到 devdependencies 牍疏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蠢笋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳞陨,更是在濱河造成了極大的恐慌昨寞,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異援岩,居然都是意外死亡歼狼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門享怀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羽峰,“玉大人,你說我怎么就攤上這事凹蜈∠弈” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵仰坦,是天一觀的道長履植。 經(jīng)常有香客問我,道長悄晃,這世上最難降的妖魔是什么玫霎? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮妈橄,結(jié)果婚禮上庶近,老公的妹妹穿的比我還像新娘。我一直安慰自己眷蚓,他們只是感情好鼻种,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沙热,像睡著了一般叉钥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篙贸,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天投队,我揣著相機(jī)與錄音,去河邊找鬼爵川。 笑死敷鸦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寝贡。 我是一名探鬼主播扒披,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼圃泡!你這毒婦竟也來了谎碍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤洞焙,失蹤者是張志新(化名)和其女友劉穎蟆淀,沒想到半個月后拯啦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡熔任,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年褒链,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疑苔。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡甫匹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惦费,到底是詐尸還是另有隱情兵迅,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布薪贫,位于F島的核電站恍箭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞧省。R本人自食惡果不足惜扯夭,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞍匾。 院中可真熱鬧交洗,春花似錦、人聲如沸橡淑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梁棠。三九已至置森,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掰茶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工蜜笤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留濒蒋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓把兔,卻偏偏與公主長得像沪伙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子县好,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351