webpack打包优化(vue)

:使用 vue-cli 自动构建的项目,没有webpack的设置文件;需要更改webpack 设置可以在vue.config.js中进行修改

configureWebpack:返回一个对象

chainWebpack:函数的链式操作

const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')

const path = require('path')

function resolve(dir){

  return path.join(__dirname,dir)

}

module.exports = {

publicPath: './', // router hash 模式使用

  outputDir: 'dist',//输出内容的文件夹

  assetsDir: 'static',//编译内容的文件夹

  productionSourceMap: false,// 打包时不会生成 .map 文件,加快打包速度 

  lintOnSave: false ,//关闭格式检查

  devServer: { // 开发服务器

    host: needHost,

    port: port,

    open: false,

    overlay: {

      warnings: false,

      errors: true

    },

    proxy: {

      '/api': {

        target: 'xxxxxxx',

        secure: false,

        changeOrigin: true, //是否跨域

        logLevel: 'debug',

        pathRewrite: {

          '^/api': '' // pathRewrite 表示的意思是 把/api 替换为空

        }

      }

    }

  },

  configureWebpack: {

      optimization: {

        runtimeChunk: true

    },

     plugins: [

       new ScriptExtHtmlWebpackPlugin({

         inline: /runtime~.+\.js$/  //正则匹配runtime文件名

       })

     ]

  },

  chainWebpack: config => {

// set preserveWhitespace  

  config.module     

 .rule('vue')     

 .use('vue-loader') 

 .loader('vue-loader')      

.tap(options => {        

options.compilerOptions.preserveWhitespace = true       

 return options     

 })      .end()

 config.when(process.env.NODE_ENV === 'development', config => config.devtool('cheap-source-map')) // 设置调试查看源代码

    config.optimization.splitChunks({

      chunks:'all',

      cacheGroups:{

        commons:{

          name:'chunk-commons',

          test:resolve('src/components'),

          minChunks:3,

          priority:5,

          reuseExistingChunk:true

        },

        libs:{

          name:'chunk-libs',

          chunks:'initial',

          test:/[\\/]node_modules[\\/]/,

          priority:10

        }

      }

    })

    config.plugin('preload')

      .tap(args => {

        args[0].fileBlacklist.push(/runtime~.+\.js$/) //正则匹配runtime文件名,去除该文件的preload

        return args

      })

  }

}

工具模块

const path = require('path')

function resolve(dir){

return path.join(__dirname,dir)

}

基础配置

publicPath: './', // router hash 模式使用

  outputDir: 'dist',//输出内容的文件夹

  assetsDir: 'static',//编译内容的文件夹

  productionSourceMap: false,// 打包时不会生成 .map 文件,加快打包速度 

  lintOnSave: false ,//关闭格式检查

开发服务器代理

  devServer: { // 开发服务器

    host: needHost,

    port: port,

    open: false,

    overlay: {

      warnings: false,

      errors: true

    },

    proxy: {

      '/api': {

        target: 'xxxxxxx',

        secure: false,

        changeOrigin: true, //是否跨域

        logLevel: 'debug',

        pathRewrite: {

          '^/api': '' // pathRewrite 表示的意思是 把/api 替换为空

        }

      }

    }

  },

快捷引用

// resolve.alias 设置引入别名
config.resolve.alias

      .set('@', resolve('src'))

      .set('assets', resolve('src/assets'))

      .set('api', resolve('src/api'))

      .set('views', resolve('src/views'))

      .set('components', resolve('src/components'))

preserveWhitespace  

vue打包保留标签的空白

cheap-source-map

根据环境变量, 设置调试查看源代码

/*

  source-map:  一种 提供源代码到构建后代码映射 技术 (如果构建后代码出错,可以通过映射追踪到源代码错误)

  格式:[inline- | hidden- | eval-][nosources-][cheap-[module-]]source-map

    可以任意排列,但[]的顺序不能乱

  具体介绍

  source-map: 在外部生成一个文件

    在控制台会显示 错误代码准确信息 和 源代码的错误位置

  inline-source-map: 内嵌到bundle.js中

    只生成一个source-map

    在控制台会显示 错误代码准确信息 和 源代码的错误位置

  hidden-source-map: 外部

    错误代码错误原因,源代码的错误位置

    不能追踪源代码错误,只能提示到构建后代码的错误位置

  eval-source-map: 内嵌

    每一个文件都生成对应的source-map

    错误代码准确信息,源代码的错误位置

  nosources-source-map: 外部

    错误代码准确信息,没有任何源代码信息

  cheap-source-map: 外部

    错误代码准确信息,源代码的错误位置

    只能精准到行

  cheap-module-source-map: 外部

    错误代码准确信息,源代码的错误位置

    module会将loader的source-map加入

    内嵌与外部的区别: 1.外部生成单独的文件,内嵌没有 2.内嵌构建速度快

    这么多source-map如何选择?

    开发环境:速度快,调试更友好

      速度快( eval>inline>cheap>··· )

        组合eval-cheap-source-map > eval-source-map

      调试更友好

        source-map > cheap-module-source-map > cheap-source-map

      最终结果:cheap-module-source-map 和 eval-source-map (vuecli与react脚手架默认)

    生产环境:源代码要不要隐藏?调试要不要更友好

      内嵌会让代码体积变大,所以在生产环境下不用内嵌

      nosources-source-map  全部隐藏

      hidden-source-map  只隐藏源代码,会提示构建后代码错误信息

      最终结果:source-map 和 cheap-module-source-map

*/

runtimeChunk

根据路由驱动页面的 runtime 代码默认情况是包含在 build 后的 app.hash.js 内的,如果我们改动其他路由,就会导致 runtime 代码改变。从而不光我们改动的路由对应的页面 js 会变,含 runtime 代码的 app.hash.js 也会变,对用户体验是非常不友好的。

为了解决这个问题要设定 runtime 代码单独抽取打包;

script-ext-html-webpack-plugin

但是 runtime 代码由于只是驱动不同路由页面的关系,代码量比较少,请求 js 的时间都大于执行时间了,所以使用 script-ext-html-webpack-plugin 插件将其内链在 index.html 中比较友好。所有这两个一般配合使用。

configureWebpack:

optimization: {

        runtimeChunk: true

    },

    plugins: [

      new ScriptExtHtmlWebpackPlugin({

        inline: /runtime~.+\.js$/  //正则匹配runtime文件名

      })

    ]

chainWebpack:

  config

    .plugin('ScriptExtHtmlWebpackPlugin')

    .after('html')

    .use('script-ext-html-webpack-plugin', [

      {

        // `runtime` must same as runtimeChunk name. default is `runtime`

        inline: /runtime\..*\.js$/

      }

    ])

    .end()

    config.optimization.runtimeChunk('single')

splitChunks

如果使用了某些长期不会改变的库,像 element-ui ,打包完成有 600 多 KB ,包含在默认 vendor 中显然不合适,每次用户都要加载这么大的文件体验不好,所以要单独打包:

chainWebpack:

 config.optimization.splitChunks({

        chunks: 'all',

        cacheGroups: {

          commons: {

            name: 'chunk-commons',

            test: resolve('src/components'), // can customize your rules

            minChunks: 3, //  minimum common number

            priority: 5,

            reuseExistingChunk: true

          },

          libs: {

            name: 'chunk-libs',

            chunks: 'initial', // only package third parties that are initially dependent

            test: /[\\/]node_modules[\\/]/,

            priority: 10

          },

          elementUI: {

            name: 'chunk-elementUI',

            priority: 20,

            test: /[\\/]node_modules[\\/]_?element-ui(.*)/

          },

        }

      })

preload 预加载

提前预加载提高切换路由的体验

config.plugin('preload').tap(() => [

      {

        rel: 'preload',

        fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],

        include: 'initial'

      }

    ])

    config.plugins.delete('prefetch')

这里要把 runtime 代码的 preload 去掉。

环境配置

.env.production 线上环境打包 // vue-cli-service serve 

.env.test  测试环境打包 // vue-cli-service test:unit

.env.development 开发环境打包  // vue-cli-service build 和 vue-cli-service test:e2eo

.emv.staging 使用mode 打包  -- vue-cli-service -- mode staging

.env.local. 本地环境变量,会被 git 忽略上传

环境变量

NODE_ENV、BASE_URL、VUE_APP_  开头的变量才能通过 webpacl.DefinePlugin静态的嵌入到客户端的代码中

 html-webpack-plugin

会处理 public/index.html 文件。在构建过程中,资源链接会被自动注入。

可以配置多页面入口:

{

  entry: 'index.js',

  output: {

    path: __dirname + '/dist',

    filename: 'index_bundle.js'

  },

  plugins: [

    new HtmlWebpackPlugin(), 

    new HtmlWebpackPlugin({  

      filename: 'test.html',

      template: 'src/assets/test.html'

    })

  ]

}

可以修改默认参数:

Options:{

title:

filename:

.....

}

config导出

导出vue默认webpack设置

vue inspect > output,js

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

推荐阅读更多精彩内容