走進webpack(2)--第三方框架(類庫)的引入及抽離

  正文以前,因爲這是一個系列的文章,可能第一次看到的看官老爺們會以爲突兀,若是你是webpack新手,我建議你先從前幾篇文章看起,若是你對webpack有一些瞭解,也但願能夠在github上下載代碼,對照着看會更有效果html

  在當代的前端開發中,不多會用原生JS來開發頁面,最基本的都會使用jQuery來節省咱們開發的時間和效率,而angular,vue,react的出現更是爲前端開發者帶來了福音。那麼這篇文章就說說如何用webpack來打包引入第三方框架(類庫)。若是單純的引入jQuery或者其餘第三方類庫,在打包的時候webpack會把它一塊兒打包進咱們的main.js,也就說,若是咱們引入兩三個框架,兩三個UI庫,那麼咱們的集成包會很大,頁面的加載時間也會很長,這是咱們不肯見到的結果。因此在學會引入的同時,還要知道如何把第三方類庫從咱們的業務邏輯包中抽離出來。前端

  那麼咱們先來安裝一下jQuery,由於在生產環境咱們仍舊是須要jQuery做爲依賴的,因此咱們須要用npm install jquery --save來安裝它。安裝完成以後,咱們在main.js中增長兩行代碼:vue

//引入jQuery
import $ from 'jquery';
//編寫jQuery代碼
$('#jqueryDiv').html('Hello Zaking,jQuery is useful');

  咱們還須要在index.html中增長一個div容器:react

<!-- jQuery代碼容器 -->
<div id="jqueryDiv"></div>

  而後,咱們npm run dev看一下,會發現頁面中已經有jQuery代碼所生成的文字,說明咱們引入jQuery成功了。你能夠在每個須要jQuery的頁面這樣引入。可是這樣會很麻煩,咱們若是經過這樣的方式引入了jQuery,可是整個項目中卻並無寫一行jQuery代碼,那麼webpack也是會把它打包進去的。並且每個須要jQuery的頁面都須要引入的話好麻煩,那麼咱們可使用ProvidePlugin來實現一次引入全局使用,並且經過插件的方式來引入第三方類庫,若是你不使用它的話,webpack就不會打包它,還不錯吧。因爲ProvidePlugin是webpack自帶的插件,咱們不須要引入他,可是須要引入一下webpack:jquery

//引入webpack
const webpack = require('webpack');

 咱們還須要在入口文件引入jQuery,還記得前面模塊化的時候把入口文件單獨拆分紅了一個entry.js,因此咱們在其中增長一點代碼,如今看起來應該是這樣的:webpack

entry.path={
    main:'./src/main.js',
    jquery:'jquery'
}

 而後咱們在plugins項下配置一下這個插件,就像這樣:git

 //建立一個webpack下的ProvidePlugin插件的實例,使全局均可以使用jQuery
new webpack.ProvidePlugin({
   $:"jquery"
})

  這樣就能夠了,可是別忘了把main.js中經過import引入的jQuery代碼刪除,而後再npm run dev試一下。會發現也一樣出現了jQuery生成的文字。github

  那麼下面咱們就學習一下,如何抽離第三方類庫,使其存儲在一個單獨的文件夾下,在webpack3時代,一般是使用CommonsChunkPlugin,CommonsChunkPlugin也是webpack自帶的插件。官方文檔是這樣解釋他的:CommonsChunkPlugin 插件,是一個可選的用於創建一個獨立文件(又稱做 chunk)的功能,這個文件包括多個入口chunk 的公共模塊。經過將公共模塊拆出來,最終合成的文件可以在最開始的時候加載一次,便存到緩存中供後續使用。這個帶來速度上的提高,由於瀏覽器會迅速將公共的代碼從緩存中取出來,而不是每次訪問一個新頁面時,再去加載一個更大的文件。web

  簡單來講,就是將公共模塊拆分出來以便使瀏覽器加載速度更快。可是在webpack4時代,已經取消了這個插件取而代之的是splitChunks 和runtimeChunk ,那麼咱們就來看一下,在webpack4的環境下,如何抽離多個第三方類庫。npm

  咱們先來安裝一下vue,跟jQuery的安裝方式同樣,就很少說了,一樣的咱們也須要在入口文件處引入vue:

entry.path={
    main:'./src/main.js',
    //引入jQuery和vue
    jquery:'jquery',
    vue:"vue"
}

  而後再ProvidePlugin中加入vue這個選項:

new webpack.ProvidePlugin({
        $:"jquery",
        vue:"vue"
    })

  而後咱們在plugins中增長一個配置:

new webpack.optimize.SplitChunksPlugin({
      chunks: "all",
      minSize: 20000,
      minChunks: 1,
      maxAsyncRequests: 5,
      maxInitialRequests: 3,
      name: true
  })

  而後咱們npm run build一下,會發如今dist的根目錄下已經生成了vue.js和jQuery.js。說明咱們打包成功了。那麼咱們想要測試一下,vue究竟能用了麼?

  咱們在main.js中引入vue,而且加上vue官網例子中最簡單的一個:

import Vue from 'vue'
//vue代碼
var app = new Vue({
  el: '#vueApp',
  data: {
    message: 'Hello Vue!'
  }
})

  而後,咱們在index.html建立一個div容器:

<!-- vue容器 -->
<div id="vueApp">
  {{message}}
</div>

  而後咱們試一下npm run dev,頁面打開以後咱們發現沒有hello vue,f12看下控制檯,發現報錯了。不出意外的話,你的報錯信息是這樣的:

  什麼意思呢,官方解釋是:運行時構建不包含模板編譯器,所以不支持 template 選項,只能用 render 選項,但即便使用運行時構建,在單文件組件中也依然能夠寫模板,由於單文件組件的模板會在構建時預編譯爲 render 函數。就是說,若是咱們想使用template,咱們不能直接在客戶端使用npm install以後的vue

  那麼咱們須要新增一點配置:

resolve: {
   alias: {
     'vue$': 'vue/dist/vue.esm.js'
  }
}
//resolve是在最外層的,與plugins等同級

  這樣就能夠了,而後運行一下,會發現Hello Vue已經出如今咱們的頁面之中了。這兩天一直加班,因此更新的有點慢,這個系列的文章還有最後一篇,儘可能在這兩天就能夠完成。

相關文章
相關標籤/搜索