webpack學習筆記(3)

1义图、HTML咽瓷、CSS和JS代碼壓縮

  • JS文件的壓縮
    webpack4內置了uglifyjs-webpack-plugin該壓縮插件
  • CSS文件的壓縮
    使用optimize-css-assets-webpack-plugin插件
    同時使用cssnano
    cnpm i optimize-css-assets-webpack-plugin -D
    cnpm i cssnano -D
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
new OptimizeCSSAssetsPlugin({
  assetNameRegExp: /\.css$/g,
  cssProcessor: require('cssnano')
})
  • html壓縮
  • cnpm i html-webpack-plugin -D
const HtmlWebpackPlugin = require('html-webpack-plugin')
new HtmlWebpackPlugin({
            template: path.join(__dirname, 'src/index.html'),
            filename: 'index.html',
            chunks: ['index'],
            inject: true,
            minify: {
                html5: true,
                collapseWhitespace: true,
                preserveLineBreaks: false,
                minifyCSS: true,
                minifyJS: true,
                removeComments: false
            }
        })

2、清理構建目錄

  • 通過npm scripts清理構建目錄
    rm -rf ./dist && webpack 或
    rimraf ./dist && webpack
  • 使用clean-webpack-plugin插件贸街,默認會刪除output指定的輸出目錄
    cnpm i clean-webpack-plugin -D
plugins: [
  new CleanWebpackPlugin()
]

3庵寞、PostCSS插件autoprefixer自動補全CSS前綴

image.png

CSS3屬性兼容性查詢

  • cnpm i postcss-loader autoprefixer -D 安裝依賴
{
              test: /.less$/,
              use: [
                // 'style-loader', // 和miniCssExtractPlugin.loader互斥
                MiniCssExtractPlugin.loader,
                'css-loader',
                'less-loader',
                {
                    loader: 'postcss-loader', 
                    options: {
                        plugins: () => [ 
                            require('autoprefixer')({
                                browsers: ["last 2 version", "> 1%", "iOS 7"]                       
                        
                            })
                        ]
                    }
                }
              ]
            },

4、移動端CSS px自動轉rem

W3C對rem的定義:font-size of the root element

  • cnpm i px2rem-loader -D 安裝依賴
  • cnpm i lib-flexible -S 安裝依賴
    頁面渲染時計算根元素的font-size值
  • 可以使用手淘的lib-flexible庫
{
              test: /.less$/,
              use: [
                // 'style-loader', // 和miniCssExtractPlugin.loader互斥
                MiniCssExtractPlugin.loader,
                'css-loader',
                {
                    loader: 'postcss-loader', 
                    options: {
                        plugins: () => [ 
                            require('autoprefixer')({
                                browsers: ["last 2 version", "> 1%", "iOS 7"]                       
                        
                            })
                        ]
                    }
                },
                {
                    loader: 'px2rem-loader',
                    options: {
                        remUnit: 75,
                        remPrecision: 8
                    }
                },
                'less-loader'
              ]
            },

px轉rem的demo有一個問題薛匪,search.less文件的代碼捐川,您只寫了一層{}的代碼,如果里面再嵌套一層{}逸尖,那么編譯的時候會報錯古沥,錯誤原因是先執(zhí)行了px2rem-loader編輯瘸右,less-loader在后面,module.rules 里less-loader應該寫在px2rem-loader后面

5岩齿、資源內聯(lián)的意義

代碼層面:

  • 頁面框架的初始化腳本
  • 上報相關打點
  • css內聯(lián)避免頁面閃動
    請求層面:減少http網絡請求
  • 小圖片或則字體內聯(lián)(url-loader)
    html內聯(lián)
  • cnpm i raw-loader@0.5.1 -D
    添加以下代碼會報錯
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
     ${ require('raw-loader!./meta.html') }
    <script>
        ${ require('raw-loader!babel-loader!../node_modules/_lib-flexible@0.3.2@lib-flexible/fiexible.js') }
    </script>
</head>

5太颤、多頁面應用打包通用方案

  • cnpm i glob -D
const glob = require('glob');
const setMPA = () => {
    const entry = {};
    const htmlWebpackPlugins = [];
    const entryFiles = glob.sync(path.join(__dirname, './src/*/index.js'));

    Object.keys(entryFiles)
        .map((index) => {
            const entryFile = entryFiles[index];
            // '/Users/cpselvis/my-project/src/index/index.js'

            const match = entryFile.match(/src\/(.*)\/index\.js/);
            const pageName = match && match[1];

            entry[pageName] = entryFile;
            htmlWebpackPlugins.push(
                new HtmlWebpackPlugin({
                    inlineSource: '.css$',
                    template: path.join(__dirname, `src/${pageName}/index.html`),
                    filename: `${pageName}.html`,
                    chunks: ['vendors', pageName],
                    inject: true,
                    minify: {
                        html5: true,
                        collapseWhitespace: true,
                        preserveLineBreaks: false,
                        minifyCSS: true,
                        minifyJS: true,
                        removeComments: false
                    }
                })
            );
        });

    return {
        entry,
        htmlWebpackPlugins
    }
}

const { entry, htmlWebpackPlugins } = setMPA();
module.exports = {
    entry: entry,
        plugins: [
        new MiniCssExtractPlugin({
            filename: '[name]_[contenthash:8].css'
        }),
        new OptimizeCSSAssetsPlugin({
            assetNameRegExp: /\.css$/g,
            cssProcessor: require('cssnano')
        }),
        new CleanWebpackPlugin()
    ].concat(htmlWebpackPlugins)

6、使用source map

作用:通過source map定位到源碼

eval: 使?用eval包裹模塊代碼
source map: 產?生.map?文件
cheap: 不不包含列列信息
inline: 將.map作為DataURI嵌?入龄章,不不單獨?生成.map?文件
module:包含loader的sourcemap


image.png
  • 開發(fā)環(huán)境調試設置devtool為source-map能看到源代碼,方便排查定位問題
    設置成cheap-source-map代碼出錯時只能定位到行的報錯信息
  • 生產環(huán)境設置成source-map會生成把.js.map和js
  • 生產環(huán)境設置成inline-source-map會把.js.map和js合并

7乞封、提取公共資源

  • cnpm i html-webpack-externals-plugin -D 安裝依賴
const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin')
plugins: [
       // 引入CDN做裙,縮小打包體積
   new HtmlWebpackExternalsPlugin({
     externals: [
       {
         module: 'react',
         entry: 'https://11.url.cn/now/lib/16.2.0/react.min.js',
         global: 'React',
       },
       {
         module: 'react-dom',
         entry: 'https://11.url.cn/now/lib/16.2.0/react-dom.min.js',
         global: 'ReactDOM',
       }
     ],
   })
]

<body>
   <div id="root"></div>
   <script type="text/javascript" src="https://11.url.cn/now/lib/16.2.0/react.min.js"></script>
   <script type="text/javascript" src="https://11.url.cn/now/lib/16.2.0/react-dom.min.js"></script>
</body>
</html>
  • 提取公共資源
htmlWebpackPlugins.push(
                new HtmlWebpackPlugin({
                    // 需要設置提取公共資源指向vendors位置
                    chunks: ['vendors', pageName],
                    inject: true,
                })
            );
optimization: {
        splitChunks: {
                        // 公共資源最小為minSize才可提取
            minSize: 0,
            cacheGroups: {
                commons: {
                                        // 提取文件夾名
                    name: 'commons',
                    chunks: 'all',
                                        // 至少minChunks處使用才可提取
                    minChunks: 2
                }
            } 
        }
    }

8、tree shaking(搖數(shù)優(yōu)化)

  • production生產環(huán)境下默認tree shaking是打開的其它均是未開啟

概念:1 個模塊可能有多個?方法肃晚,只要其中的某個?方法使?用到了了菇用,則整個?文件都會被打到 bundle ?里里?面去,tree shaking 就是只把?用到的?方法打?入 bundle 陷揪,沒?用到的?方法會在 uglify 階段被擦除掉。
使?用:webpack 默認?支持杂穷,在 .babelrc ?里里設置 modules: false 即可 · production mode的情況下默認開啟
要求:必須是 ES6 的語法悍缠,CJS 的?方式不不?支持

Tree-shaking 原理理
利利?用 ES6 模塊的特點: ·只能作為模塊頂層的語句句出現(xiàn)
· import 的模塊名只能是字符串串常量量
· import binding 是 immutable的 代碼擦除: uglify 階段刪除?無?用代碼

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耐量,隨后出現(xiàn)的幾起案子飞蚓,更是在濱河造成了極大的恐慌,老刑警劉巖廊蜒,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趴拧,死亡現(xiàn)場離奇詭異,居然都是意外死亡山叮,警方通過查閱死者的電腦和手機著榴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屁倔,“玉大人脑又,你說我怎么就攤上這事∪窠瑁” “怎么了问麸?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钞翔。 經常有香客問我严卖,道長,這世上最難降的妖魔是什么布轿? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任哮笆,我火速辦了婚禮来颤,結果婚禮上,老公的妹妹穿的比我還像新娘疟呐。我一直安慰自己脚曾,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布启具。 她就那樣靜靜地躺著本讥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲁冯。 梳的紋絲不亂的頭發(fā)上拷沸,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音薯演,去河邊找鬼撞芍。 笑死,一個胖子當著我的面吹牛跨扮,可吹牛的內容都是我干的序无。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼衡创,長吁一口氣:“原來是場噩夢啊……” “哼帝嗡!你這毒婦竟也來了?” 一聲冷哼從身側響起璃氢,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哟玷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后一也,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巢寡,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年椰苟,在試婚紗的時候發(fā)現(xiàn)自己被綠了抑月。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡尊剔,死狀恐怖爪幻,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情须误,我是刑警寧澤挨稿,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站京痢,受9級特大地震影響奶甘,放射性物質發(fā)生泄漏。R本人自食惡果不足惜祭椰,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一臭家、第九天 我趴在偏房一處隱蔽的房頂上張望疲陕。 院中可真熱鬧,春花似錦钉赁、人聲如沸蹄殃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诅岩。三九已至,卻和暖如春带膜,著一層夾襖步出監(jiān)牢的瞬間吩谦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工膝藕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留式廷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓芭挽,卻偏偏與公主長得像滑废,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袜爪,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容

  • http://blog.csdn.net/weizengxun/article/details/53448885 ...
    曉盧軒閱讀 619評論 0 0
  • 初始化項目 進入一個文件夾作為項目的根目錄 npm init 新建src, dist目錄策严,package.json...
    love_program閱讀 1,244評論 0 4
  • 非常感謝胖哥的博客和掘金小冊的技術分享,希望大家去下面的鏈接去查看原文饿敲,他們寫的非常好,都是多個項目經驗的總結9涿唷怀各!...
    示十閱讀 2,265評論 0 2
  • 全局安裝webpack 全局安裝webpack會有個問題,就是當你有兩個項目依賴于不同版本的webpack术浪,就會有...
    説好的妹紙呢閱讀 1,825評論 0 11
  • 這本書建議速讀瓢对,前三章可以快速瀏覽,后4章中的一些觀點值得參考胰苏。 【1】工作要深入 有四種深度哲學硕蛹,禁欲主義(完全...
    關七666閱讀 185評論 1 3