资讯专栏INFORMATION COLUMN

vue-cli配置webpack dll

justCoding / 2708人阅读

摘要:一缓存失效改变了的一点儿代码,打包的就会改变导致每次发布,的缓存都会失效。为了解决上述问题,在网上查找资料后,找到使用这个方案。三对比结果优化前笔记本上打包时间为,优化后笔记本打包时间为,同时也增加了这些库的缓存。

问题

在前端项目中,我们希望第三方库(vendors)和自己写的代码可以分开打包,vue-cli也帮我们配好了webpackCommonsChunkPlugin,但是在使用vue-cli的打包的过程中有一些痛点。

一、verdors缓存失效

改变了app.js的一点儿代码,verdors打包的chunkhash就会改变,导致每次发布,vendors的缓存都会失效。这样增加了用户的流量消耗和首屏加载时间。

二、项目打包时间过长

在公司的台式机打包一次要花费30s,在个人笔记本上则需要花费40s之多。

为了解决上述问题,在网上查找资料后,找到使用 webpack dll这个方案。

解决过程  一、编写dll配置文件

先贴上我的webpack.dll.conf.js配置代码

var path              = require("path");
var webpack           = require("webpack");
var config            = require("../config")
var ExtractTextPlugin = require("extract-text-webpack-plugin"); // 提取css
var AssetsPlugin = require("assets-webpack-plugin"); // 生成文件名,配合HtmlWebpackPlugin增加打包后dll的缓存
module.exports        = {
  entry: {
    libs: [
      "vue-infinite-scroll",
      "vue-cookie",
      "jquery",
      "iscroll",
      "weui.js",
      "video.js",
      "babel-polyfill",
      "resetcss",
      "font-awesome/css/font-awesome.min.css",
      "video.js/dist/video-js.min.css",
    ]
  },
  output: {
    path: path.resolve(__dirname, "../public"),
    filename: "[name].[chunkhash:7].js",
    library: "[name]_library"
  },
  plugins: [
    new webpack.DllPlugin({
      path: path.resolve(__dirname, "../public/[name]-mainfest.json"),
      name: "[name]_library",
      context: __dirname // 执行的上下文环境,对之后DllReferencePlugin有用
    }),
    new ExtractTextPlugin("[name].[contenthash:7].css"),
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: false
      },
    }),
    new AssetsPlugin({
      filename: "bundle-config.json",
      path: "./public"
    }),
  ],
  module: {
    rules: [
      {
        test: /.css$/,
        use: ExtractTextPlugin.extract({
          fallback: "style-loader",
          use: "css-loader"
        })
      },
      {
        test: /.(png|jpe?g|gif|svg)(?.*)?$/,
        loader: "url-loader",
        query: {
          limit: 10000,
          name: "img/[name].[hash:7].[ext]"
        }
      },
      {
        test: /.(woff2?|eot|ttf|otf)(?.*)?$/,
        loader: "url-loader",
        query: {
          limit: 10000,
          name: "fonts/[name].[hash:7].[ext]"
        }
      }
    ]
  },
}

1、entry配置需要dll打包的库

2、module配置处理对应文件类型的loader

3、增加 webpack.DllPlugin插件

1、path:生成mainfest.json文件的绝对路径。mainfest.json里面的内容为所有被打包到dll.js文件模块id的映射。

2、namewebpack打包时mainfest.json包含的库的暴露出来的函数名名

3、contenxt(可选):引入manifest文件的context,默认为webpackcontext

二、修改webpack.base.conf.js

webpack.base.conf.jsplugins增加

new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require("../public/libs-mainfest.json") // 指向生成的manifest.json
    }),

注:上面提到通过AssetsPluginHtmlWebpackPlugin给打包的dll.js各dll.css增加缓存机制

AssetsPlugin生成的bundle-config.js

{"libs":{"js":"libs.f7d8ef0.js","css":"libs.e2245d7.css"}}

webpack.dev.conf.js文件增加以下代码

var bundleConfig = require("../public/bundle-config.json")
new HtmlWebpackPlugin({
      filename: "index.html",
      template: "index.html",
      inject: true,
      libJsName:bundleConfig.libs.js, 
      libCssName:bundleConfig.libs.css,
      env:config.dev.env,

    }),

index.html引入生成的dll.js,dll.css

  
  

上面为开发环境的配置,生产环境对应修改就可以了。

增加build.dll.js文件,

var path              = require("path");
var utils             = require("./utils")

var webpack           = require("webpack");
var config            = require("../config")
var utils             = require("./utils")
var dllConfig         = require("./webpack.dll.conf");
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var AssetsPlugin      = require("assets-webpack-plugin");

var chalk = require("chalk")
var rm                = require("rimraf")
var ora = require("ora")
var spinner = ora({
  color: "green",
  text: "正为生产环境打包dll包,耐心点,不然自动关机。。。"
})
spinner.start()
rm(path.resolve(__dirname, "../public"),  err => {
  if (err) throw err
  webpack(dllConfig,function (err, stats) {
    spinner.stop()
    if (err) throw err
    process.stdout.write(stats.toString({
          colors: true,
          modules: false,
          children: false,
          chunks: false,
          chunkModules: false
        }) + "

")

    console.log(chalk.cyan("  dll打包完成.
"))
  })
});

然后在package.json script中加上"build:dll": "node build/buildDll.js"

注:开发和生产环境都要首先使用 webpack运行webpack.dll.conf.js生成dll.js, dll.css, mainfest.json文件,每次改变库文件也都需要重新执行一遍。

三、对比结果

优化前笔记本上打包时间为4000ms,
优化后笔记本打包时间为1800ms,同时也增加了这些库的缓存。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83476.html

相关文章

  • vue-cli配置预编译

    摘要:转载文章公司的平台功能越堆越多,打包也越来越费劲,一次十几分钟,运维很不爽,捣鼓了一下预编译,试了一下大概缩短了七八分钟,目前感觉还行,现在把它记下来,给需要的童鞋当做参考,也给自己记录一下。 (转载文章)公司的平台功能越堆越多,打包也越来越费劲,一次十几分钟,运维很不爽,so捣鼓了一下预编译,试了一下大概缩短了七八分钟,目前感觉还行,现在把它记下来,给需要的童鞋当做参考,也给自己记录...

    KnewOne 评论0 收藏0
  • 基于vue-cliwebpack配置优化

    摘要:使用打包的基本上都是独立库文件,这类文件有一个特性就是变化不大。修改往添加一个配置只针对的模块化有效配置文件详情请点击 基于vue-cli优化的webpack配置 大概分为以下几点 通过 externals 配置来提取常用库,引用外链 配置CommonsChunkPlugin提取公用代码 (vue-cli已做) 善用alias(vue-cli配置了一部分) 启用DllPlugin和D...

    caohaoyu 评论0 收藏0
  • Vue-cli3 简qian易yi教程

    摘要:原文地址对于没有了解过的童鞋,建议先去看看官方的教程传送门新版本的新特性插件使用的插件,可以很快的搭建一个项目的结构。使用时直接引入即可。的界面让管理项目变得更加简单。如迁移过程中有任何疑问,可以留言一起探讨。 原文地址 对于没有了解过 vue-cli3 的童鞋,建议先去看看官方的教程: 传送门 新版本的新特性 1. 插件 使用 cli 的插件,可以很快的搭建一个项目的结构。如 ax...

    jemygraw 评论0 收藏0
  • Vue-cli3 项目配置 Vue.config.js

    摘要:搭建的项目界面想对之前较为简洁之前的和文件夹不见了,那么应该如何配置如等的配那只需要在项目的根目录下文件是根目录,不是目录语法基本路径输出文件目录是否在保存的时候检查配置配置项生产环境是否生成文件相关配置是否使用分离插件 Vue-cli3 搭建的项目 界面想对之前较为简洁 showImg(https://segmentfault.com/img/bVbesOu?w=320&h=222)...

    Betta 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<