摘要:本文將簡單介紹,以及如何去編寫一個來滿足自身的需求,從而也能提高對的認識與使用,努力進階為配置工程師。用于對模塊的源代碼進行轉換。在我們使用它們前,我們得知道自己需要什么。另外,還需要考慮一些異常的處理,如模板文件找不到。
本文將簡單介紹webpack loader,以及如何去編寫一個loader來滿足自身的需求,從而也能提高對webpack的認識與使用,努力進階為webpack配置工程師。
Webpack Loaderwebpack想必前端圈的人都知道了,大多數人也都或多或少的用過。簡單的說就是它能夠加載資源文件,并對這些文件進行一些處理,諸如編譯、壓縮等,最終一起打包到指定的文件中。可以說,它作為一個打包工具,在前端工程化浪潮中,起到了中流砥柱的作用。
那webpack其中非常重要的一環就是,能夠對加載的資源文件,進行一些處理。比如把less、sass文件編譯成css文件,負責這個處理過程的,就是webpack的loader。
loader 用于對模塊的源代碼進行轉換。loader 可以使你在 import 或"加載"模塊時預處理文件。因此,loader 類似于其他構建工具中“任務(task)”,并提供了處理前端構建步驟的強大方法。
舉個稍微復雜的例子,vue-loader,它官網介紹如下:
vue-loader 是一個 Webpack 的 loader,可以將指定格式編寫的 Vue 組件轉換為 JavaScript 模塊。
Vue組件默認分成三部分,、 和 ,我們可以把一個組件要有的html,js,css寫在一個組件文件中,而vue-loader,會幫助我們去處理這個vue組件,把其中的html,js,css分別編譯處理,最終打包成一個模塊。
明確自己需要什么Loader我們知道了webpack的強大依托于一個個強大的 loader(當然還有plugin,本文就不介紹了)。如果想真的玩溜webpack,我們就必須掌握loader的使用。在我們使用它們前,我們得知道自己需要什么loader。如果想編譯less,可以用less-loader;想加載html文件并打包它內鏈的靜態文件,可以使用html-loader。只要我們想對文件進行處理時,我們都可以去找想對應的loader。
那么問題來了,萬一找不到想要的loader該怎么辦?
比如我前幾天遇到了一個需求,我希望我加載的html文件,都嵌套在一個 layout.html 文件中。如下所示:
Pure Web This is Header {{__content__}}
這樣如果是編寫多頁應用,我就只需要編寫唯一不一樣的中心內容,而把網站公共的部分作為layout抽離開來。
可惜html-loader它只能幫我在一個html文件中去加載另外一個html文件,像這樣:
${require("@/htmls/header.html")} ${require("@/htmls/index.html")} ${require("@/htmls/footer.html")}
這樣雖然能抽離公共部分,但我依舊需要在每個html文件中去引用,而且為了保證html結構順序,我得每個文件都再引一次header,footer,沒法將他們作為一個多帶帶的layout來引入。所以它并不完全符合我的需求。
那該怎么辦,我們沒有辦法,只能自己動手寫啊。
動手寫一個webpack loader首先,我們要先閱讀一遍webpack官網的介紹:如何編寫一個loader?
看完后,我們能知道,loader本質就是接收字符串(或者buffer),再返回處理完的字符串(或者buffer)的過程。webpack會將加載的資源作為參數傳入loader方法,交于loader處理,再返回。
在我這個需求中,就是將我加載的html,套在我設定的layout中,再將這個處理完的html返回。大致的代碼就是這樣:
// {string} source: 加載的html的字符串值 module.exports = function (source) { return getLayoutHtml().replace("{{__content__}}", source) }
簡單思考后,發現可行,那么開始編寫。
開始嘗試所以,我們第一步,只要實現一個getLayoutHtml方法,能得到設定的layout.html文件就好。仔細想想,layout文件應該是通過配置聲明的,然后在loader里去根據配置,調用node的api去加載文件就好。
查閱node與webpack文檔,我們可以通過loader-utils來獲取loader的配置項。通過node的fs.readFileSync去加載文件,那我們的代碼大概可以這樣寫:
module.exports = function (source) { const options = loaderUtils.getOptions(this) const layoutHtml = fs.readFileSync(options.layout, "utf-8") return layoutHtml.replace("{{__content__}}", source) }
webpack的config增加如下loader配置:
{ test: /.(html)$/, loader: "html-layout-loader", include: htmlPath, // the htmls you want inject to layout options: { layout: layoutHtmlPath // the path of default layout html } }
難以置信,這樣就完成一個基礎的html-layout-loader了。當然,這才是真正的開始,真正讓loader變得可用,好用。我們還需要考慮很多情況。
完善自己的loader明確代碼可行后,我們得完善自己的功能點,我仔細想想,大概需要考慮如下功能:
針對每個加載的html,應該可以設定自己的layout文件,而不是所有的html,都必須加載同一個layout。
替換的占位符{{__content__}}也應該可以配置。
另外,還需要考慮一些異常的處理,如模板文件找不到。
完善自身的需求后,我們又可以編寫代碼了,這回我就不一行行闡述代碼了,直接放鏈接:html-layout-loader。
代碼也比較簡單,算是實現了自己的基本需求,大家有興趣的話可以先看看readme的介紹。
寫在最后當我們在遇到大問題時,首先想到的總是去搜搜看有沒有現成的解決方案,但現實卻難免是沒有解決方案。在這種情況下,我們也可以嘗試著去寫一些插件、組件、或者一個通用化的解決方案,來解決自身的問題,同時對自己掌握一些知識也會有幫助。而且嘗試過后可能發現,它也沒那么難嘛。
另外,如果這個loader,也對讀者們有幫助的話,請盡情使用,有什么問題、想法可以提issue或PR。
--閱讀原文 --轉載請先經過本人授權-丁香園F2E @相學長。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89002.html
摘要:的定位屬于預處理器嗎還是屬于后置處理器都不是,因為具體做的事取決于開發者使用了什么插件。這里做一個我覺得比較恰當的類比,中的相當于的中的,,等預處理器相當于,雖然不是完全合理,但是還是比較恰當。 前言 原諒我取這樣的標題,我知道 postCss 對于大多數前端開發者來說早已經很熟悉了,但是樓主作為一個初出茅廬的前端er,還有好多的工具和技術沒接觸過,說來慚愧。雖然平時也喜歡使用css預...
摘要:通俗的說,預處理器用一種專門的編程語言,進行頁面樣式設計,然后再編譯成正常的文件,以供項目使用。在開發過程中,使用擴展名為的文件來編寫樣式 webpack 前言 這篇文章是我在學習過程中對自己的一個記錄和總結,也希望可以幫助到和我當初同樣對webpack有困惑的小伙伴 我在自學webpack時也參考了很多大神的文章,參考的帖子太多就不一一謝過了,再次感謝各位大神的幫助 文章中的每個例...
摘要:基礎與項目構建入門最近兩年,同學們出去討論前端的框架,相信大家對也并不陌生,并稱前端三大框架各有各的特色,在這里說一下,我們非常有必要學習這些東西,不管是求職面試,還是公司需要什么是讀音,類似于是一套構建用戶界面的漸進式框架。 vue基礎與項目構建入門 最近兩年,同學們出去討論前端的框架,相信大家對vue也并不陌生,vue、angular、React并稱前端三大框架!各有各的特色,在這...
摘要:在執行時會先用把配置文件轉成代碼再繼續處理。只要你把配置文件命名成,就會用相應的去轉換一遍配置文件。它沒改的文件名,但配置文件和各種腳本都是完全的語法。這是提供的一個命令行工具,你可以用它代替去執行文件。總結得益于,幾乎已經是現在的標配了。 概述 我最近在整理一個 Ionic + Webpack 的項目模板,因為項目代碼都是 ES6 的,所以我也想在其他地方也用 ES6 。其中一個地方...
閱讀 2975·2023-04-26 02:04
閱讀 1283·2021-11-04 16:07
閱讀 3707·2021-09-22 15:09
閱讀 682·2019-08-30 15:54
閱讀 1904·2019-08-29 14:11
閱讀 2529·2019-08-26 12:19
閱讀 2259·2019-08-26 12:00
閱讀 760·2019-08-26 10:27