成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

基于vue-cli的webpack配置優(yōu)化

caohaoyu / 632人閱讀

摘要:使用打包的基本上都是獨(dú)立庫(kù)文件,這類(lèi)文件有一個(gè)特性就是變化不大。修改往添加一個(gè)配置只針對(duì)的模塊化有效配置文件詳情請(qǐng)點(diǎn)擊

基于vue-cli優(yōu)化的webpack配置

大概分為以下幾點(diǎn)

通過(guò) externals 配置來(lái)提取常用庫(kù),引用外鏈

配置CommonsChunkPlugin提取公用代碼 (vue-cli已做)

善用aliasvue-cli配置了一部分)

啟用DllPluginDllReferencePlugin預(yù)編譯庫(kù)文件

happypack開(kāi)啟多核構(gòu)建項(xiàng)目

webpack-parallel-uglify-plugin來(lái)替換webpack本身的UglifyJS來(lái)進(jìn)行代碼壓縮混淆

升級(jí)webpack至3.x版本開(kāi)啟Scope Hoisting

externals

文檔地址 https://doc.webpack-china.org...

防止將某些 import 的包(package)打包到 bundle 中,而是在運(yùn)行時(shí)(runtime)再去從外部獲取這些擴(kuò)展依賴(lài)(external dependencies)。

CommonsChunkPlugin

文檔地址 https://doc.webpack-china.org...

CommonsChunkPlugin 插件,是一個(gè)可選的用于建立一個(gè)獨(dú)立文件(又稱(chēng)作 chunk)的功能,這個(gè)文件包括多個(gè)入口 chunk 的公共模塊。通過(guò)將公共模塊拆出來(lái),最終合成的文件能夠在最開(kāi)始的時(shí)候加載一次,便存起來(lái)到緩存中供后續(xù)使用。這個(gè)帶來(lái)速度上的提升,因?yàn)闉g覽器會(huì)迅速將公共的代碼從緩存中取出來(lái),而不是每次訪問(wèn)一個(gè)新頁(yè)面時(shí),再去加載一個(gè)更大的文件。

resolve.alias

文檔地址 https://doc.webpack-china.org...

創(chuàng)建 import 或 require 的別名,來(lái)確保模塊引入變得更簡(jiǎn)單。例如,一些位于 src/ 文件夾下的常用模塊:

DllPlugin和DllReferencePlugin

文檔地址 https://doc.webpack-china.org...

Dll打包以后是獨(dú)立存在的,只要其包含的庫(kù)沒(méi)有增減、升級(jí),hash也不會(huì)變化,因此線上的dll代碼不需要隨著版本發(fā)布頻繁更新。使用Dll打包的基本上都是獨(dú)立庫(kù)文件,這類(lèi)文件有一個(gè)特性就是變化不大。,只要包含的庫(kù)沒(méi)有升級(jí), 增減,就不需要重新打包。這樣也提高了構(gòu)建速度。

一般是用于打包階段

build文件夾下新建webpack.dll.conf.js文件

var path = require("path");
var webpack = require("webpack");
var AssetsPlugin = require("assets-webpack-plugin");
var CleanWebpackPlugin = require("clean-webpack-plugin");
var config = require("../config");
var env = config.build.env;

module.exports = {
  entry: {
    libs: [
      "babel-polyfill",
      "vue/dist/vue.esm.js",
      "vue-router",
      "vuex",
      "element-ui",
      "echarts",
      "mockjs",
    ],
  },
  output: {
    path: path.resolve(__dirname, "../libs"),
    filename: "[name].[chunkhash:7].js",
    library: "[name]_library",
  },
  plugins: [
    new webpack.DefinePlugin({
      "process.env": env,
    }),
    new webpack.DllPlugin({
      path: path.resolve(__dirname, "../libs/[name]-mainfest.json"),
      name: "[name]_library",
      context: __dirname, // 執(zhí)行的上下文環(huán)境,對(duì)之后DllReferencePlugin有用
    }),
    new ExtractTextPlugin("[name].[contenthash:7].css"),
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: false,
      },
    }),
    new AssetsPlugin({
      filename: "bundle-config.json",
      path: "./libs",
    }),
    new CleanWebpackPlugin(["libs"], {
      root: path.join(__dirname, "../"), // 絕對(duì)路徑
      verbose: true,
      dry: false,
    }),
  ],
  module: {
    rules: [
      {
        test: /.js$/,
        loader: "babel-loader",
      },
    ],
  },
};

build文件夾下新建build-dll.js文件

var path = require("path");
var webpack = require("webpack");
var dllConfig = require("./webpack.dll.conf");
var chalk = require("chalk");
var rm = require("rimraf");
var ora = require("ora");

var spinner = ora({
  color: "green",
  text: "building for Dll..."
});
spinner.start();
rm(path.resolve(__dirname, "../libs"), 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(" build dll succeed !.
"));
  });
});

修改webpack.prod.conf.js文件

var bundleConfig = require("../libs/bundle-config.json");
...
...
plugins: [
  // 增加DllReferencePlugin配置
  new webpack.DllReferencePlugin({
    context: __dirname,
    manifest: require("../libs/libs-mainfest.json") // 指向生成的manifest.json
  }),
  ...
  ...
  new HtmlWebpackPlugin({
    ...
    // 增加兩個(gè)變量
    libJsName: bundleConfig.libs.js,
    libCssName: bundleConfig.libs.css,
  }),
  ...
  ...
  // 增加一個(gè)靜態(tài)文件目錄
   new CopyWebpackPlugin([
     ...
     ...
    {
      from: path.resolve(__dirname, "../libs"),
      to: config.build.assetsSubDirectory,
      ignore: ["*.json"]
    }
  ])
]

修改模版文件index.html


  
<% if (htmlWebpackPlugin.options.libCssName){ %> <% } %> <% if (htmlWebpackPlugin.options.libJsName){ %> <% } %>

修改package.json,增加scripts

"scripts": {
  // 增加
  "dll": "node build/build-dll.js"
},

npm run dll先執(zhí)行預(yù)編譯,然后在打包項(xiàng)目文件,如果引入的類(lèi)庫(kù)文件沒(méi)有變更就不再需要再次執(zhí)行預(yù)編譯

happypack

文檔地址 https://github.com/amireh/hap...

一般node.js是單線程執(zhí)行編譯,而happypack則是啟動(dòng)node的多線程進(jìn)行構(gòu)建,大大提高了構(gòu)建速度。

在插件中new一個(gè)新的happypack進(jìn)程出來(lái),然后再使用使用loader的地方替換成對(duì)應(yīng)的id

修改webpack.base.conf.js文件

var HappyPack = require("happypack");
var os = require("os");
var happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
...
...
// 增加plugins
 plugins: [
  new HappyPack({
    id: "happy-babel-js",
    loaders: ["babel-loader?cacheDirectory=true"],
    threadPool: happyThreadPool,
  })
]
...
...
// 修改對(duì)應(yīng)loader
{
  test: /.js$/,
  loader: "happypack/loader?id=happy-babel-js",
  include: [resolve("src"), resolve("test")],
}
webpack-parallel-uglify-plugin

文檔地址 https://github.com/gdborton/w...

webpack提供的UglifyJS插件由于采用單線程壓縮,速度很慢 ,
webpack-parallel-uglify-plugin插件可以并行運(yùn)行UglifyJS插件,這可以有效減少構(gòu)建時(shí)間。

修改webpack.prod.conf.js文件

var ParallelUglifyPlugin = require("webpack-parallel-uglify-plugin");
...
...
// 刪掉webpack提供的UglifyJS插件
// new webpack.optimize.UglifyJsPlugin({
//   compress: {
//     warnings: false,
//     drop_console: true
//   },
//   sourceMap: true
// }),
// 增加 webpack-parallel-uglify-plugin來(lái)替換
new ParallelUglifyPlugin({
  cacheDir: ".cache/",
  uglifyJS:{
    output: {
      comments: false
    },
    compress: {
      warnings: false
    }
  }
}),
webpack 3

webpack3新特性一覽 https://juejin.im/entry/59714...

webpack 3.x 提供了一個(gè)新的功能:Scope Hoisting,又譯作“作用域提升”。只需在配置文件中添加一個(gè)新的插件,就可以讓 Webpack 打包出來(lái)的代碼文件更小、運(yùn)行的更快。

修改webpack.prod.conf.js

...
...
plugins: [
  // 往plugins添加一個(gè)配置
  // ps 只針對(duì)es6的模塊化有效
  new webpack.optimize.ModuleConcatenationPlugin(),
]

ps:配置文件詳情請(qǐng)點(diǎn)擊 https://github.com/liaoyinglo...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89322.html

相關(guān)文章

  • 前端開(kāi)發(fā)之走進(jìn)Vue.js

    摘要:作為目前最熱門(mén)最具前景的前端框架之一,其提供了一種幫助我們快速構(gòu)建并開(kāi)發(fā)前端項(xiàng)目的新的思維模式。的新版本,的簡(jiǎn)稱(chēng)。的包管理工具,用于同一管理我們前端項(xiàng)目中需要用到的包插件工具命令等,便于開(kāi)發(fā)和維護(hù)。 Vue.js作為目前最熱門(mén)最具前景的前端框架之一,其提供了一種幫助我們快速構(gòu)建并開(kāi)發(fā)前端項(xiàng)目的新的思維模式。本文旨在幫助大家認(rèn)識(shí)Vue.js,了解Vue.js的開(kāi)發(fā)流程,并進(jìn)一步理解如何通...

    zxhaaa 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    sutaking 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    khs1994 評(píng)論0 收藏0
  • vue-cli + webpack 多頁(yè)面實(shí)例配置優(yōu)化方法

    摘要:在谷歌找多頁(yè)面,實(shí)例還是比較少,功夫不負(fù)有心人,在那找到了,具體可以到這個(gè),非常感謝童鞋,今天要講的內(nèi)容是基于童鞋的多頁(yè)面實(shí)例上再優(yōu)化的。有需要一起交流的可以加我的微信,,記得備注技術(shù)交流哈。 vue+webpack是否有多頁(yè)面 目前使用vue來(lái)做項(xiàng)目,估計(jì)大部分都是單頁(yè)面(SPA)應(yīng)用,一個(gè)輕型的 MVVM 框架,誰(shuí)用了MVVM框架,就再也回不去JQ時(shí)代了,哈哈。 在手機(jī)端的項(xiàng)目,使...

    Taste 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<