webpack基礎入門

我相信,有不少的朋友對webpack都有或多或少的了解。網上也有了各種各樣的文章,文章內作者也寫出了不少自己對于webpack這個工具的理解。在我剛剛接觸webpack的時候,老實說,網上大部分的文章我是看不懂的。。webpack里面有很多名詞,是沒有接觸和理解過模塊化的同學都難以理解的。我感覺,學習任何一項新技術,要弄清楚為什么使用它,它是什么,它有什么用等概念,弄清楚這些概念之后,我相信,在日后的webpack學習中會達到事半功倍的效果。這篇文章,我會以最簡單的方式,闡述什么是webpack。當然,這是我個人對webpack的一些理解,也是在學習中總結。

另外,最好的學習webpack的資源是webpack的官網。傳送門:webpack

當然,如果你早已是webpack的實踐者,對webpack認識足夠深入,這篇文章不太適合您閱讀。如果你是小白,那就可以開啟webpack的探索之路了。

webpack是目前流行的一款模塊化打包工具。

webpack定義:一款前端資源模塊化和打包工具。

webpack作用:

1. 將許多松散的模塊按照依賴關系和規則打包成符合生產環境環境部署的前端資源。
2. 將按需加載的模塊進行代碼分割,等到實際需要的時候再異步加載。
3. 通過加載器loader的轉換,所有的前端資源都可以看作是模塊。比如說CommonJS模塊,AMD模塊,ES6模塊,css,sass,json,圖片等。

短短的幾句話,就有太多讓人難以明白的地方。

1. 什么是前端資源?

2. 什么是模塊?

3. 什么是模塊化?

4. 什么叫按需加載?

5. 如何實現按需加載?

6. 什么是plugins?

7. 什么是loader?

什么是前端資源

所謂前端資源,就是我們在創建html時,引入的script,link,img,json等文件。webpack足夠的優秀,只需要在html文件中引入一個js文件,在定義一個入口文件js,用于存放依賴的模塊,就可以將其他前端資源按照依賴關系和規則打包。

以前我們需要這樣來引入文件。

<link rel="stylesheet" href="style/stylesheets/screen.css" media='screen'/ > <script src='script/jquery-2.2.1.min.js'></script> <script src='script/bootstrap.js'></script> <script src="script/index.js" ></script>

index.js依賴bootstrap.js,而bootstrap又依賴于jquery。我們必須按照DOM順序來寫每一個js文件。

現在只需要在html中引入一個主文件index.js,其他依賴的前端資源都寫在另外一個入口文件js中,這個入口文件不用寫在html中,然后配置好config,在cmd中輸入webpack執行編譯,所有前端資源都被引入了。并且webpack會幫我們入口文件entry.js的每個模塊的類型和依賴關系,等到需要的時候再按需加載。

//html
<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src='js/main.js'></script> <!-- 引入引入主模塊 main.js --> </body> </html> //entry.js import $ from 'jquery'; import other...

什么是模塊

在webpack中,所有的前端資源都是模塊,可以通過加載器loader進行轉換。在javascript方面,有幾大模塊系統,CommonJS模塊,AMD模塊,CMD模塊,ES6模塊。談談我對這幾大模塊的理解。

CommonJS

在CommonJS中,有一個全局方法require(),用于加載依賴模塊。

//main.js
var jquery = require('jquery');
var bootstrap = require('bootstrap');

主文件main.js模塊依賴于這兩個模塊,CommonJS缺點就是同步加載。也就是說,會先加載jquery模塊,等到jquery加載完了再去加載bootstrap模塊。引用阮一峰老師的話

同步加載意味著阻塞加載,當依賴的模塊太大時,瀏覽器會處于假死的狀態。

假死意味著瀏覽器任然處在加載中,仍然還是空白頁面。這種假死的狀態帶來的后果就是用戶的離開。

AMD模塊

AMD也叫異步模塊定義,英文Asynchronous Module Definition。AMD是requirejs對模塊定義時的產出。它采用異步方式加載模塊,每個獨立模塊的加載不影響回調函數中定義的模塊的運行。在回調函數中定義一個模塊,只有當依賴的模塊加載完成之后,該模塊才會編譯執行。AMD也采用require()語句來加載一個模塊,但是不同于CommonJS,它有兩個參數。第一個參數是數組,需要傳入依賴模塊;第二個參數是回調函數,回調函數中也接受參數,而參數是形式參數,來自于每一個依賴模塊。舉個例子。

//main.js
require(['jquery','bootstrap'],function($, boot){ //寫入的模塊 })

主模塊main.js依賴于jquery,Bootstrap模塊,main只有在這兩個模塊加載完成之后才會編譯執行main定義的模塊,屬于同步加載。而在兩個依賴模塊中,屬于異步加載。也就是說bootstrap不用等到jquery加載完成之后再加載,被依賴的模塊是哪一個模塊小,就先加載哪一個,這就避免了CommonJS模塊中同步加載依賴模塊而出現瀏覽器假死的狀態。稍微總結一下,
主模塊需要等到依賴模塊加載完成之后才編譯執行,屬于同步加載;而被依賴模塊之間屬于異步加載,哪一個模塊小,就先加載哪一個。

AMD模塊的一大不足就是所有依賴的模塊都需要提前加載,依賴前置。

CMD模塊

CMD模塊跟AMD很相似,這里引用玉伯老師的話看看CMD和AMD的區別。

對于依賴的模塊,AMD是提前執行,CMD是延遲執行。

CMD推從依賴就近,AMD推從依賴前置

依賴就近的意思就是當我需要某個模塊的時候再去異步加載。也就是按需要加載前端資源,懶加載。
可以用八個字來總結CMD。依賴就近,延遲執行。

ES6模塊

ES6模塊的設計思想,是盡量的靜態化,使得編譯時就能確定模塊的依賴關系,以及輸入和輸出的變量。ES6中與CommonJS,AMD模塊一個區別在于ES6是通過import關鍵字來輸入某個模塊提供的功能,export或者export default規定該模塊的對外接口,通俗易懂一些,也就是暴露該模塊定義的一些屬性和方法,供其他模塊調用。

ES6和CommonJS,AMD模塊最大的區別在于,ES6模塊可以實現編譯時加載,簡單的說就是按需加載。而后兩種方法只能是運行時加載。上一段代碼。

ES6:
import {get, post, ajax} from 'jQuery';CommonJS:
var 

什么是模塊化

webpack是支持以上的模塊系統的。在頭腦中要形成某種技術的知識框架才能學好該技術,所以花費了一些時間做了些介紹。模塊化就是webpack使用某種方法將每一個松散的模塊按照依賴關系編譯的過程。webpack需要一個入口js文件,主模塊js文件,config文件就可以實現前端資源模塊化。看個簡單的例子。

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src='js/main.js'></script> 1. <!-- 引入主模塊 main.js --> </body> </html> 2. //入口文件 entry.js document.write("<h1>I'm Uncke Keith!</h1>"); 3. //webpack.config.js module.exports = { entry :'./app/js/entry.js', output : { path: './dist/js' filename: 'main.js' } }; 4. //打開cmd,在文件目錄下,輸入webpack執行編譯就可以看到document.write()的結果了。

什么叫按需加載?

webpack的其中一個作用就是可以將按需加載的模塊進行代碼分割,根據實際需要進行異步加載。按需加載,顧名思義就是按照用戶需要某個功能的時候在加載相應的模塊。舉個例子,當我們在瀏覽一些圖片網站的時候,如果圖片在你打開該網站的時候就全部一起加載好,那造成的后果就是頁面會保持一段時間的空白狀態,直到全部圖片加載完成之后才會顯示。如果是按需要加載,就可以在用戶剛進入頁面的時候加載可視區域窗口的圖片,當用戶拖動滾動條下拉的時候再去加載圖片,這樣不僅減少HTTP請求,同時提高了頁面加載速度。在舉一個例子。在單頁應用中,為了減少http請求次數,會把所有js文件合并為一個文件,這樣請求數量減少了,可是請求的文件體積卻變大了。按需加載就可以解決這個問題。

如何實現按需加載?

ES6的一大涉及思想就是想讓前端資源靜態化,在編譯的過程中,而非運行過程中就確定模塊的依賴關系。webpack在編譯的過程中,就會對整個代碼進行靜態分析,分析出各個模塊的類型和它們依賴關系,然后將不同類型的模塊提交給適配的加載器來處理。比如一個用 Sass 寫的樣式模塊,可以先用 Sass-Loader加載器將它轉成一個CSS 模塊,在通過 CSS 模塊把他插入到頁面的 style 標簽中執行。并且在你編譯的時候就確定了依賴關系。

什么是plugins?

webpack跟我們提供了很多內置的插件,可以實現loader做不到的事情。在這里介紹幾個常用的插件。

1. extract-text-webpack-plugin

我們在入口文件中import(或者require)進一些css文件時,webpack會幫我們把css樣式與其他前端資源打包到output的filename文件中,然后在head標簽中會自動加載一個style標簽。但是,我們可能會需要獨立出一個css文件,這時候就需要使用extract-text-webpack-plugin插件了。具體用法如下:

var ExtractTextPlugin = require("extract-text-webpack-plugin");
//這里需要使用CommonJS語法來引入一個依賴。module.exports = { module: { loaders: [ { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") } //loader的執行順序是 先執行css-loader給css文件加上地址,然后執行style-loader在頭部加上style標簽。 ] }, plugins: [ new ExtractTextPlugin("styles.css") //使用plugins選項對象,使用new調用ExtractTextPlugin構造函數,傳入的參數是需要單獨生成的css文件,路徑與output中的path路徑相同。詳細的參數可以到extract-text-webpack-plugin官網查看。 ] }

當我們成功生成了單獨的css文件之后,就可以通過link標簽引入了。

什么是loader?

Webpack 本身只能處理原生的 JavaScript 模塊,但是 loader 轉換器可以將各種類型的資源轉換成 JavaScript 模塊。這樣,任何資源都可以成為 Webpack 可以處理的模塊。每一個loader都會針對入口文件entry.js的依賴模塊引入的前端資源進行轉換。站在更高的角度上看問題,我們在webpack.config.js里面的所有配置都是針對入口文件的,始終記住這點很重要。因為這就是我們配置webpack.config.js的目的。在這里介紹一些常用loader。

1. postcss-loader

我是一名sass實踐者,并且用著一個封裝了很多mixins的compass庫,這個庫的最大好處就是可以直接include一些compass封裝好的的css3的mixin時,編譯之后會幫我們加上css前綴。如果想在.vue中也實現這種自動前綴的功能,可以使用webpack給我們提供的postcss-loader。(可以去官網查看相關介紹)。postcss?這又是什么鬼,其實postcss只是一個平臺,我們需要用的是基于postcss平臺上的一些常用的插件。

如果想使用這個插件,需要下載一些依賴。

cnpm install autoprefixer --save-dev
//autoprefixer用于添加css3前綴

具體的webpack.config.js配置如下

//注意先引入依賴
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var autoprefixer = require('autoprefixer'); module.exports = { entry: __dirname + '/app/entry.js', output: { path: __dirname + '/dist', filename: 'bundle.js' }, module: { config... }, postcss:[ autoprefixer() ] };

如果你的入口文件entry.js是這樣的。

...
import './assets/main.scss';

那么當然你在main.scss使用scss語法寫一些css3屬性時,在編譯之后就可以看到css3前綴了。但是如果你的樣式是寫在*.vue組件里面的

比如說,入口文件entry.js是這樣的。

...
import app from './app.vue';

topBar.vue

<template>config...
</template> <script> config... </script> <style lang='sass' scoped> .main{ font-weight: bold; p { border-radius: 10px; box-shadow: 3px 3px 3px #ccc; transition: all 0.3s; 此處測試css3的屬性前綴 } } </style>

在瀏覽器中查看效果,你會發現,.vue組件中定義的style樣式并沒有加上屬性前綴。

.main p[data-v-a64cfc10] {background-color: red;border-radius: 10px; box-shadow: 3px 3px 3px #ccc; color: red; display: inline-block; font-weight: bold; height: 100px; transition: all 0.3s ease 0s; }

難道是postcss-loader失效了?其實并不是。出現這種情況的原因主要還是對vue-loader不熟悉導致的。因為你是把樣式寫在了單個*.vue組件中,所以這里會涉及另外一個lodaer,也就是Vue官方提供的vue-loader。在vue-loader中如果也想讓樣式擁有前綴,在webpack.config.js要進行如下配置。

module.exports = {
    entry: ... ,
    output: { ... },
    module: { ... },這里配置vue指的是vue-loader,我們需要在vue-loader中再一次配置postcss。
    vue: {
 postcss: [require('autoprefixer')()],  autoprefixer: true },  postcss:[ autoprefixer() ] //也就是說,postcss需要配置兩處。一是解析entry.js中引入的css模塊;一處是解析 單個*.vue組件的<style>標簽中的樣式。 }

執行編譯,你會發現正常顯示了。

轉載于:https://www.cnblogs.com/chenliyang/p/6548336.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372702.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372702.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372702.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

位運算基礎

異或運算的基礎有點忘記了 先介紹一下。。2個數異或 就是對于每一個二進制位進行位運算 具有2個特殊的性質 1、一個數異或本身恒等于0&#xff0c;如5^5恒等于0&#xff1b; 2、一個數異或0恒等于本身&#xff0c;如5^0恒等于5。 3 滿足交換律 1.交換數字這個性質能利用與交換數…

JAXB自定義綁定– Java.util.Date / Spring 3序列化

JaxB可以處理Java.util.Date序列化&#xff0c;但是需要以下格式&#xff1a; “ yyyy-MM-ddTHH&#xff1a;mm&#xff1a;ss ”。 如果需要將日期對象格式化為另一種格式怎么辦&#xff1f; 我有同樣的問題時&#xff0c;我正在同春MVC 3和Jackson JSON處理器 &#xff0c;最…

雙足機器人簡單步態生成

讓機器人行走最簡單的方法是先得到一組步態曲線&#xff0c;即腿部每個關節隨時間運動的角度值。可以在ADAMS或3D Max、Blender等軟件中建立好機構/骨骼模型&#xff0c;設計出腳踝和髖關節的運動曲線&#xff0c;然后進行逆運動學解算&#xff0c;測量每個關節在運動過程中的轉…

重新訪問了訪客模式

訪客模式是面向對象設計中最被高估但又被低估的模式之一。 高估了它&#xff0c;因為它常常被選擇得太快&#xff08; 可能是由建筑宇航員選擇的 &#xff09;&#xff0c;然后以錯誤的方式添加時會膨脹本來非常簡單的設計。 如果您不遵循教科書示例&#xff0c;那么它可能會非…

java web開發技術大_2021年六大javaweb開發主流技術

作為歷史最為悠久的編程語言——java&#xff0c;歷經數十年依然盤踞在編程榜最前面的位置&#xff0c;這與它的技術和應用范圍是分不開的&#xff0c;同時呢&#xff0c;javaweb開發主流技術更是java開發者時時刻刻關注的問題&#xff0c;接下來我們一起分析一下2020年互聯網行…

ASP.NET—013:實現帶控件的彈出層(彈出框)

http://blog.csdn.net/yysyangyangyangshan/article/details/38458169 在頁面中用到彈出新頁面的情況比較多的&#xff0c;一般來說都是使用JS方法showModalDialog("新頁面相對路徑?參數1&參數2",window,"新頁面樣式");然后會新彈出一個模態的page頁。…

運維人員日常工作(轉自老男孩)

1&#xff09;運維人員要謹記的6個字&#xff1a; 運維人員做事需遵循&#xff1a;簡單、易用、高效 &#xff08;2&#xff09;運維人員服務的3大宗旨&#xff1a; 1、企業數據安全保障。 2、7*24小時業務持續提供服務。 3、不斷提升用戶感受、體驗。 &#xff08;3&#xff0…

c# 操作DatatTable

dtTemp.Columns.Add("列名");//增加一列 dtTemp.Columns.Remove("列名");//刪除一列 dtTemp.Columns["舊列名"].ColumnName "新列名";//修改列名 dtTemp.Columns["列名1"].SetOrdinal(dtTemp.Columns["列名2"].O…

java 二進制 歸屬權限_【Java EE 學習 75 上】【數據采集系統第七天】【二進制運算實現權限管理】【權限分析和設計】...

一、權限計算相關分析1.如何存儲權限首先說一下權限保存的問題&#xff0c;一個系統中最多有多少權限呢&#xff1f;一個大的系統中可能有成百上千個權限需要管理。怎么保存這么多的權限&#xff1f;首先&#xff0c;我們使用一個數字中的一位保存一種權限&#xff0c;那么如果…

MongoDB性能測試

因此&#xff0c;今天早上&#xff0c;我在mongo shell中四處亂逛。 我想出了三種不同的方式來聚合所需的數據&#xff0c;但不確定隨后應移植哪種代碼以在應用程序中使用。 那么&#xff0c;我將如何決定實施哪種方法呢&#xff1f; 好吧&#xff0c;讓我們選擇性能最佳的產品…

$_SERVER[SCRIPT_NAME]、$_SERVER[PHP_SELF]、$_SERVER[QUERY_STRING]、$_SERVER[REQUEST_URI]

1、$_SERVER["SCRIPT_NAME"] 說明&#xff1a;包含當前腳本的路徑 2、$_SERVER["PHP_SELF"] 說明&#xff1a;當前正在執行腳本的文件名 3、$_SERVER["QUERY_STRING"] 說明&#xff1a;查詢(query)的字符串 4、$_SERVER["REQUEST_URI"…

yii2增刪改查及AR的理解

yii2增刪改查 // 返回 id 為 1 的客戶 $customer Customer::findOne(1); // 返回 id 為 1 且狀態為 *active* 的客戶 $customer Customer::findOne([ id > 1, status > Customer::STATUS_ACTIVE, ]); // 返回id為1、2、3的一組客戶 $customers Customer::findAll([1, …

GWT和HTML5 Canvas演示

這是我對GWT和HTML5 Canvas的第一個實驗。 我的第一個嘗試是創建矩形&#xff0c;僅用幾行代碼就得出了這樣的內容&#xff1a; 碼&#xff1a; public class GwtHtml5 implements EntryPoint {static final String canvasHolderId "canvasholder";static final St…

mysql 平均值 排序_MySQL按平均兩個平均值排序

我正在競賽網站上工作,有兩種類型的用戶,普通網站成員和評委.每個人都可以使用拖放工具按照他們選擇的順序對特定比賽中的條目進行排序.完成后,相關的條目ID將附加一個排名值,然后可用于確定比賽中哪個條目獲得最高的平均分數.獲勝者實際上將通過平均每組的平均值來確定.我希望…

Solr管理界面詳解

轉載于:https://www.cnblogs.com/gslblog/p/6553813.html

iconv編碼轉換指令

看到一個不錯的指令iconv&#xff0c;可以對文件編碼進行轉換&#xff0c;記錄如下: iconv --list 列出所有支持轉換的編碼 icon -f code1 -t code2 filename -o newfile -f 即from 原來的編碼 -t 即to 新的編碼 filename 待轉換的文件名 -o newfile 要輸出的文件名 轉載于:htt…

使用Spring Roo進行快速云開發–第2部分:VMware Cloud Foundry

Spring Roo是在Java平臺上提供快速應用程序開發的工具。 我已經解釋了何時使用它&#xff1a; http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持兩種針對云計算的解決方案&#xff1a;Google App Engine&#xff08;GAE&#xff09;…

java程序日期轉換_Java 日期轉換詳解及實例代碼

Java 日期轉換涉及的核心類&#xff1a;Date類、SimpleDateFormat類、Calendar類一、 Date型與long型Date型轉換為long型Date date new Date();//取得當前時間Date類型long date2long date.getTime();//Date轉longlong型轉換為Date型long cur System.currentTimeMills();//取…

軟件設計之思想

編程用何種語言不重要&#xff0c;重要的是其設計思想。轉載于:https://www.cnblogs.com/redfull/p/6554898.html

asp.net 與 java 2017_[ASP.net教程]C#與JAVA學習感悟

[ASP.net教程]C#與JAVA學習感悟0 2015-10-06 23:00:07C#與JAVA學習感悟學完C#與JAVA&#xff0c;感覺收獲良多。C#與JAVA這兩門語言相似度很高(了解它們早期歷史的人可能知道為什么)&#xff0c;也許很多人在學習JAVA(或C#)時會同時學習C#(或JAVA)&#xff0c;因為它們太相似了…