webpack - 项目优化

Webpack学习笔记
webpack - 项目优化
webpack实现原理
webpack - loader
webpack - plugin
webpack - 项目优化2

cdn dllPlugin 代码分隔 splitChunk happypack

webpack-bundle-analyzer 代码分析插件

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')

module.exports = {
    mode: 'production',
    entry: {
        a: './src/a.js',
        b: './src/b.js'
    }, 
    plugins: [
        new BundleAnalyzerPlugin(), // 代码分析
        new HtmlWebpackPlugin()
    ]
}

运行npx webpack --config webpack.config.js会出现以下界面

image.png

面积越大,文件越大,可以对比较大的文件进行拆包,来加快页面加载速度

vue(vue-cli3)中的webpack-bundle-analyzer

使用npm run build --report启动,貌似并不需要配置,直接就能用?

在vue-cli3的 vue.config.js 中不可直接require(webpack),会编译失败,但引用它的子类没事,如 require('webpack/lib/ContextReplacementPlugin')

在 nuxt 中使用npx nuxt build --analyze(需要将 nuxt.config.js 中 build 下 analyze设为 true)

// vue-cli4中需要单独配置
chainWebpack: config => {
        config.plugin('webpack-bundle-analyzer').use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
    },

拆包 splitChunks

    optimization: {
        splitChunks: {
            chunks: 'async',  // 分离异步代码(import()) initial 同步代码  all 所有
            //   minSize: 30000,   // 超过30000B才分离
            //   maxSize: 0,
            //   minChunks: 1,     // 有一个文件引用就分离
            //   maxAsyncRequests: 5,          // 按需加载时最大并行请求数
            //   maxInitialRequests: 3,        // 入口点的最大并行请求数
            //   automaticNameDelimiter: '~',  // 分离出来的包的名字分隔符
            //   name: true,
            cacheGroups: {
                vendors: {
                    test: /[\\/]node_modules[\\/]/,   // node_modules 打包成一个文件
                    priority: -10                     // 优先级
                },
                default: {
                    minChunks: 2,
                    priority: -20
                }
            }
        }
    },

注释部分是默认值们。示例:

// a.js
import 'moment';
import './lib';

// b.js
import 'moment';
import './lib';

// lib.js
export default function () { return 'abc' }

// webpack.config.js
        chunks: 'initial'
node_modules 下的 moment被单独打成了一个包 vendors~a~b.js,lib.js 被打包成了 default~a~b.js

修改 cacheGroups,为 default~ a~b.js 指定名称:

            cacheGroups: {
                vendors: {
                    test: /[\\/]node_modules[\\/]/,   
                    priority: -10                     
                },
                mylib: {
                    filename: 'mylib.js',
                    minChunks: 2,
                    minSize: 0,
                    priority: -20
                }
            }

关于异步模块,在 a.js 和 b.js 中添加 import('./async_lib.js')(只有一行代码)但在页面中没有关于它的块,怀疑是因为它太小的原因,换成import('lodash')成功。尝试为vendors改名,但是提示

You are trying to set a filename for a chunk which is (also) loaded on demand. The runtime can only handle loading of chunks which match the chunkFilename schema. Using a custom filename would fail at runtime

难道是不能为异步模块改名?代码如下:

// a.js
import 'moment';
import './lib';
import('lodash')

// b.js
import 'moment';
import './lib';
import('lodash')

// lib.js
export default function () { return 'abc' }

// webpack.config.js
            chunks: 'all', 
            cacheGroups: {
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10
                },
                mylib: {
                    filename: 'mylib.js',
                    minChunks: 2,
                    minSize: 0,
                    priority: -20
                }
            }
2.js为异步模块lodash,改名失败

resolve 解析

// src/a.js
import '@/index';

// src/style/index.css
body { background: thistle; }
module.exports = {
    mode: 'development',
    entry: {
        a: './src/a.js',
    },
    resolve: {
        alias: {    // 别名
            '@': path.resolve(__dirname, 'src/style')
        },
        extensions: ['.js', '.css', '.json', '.jsx'],    // 扩展名查找顺序
        // 第三方模块查找路径(myLibs里放的个人模块)
        modules: [path.resolve(__dirname, 'node_modules'), 'myLibs'],

        // 指定package.json的入口字段,当别人引用我的包时?
        // 默认值为 ["browser", "module", "main"],纯node项目是 module
        mainFields: ['style', 'main'],   
        mainFiles: ['index', 'main']    // 解析目录时要使用的文件名
    }
}

不加 extensions 会提示找不到 @/index

devtool

  • source-map 源码映射,webpack打包后es6代码会被bebal成es5代码,在出现错误时,根据源码映射找到真实错误的(es6)代码。生产环境不要用!

  • cheap-module-source-map 开发环境使用,报错只指出行,不指出列

多线程打包 happypack

https://www.npmjs.com/package/happypack

兼容 ie

{
  "transpileDependencies": ["vconsole", "@vue"]
}

默认情况下 babel-loader 会忽略所有 node_modules 中的文件。如果你想要通过 Babel 显式转译一个依赖,可以在这个选项中列出来。

browserslist

// package.json
 "browserslist": [
    "> 1%",
    "last 2 versions",
    "iOS 7",
    "last 3 iOS versions"
  ]

在不同包之间共享 Node、浏览器版本 等的配置,比如 Autoprefixer、Babel 和 postcss-preset-env 等

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

推荐阅读更多精彩内容