最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

webpack 動(dòng)態(tài)批量加載文件的實(shí)現(xiàn)方法

 更新時(shí)間:2020年03月19日 09:46:55   作者:savokiss  
這篇文章主要介紹了webpack 動(dòng)態(tài)批量加載文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

最近筆者在工作中遇到了一個(gè)小需求:

要實(shí)現(xiàn)一個(gè)組件來(lái)播放幀圖片

這個(gè)需求本身不復(fù)雜,但是需要在組件中一次性引入十張圖片,就像下面這樣:

// 就是這么任性,下標(biāo)從0開始~
import frame0 from './assets/frame_0.png'
import frame1 from './assets/frame_1.png'
import frame2 from './assets/frame_2.png'
// ..省略n張
import frame7 from './assets/frame_8.png'
import frame8 from './assets/frame_9.png'
import frame9 from './assets/frame_10.png'

作為一個(gè)有代碼潔癖的程序員,我是不允許這種重復(fù)性代碼存在滴,于是乎就嘗試有沒(méi)有什么簡(jiǎn)單的方法。

方法一:繞過(guò) webpack

由于筆者用的是 vue-cli 3,熟悉的小伙伴都知道,將圖片以固定的格式放在 public 文件夾下面,然后在代碼中直接以絕對(duì)路徑引入即可。這么做的話,就可以根據(jù)文件名構(gòu)造一個(gè) url 數(shù)組,簡(jiǎn)單代碼如下:

const frames = []
_.times(10, v => {
  frames.push(`/images/frame_${v}.png`)
})
// 然后你就得到 10個(gè) url 的數(shù)組啦

此方法本身是 vue-cli 提供的一個(gè) 應(yīng)急手段,它有幾個(gè)缺點(diǎn):

  • 無(wú)法利用 webpack 處理資源,無(wú)法產(chǎn)生內(nèi)容哈希,不利于緩存更新
  • 無(wú)法利用 url-loader 將資源內(nèi)聯(lián)成 base64 字符串 以減少網(wǎng)絡(luò)請(qǐng)求

方法二:require

由于 import 是靜態(tài)關(guān)鍵字,所以如果想要批量加載文件,可以使用 require,但是直接像下面這樣寫是不行的:

const frames = []
_.times(10, v => {
  const path = `./assets/images/frame_${v}.png`
  frames.push(require(path))
}

上面的代碼中的 path 是在程序運(yùn)行時(shí)才能確定的,即屬于 runtime 階段,而 webpack 中的 require 是在構(gòu)建階段確定文件位置的,所以 webpack 沒(méi)法推測(cè)出這個(gè) path 在哪里。

但是卻可以這樣寫:

const frames = []
_.times(10, v => {
  frames.push(require(`./assets/images/frame_${v}.png`))
}
// frames 中就得到 帶 hash 值的路徑

雖然這兩種寫法在語(yǔ)法上沒(méi)有差別,但是第二種寫法在構(gòu)建時(shí)提示了 webpack,webpack 會(huì)將 ./assets/images 中的所有文件都加入到 bundle 中,從而在你運(yùn)行時(shí)可以找到對(duì)應(yīng)的文件。

在使用方法二的時(shí)候筆者嘗試將批量加載的邏輯提取到其他模塊用來(lái)復(fù)用:

export function loadAll (n, prefix, suffix) {
 const frames = []
 _.times(n, v => {
  frames.push(require('./' + prefix + v + suffix))
 })
 return frames
}

但是顯然失敗了,因?yàn)樘崛『蟮拇a,運(yùn)行的 context 屬于另一個(gè)模塊,所以也就無(wú)法找到相對(duì)路徑中的文件。

方法三:require.context

上面兩種方法都不算很優(yōu)雅,于是就去翻 webpack 的文檔,終于,讓我找到了這么一個(gè)方法:require.context

require.context(
 directory: String,
 includeSubdirs: Boolean /* 可選的,默認(rèn)值是 true */,
 filter: RegExp /* 可選的,默認(rèn)值是 /^\.\/.*$/,所有文件 */,
 mode: String /* 可選的,'sync' | 'eager' | 'weak' | 'lazy' | 'lazy-once',默認(rèn)值是 'sync' */
)

指定一系列完整的依賴關(guān)系,通過(guò)一個(gè) directory 路徑、一個(gè) includeSubdirs 選項(xiàng)、一個(gè) filter 更細(xì)粒度的控制模塊引入和一個(gè) mode 定義加載方式。然后可以很容易地解析模塊.

我們還是看上面的例子:

const frames = []
const context = require.context('./assets/images', false, /frame_\d+.png/)
context.keys().forEach(k => {
  frames.push(context(k))
})

這里的代碼通過(guò) require.context 創(chuàng)建了一個(gè) require 上下文。

  • 第一個(gè)參數(shù)指定了需要加載的文件夾,即組件當(dāng)前目錄下的 ./assets/images 文件夾
  • 第二個(gè)參數(shù)指定是否需要包含子目錄,由于沒(méi)有子目錄,所以傳 false
  • 第三個(gè)參數(shù)指定需要包含的文件的匹配規(guī)則,我們用一個(gè)正則表示

然后使用 context.keys() 就能拿到該上下文的文件路徑列表,而 context 本身也是一個(gè)方法,相當(dāng)于設(shè)置過(guò)上下文的 require,我們將 require 后的文件放入數(shù)組中,數(shù)組中的路徑其實(shí)是帶 hash 值的,如下是我項(xiàng)目中的圖片:

["/static/img/frame_0.965ef86f.png", "/static/img/frame_1.c7465967.png", "/static/img/frame_2.41e82904.png", "/static/img/frame_3.faef7de9.png", "/static/img/frame_4.27ebbe45.png", "/static/img/frame_5.d98cbebe.png", "/static/img/frame_6.c10859bc.png", "/static/img/frame_7.5e9cbdf0.png", "/static/img/frame_8.b3b92c71.png", "/static/img/frame_9.36660295.png"]

而且如果設(shè)置過(guò)內(nèi)聯(lián)圖片的話,數(shù)組中可能還有圖片的 base64 串。

重構(gòu)一下

方法三已經(jīng)解決了我們的問(wèn)題,而且可以批量 require 某個(gè)文件夾中的文件。但是 forEach 那塊的邏輯明顯是重復(fù)的,所以我們當(dāng)然提取出來(lái)啦,以后多個(gè)組件調(diào)用的時(shí)候只需要引入即可:

公共模塊:

/**
 * 批量加載幀圖片
 * @param {Function} context - require.context 創(chuàng)建的函數(shù)
 * @returns {Array<string>} 返回的所有圖片
 */
function loadFrames (context) {
 const frames = []
 context.keys().forEach(k => {
  frames.push(context(k))
 })
 return frames
}

組件中:

const context = require.context('./assets/images', false, /frame_\d+.png/)
const frames = loadFrames(context)

大功告成!感興趣的小伙伴可以點(diǎn)擊文末鏈接查看詳細(xì)文檔~

參考鏈接
require.context
webpack dynamic require

到此這篇關(guān)于webpack 動(dòng)態(tài)批量加載文件的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)webpack 動(dòng)態(tài)批量加載文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS截取數(shù)組操作簡(jiǎn)單示例

    JS截取數(shù)組操作簡(jiǎn)單示例

    這篇文章主要給大家介紹了關(guān)于JS截取數(shù)組操作的相關(guān)資料,對(duì)數(shù)組的操作相信大家都不陌生,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 微信小程序中wxs文件的一些妙用分享

    微信小程序中wxs文件的一些妙用分享

    wxs相當(dāng)于一個(gè)獨(dú)立模塊,相當(dāng)于一個(gè)獨(dú)立出來(lái)的module對(duì)象,通過(guò)module.exports向外暴露,在文件中引入即可使用,下面這篇文章主要給大家介紹了關(guān)于微信小程序中wxs文件的一些妙用,需要的朋友可以參考下
    2022-01-01
  • window.location.href = window.location.href 跳轉(zhuǎn)無(wú)反應(yīng) a超鏈接onclick事件寫法

    window.location.href = window.location.href 跳轉(zhuǎn)無(wú)反應(yīng) a超鏈接onclic

    js下window.location.href = window.location.href 跳轉(zhuǎn)無(wú)反應(yīng) a 超鏈接 onclick 點(diǎn)擊跳轉(zhuǎn)無(wú)反應(yīng)問(wèn)題的解決方法
    2013-08-08
  • 使用JavaScript給圖片添加水印的實(shí)現(xiàn)方法封裝

    使用JavaScript給圖片添加水印的實(shí)現(xiàn)方法封裝

    圖片加水印是一種常見的圖像處理技術(shù),通常用于保護(hù)版權(quán)、防止盜用、增加圖片的識(shí)別度等多種場(chǎng)景,這篇文章主要給大家介紹了關(guān)于使用JavaScript給圖片添加水印的實(shí)現(xiàn)方法封裝,需要的朋友可以參考下
    2024-03-03
  • 通過(guò)說(shuō)明與示例了解js五種設(shè)計(jì)模式

    通過(guò)說(shuō)明與示例了解js五種設(shè)計(jì)模式

    這篇文章主要介紹了通過(guò)說(shuō)明與示例了解js五種設(shè)計(jì)模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • JS實(shí)現(xiàn)獲取GIF總幀數(shù)的方法詳解

    JS實(shí)現(xiàn)獲取GIF總幀數(shù)的方法詳解

    如何通過(guò)js在上傳前就拿到它的總幀數(shù)來(lái)判斷呢?本文就跟大家分享一種解決方案,并將其封裝成插件發(fā)布至npm倉(cāng)庫(kù),快跟隨小編一起學(xué)習(xí)一下吧
    2022-05-05
  • js實(shí)現(xiàn)的倒計(jì)時(shí)按鈕實(shí)例

    js實(shí)現(xiàn)的倒計(jì)時(shí)按鈕實(shí)例

    這篇文章主要介紹了js實(shí)現(xiàn)的倒計(jì)時(shí)按鈕,實(shí)例分析了javascript倒計(jì)時(shí)效果的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • JS實(shí)現(xiàn)表單中點(diǎn)擊小眼睛顯示隱藏密碼框中的密碼

    JS實(shí)現(xiàn)表單中點(diǎn)擊小眼睛顯示隱藏密碼框中的密碼

    這篇文章主要介紹了JS實(shí)現(xiàn)表單中點(diǎn)擊小眼睛顯示隱藏密碼框中的密碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 判斷數(shù)組是否包含某個(gè)元素的js函數(shù)實(shí)現(xiàn)方法

    判斷數(shù)組是否包含某個(gè)元素的js函數(shù)實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇判斷數(shù)組是否包含某個(gè)元素的js函數(shù)實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • JavaScript function函數(shù)種類詳解

    JavaScript function函數(shù)種類詳解

    這篇文章主要為大家詳細(xì)介紹了JavaScript function函數(shù)種類,包括普通函數(shù)、匿名函數(shù)、閉包函數(shù),感興趣的小伙伴們可以參考一下
    2016-02-02

最新評(píng)論

信宜市| 东乡族自治县| 阿巴嘎旗| 佛冈县| 汪清县| 金川县| 堆龙德庆县| 平远县| 淳安县| 呼伦贝尔市| 永春县| 马公市| 萍乡市| 丰顺县| 玛沁县| 科技| 泽普县| 西畴县| 延寿县| 乌苏市| 门头沟区| 田阳县| 广宗县| 新干县| 海宁市| 郓城县| 鄂尔多斯市| 万载县| 维西| 海盐县| 霍州市| 广安市| 凤台县| 河津市| 五家渠市| 洱源县| 奇台县| 赣州市| 都安| 加查县| 扎赉特旗|