腳手架vue-cli系列四:vue-cli工程webpack的基本用法

来源:https://www.cnblogs.com/yinn/archive/2018/09/29/9720177.html
-Advertisement-
Play Games

webpack的打包依賴於它的一個重要配置文件webpack.config.js,在這個配置文件中就可以指定所有在源代碼編譯過程中的工作了,就一個配置就可以與冗長的Gruntfile或者Gulpfile說再見了。 一個完整的工程項目中的webpack的配置遠遠沒有這麼簡單,隨著工程的構建要求的增加, ...


webpack的打包依賴於它的一個重要配置文件webpack.config.js,在這個配置文件中就可以指定所有在源代碼編譯過程中的工作了,就一個配置就可以與冗長的Gruntfile或者Gulpfile說再見了。

一個完整的工程項目中的webpack的配置遠遠沒有這麼簡單,隨著工程的構建要求的增加,webpack.config.js內的配置項目也會隨之增加,webpack還有許許多多的選項提供給我們進行靈活配置,它只是一個構建工具,我們只需要瞭解在Vue項目中它基本能為我們做到的工作、最小化的配置是如何的就足夠了,在以後需要對它進行擴展與優化時,帶著問題去查官方文檔也是非常容易的事。

●  樣式表引用

某些頁面或者組件可能具有特定的樣式定義,這些樣式對於其他頁面來說是冗餘的,我們只希望這些組件在應用時才自動載入這些特定的樣式,此時用webpack我們就能在源代碼中加入以下代碼來動態載入CSS:

    import Vue from 'vue'
    // ... 省略
    // 引用指定的樣式源文件
    import './app/assets/less/dark.less'
    
    export default {
      // ... 省略
    }
    

此時我們只需要在webpack的配置中加入less-loader,那麼webpack在打包的時候就會自動將less轉換為CSS,並將CSS的動態代碼生成到JS文件中。當Vue組件被載入到頁面並實例化後,將在DOM內插入這個特定的行內樣式<style>以實現動態樣式的應用。

對於*.css文件同樣也是適用的,例如導入某個第三方庫中必需的樣式表:

import 'uikit/dist/css/components/tabs.css'

●  字體的引用

假設在dark.less內加入對自定義字體文件的樣式定義:

@font-face {
       font-family: 'Darkenstone';
       src: url('./Darkenstone.eot');
       src: url('./Darkenstone.eot?#iefix') format('embedded-opentype'),
           url('./Darkenstone.woff2') format('woff2'),
           url('./Darkenstone.woff') format('woff'),
           url('./Darkenstone.ttf') format('truetype'),
           url('./Darkenstone.svg#Darkenstone') format('svg');
           font-weight: normal;          
           font-style: normal;
}

.header{
       display: flex;
       flex-flow: row nowrap;

       & > h1 {
          font: 16pt 'Darkenstone';
       }
}

這裡.header>h1指定了一個Darkenstone的自定義字體,這個字體瀏覽器一定是不能識別的,以前我們在樣式表中先定義這個字體樣式並指定載入位置(如上文@font-face的定義),然後在頁面中引用這個樣式表,這是多麼麻煩的一件事,不是嗎?

如果用了webpack後,我們只是在配置文件內加入了一個url-loader:

{
      test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
      loader: 'url'
}

我們並不需要在源代碼中做任何改變,因為之前已經引用過樣式表dark.less,而字體是在樣式表中的,webpack將在打包的時候為我們識別併在代碼中引入字體的動態載入。這樣一來極大地解決了我們對資源引用的依賴問題!

vue-cli的webpack模板已經為我們配置好了絕大多數常用的loader,在實際運用中我們只需要瞭解它們是怎麼來的,應該怎麼用,需要的時候如何修改就夠了。

●  用別名取代路徑引用

在項目開發過程中有可能有許多包是沒有放在npm上的,有一些較老的可能還依然只存在於bower上,某些甚至在bower與npm上都找不到,而不得不通過下載的方式在項目內引用,這樣一來我們的代碼可能通過require就得在代碼內引用一段很長的文件路徑,如下所示

import Selector from '../../bower_components/bootstrap-select/dist/js/select'

這種包的引用方式明顯違反了CommonJS的編程規範,對於這些長路徑,甚至還具有“../..”這些相對路徑搜索的定義,我們可以通過webpack的resolve配置項來解決。就以select這個組件為例,在webpack.base.config.js中加入以下的這個別名的定義:

    module.exports = {
       entry:{ ... },
       output: { ... },
       module:{ ... },
       resolve: {
          extensions:['','.js'],
          alias:{ // 別名
             'bs-select':'bower_components/bootstrap-select/dist/js/select.js'
          }
       }
    }

有了這個定義以後,我們就可以將上面那個長引用改為下麵的寫法:

 import Selector from 'bs-select';

絕對不要讓路徑引用進入到我們的代碼,因為這是代碼的“癌症”,一旦開始植入並生長起來,以前的代碼將難以維護!

●  配置多入口程式

多數情況下我們的程式入口不單單隻有一個,舉一個最簡單的例子,前臺提供給最終用戶使用(http://www.domain.com/index),後臺提供給登錄用戶使用(http://www.domain.com/admin/),那麼自然需要多個與main.js類似的程式入口了。

首先在build/webpack.base.conf.js配置文件中的entry配置屬性上加上新的入口文件:

    module.exports = {
      entry: {
        app: './src/main.js',
        admin : './src/admin-main.js'
      },
      // ... 省略
    }

這是用於告訴webpack哪幾個是入口文件,這些文件需要被生成到啟動頁的<script>內。

vue-cli的webpack模板使用HtmlWebpackPlugin插件,生成HTML入口頁面並自動將生成後的JS文件和CSS文件的引用地址寫入到頁內的<script>中。

這裡就需要在build/webpack.dev.config.js文件內的plugins配置項內多配置一個HtmlWebpackPlugin插件,用於生成admin.html入口頁。

     plugins:[
      // ... 省略

      // 這是原有的配置項,用於匹配註入app.js的輸出腳本
      new HtmlWebpackPlugin({
        filename: process.env.NODE_ENV === 'testing'
          ? 'index.html'
          : config.build.index,
        template: 'index.html',
        chunks: ['app'], // 與原配置的不同的是要用chunks指定對應的entry
        inject: true,
        minify: {
          removeComments: true,
          collapseWhitespace: true,
          removeAttributeQuotes: true
        },
        chunksSortMode: 'dependency'
      }),

      // 這是新增項,用於匹配註入admin.js的輸出腳本
      new HtmlWebpackPlugin({
        filename: process.env.NODE_ENV === 'testing'
          ? 'admin.html'
          : config.build.admin,
        template: 'index.html',
        chunks: ['admin'],
        inject: true,
        minify: {
          removeComments: true,
          collapseWhitespace: true,
          removeAttributeQuotes: true
        },
        chunksSortMode: 'dependency'
      }),
    ]

需要強調一點的是,這裡的HtmlWebpackPlugin配置必須用chunks指定在上文entry內對應的入口文件的別名。

關於HtmlWebpackPlugin更多配置內容可以參考:https://github.com/kangax/html-minifier#options-quick-reference。

還有就是得將同樣的配置加入到生產環境專用的webpack配置文件webpack.prod.conf.js中,否則當我們運行npm run build時是不會輸出admin.js和admin.html這兩個入口文件的(由於配置內容相同這裡就不再重覆了)。

最後,如果使用了vue-router就得對connect-history-api-fallback插件的配置進行修改,否則原有的預設配置只會將所有的請求轉發給index.html,這樣就會導致History API沒有辦法正確地將請求指向admin.html,導致熱載入失敗,具體做法如下所述。

打開dev-server.js文件,將app.use(require('connect-history-api-fallback')())配置改為以下的方式:

    // handle fallback for HTML5 history API
    var history = require('connect-history-api-fallback')
    // app.use(require('connect-history-api-fallback')())

    app.use(history({
      rewrites: [
        { from: /^\/admin\/.*$/, to: '/admin.html' }
      ]
    }));

新入口需要有明確區分的路由規則,否則還是會產生熱載入失敗的情況,這樣就非常不便於開發了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 立即執行函數是表達式,只在括弧內可見。 例一 括弧內可見 例二 括弧外不可見 ...
  • video.js是一款很流行的html5視頻播放插件。很適合在移動端播放視頻(比如微信網頁),功能強大,且支持降級到flash,相容ie8。官網:http://videojs.com/ git&demo :http://files.cnblogs.com/files/stoneniqiu/video ...
  • ionic 是一個 HTML5 應用程式開發框架。 可以使用 HTML、CSS 和 Javascript 構建接近原生體驗的移動應用程式。具有速度快,界面現代化、美觀等特點。下麵一起看一下如何使用 安裝 確保已經安裝node 1. 下載Ionic and Cordova CLI. $ npm ins ...
  • What is Promise? Promise是一個構造函數,接受一個參數(Function),並且該參數接受兩個參數resolve和reject(分別表示非同步操作執行成功後的回調函數、執行失敗後的回調函數) 運行代碼,2秒後輸出“執行完成”。註意,這裡只是new了一個對象,並沒有調用它,所以我們 ...
  • 騰訊防水牆(滑動驗證碼)的簡單使用 https://007.qq.com ...
  • 騰訊地圖點擊地圖創建錨點(且只創建一個)同事創建錨點提示。 qq.maps.event.addListener(marker, 'click', function() { 44 info.open(); 45 info.setContent('單擊標記'); 47... ...
  • 今天分享一下快速使用jQuery+zepto.js的技巧,需要的記得收藏 1.jQuery的引入:本地下載jQuery(後面簡稱jq)的源文件,開發版本使用非min版,線上使用min版,zepto.js類似,同樣的一些基於jq的插件也是如此用法,如果使用requreJs也就是模塊化載入註意插件的依賴 ...
  • 叨叨一會CommonJS Common這個英文單詞的意思,相信大家都認識,我記得有一個片語common knowledge是常識的意思,那麼CommonJS是不是也是類似於常識性的,大家都理解的意思呢?很明顯不是,這個常識一點都不常識。我最初認為commonJS是一個開源的JS庫,就是那種非常方便用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...