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

Webpack打包圖片-js-vue 案例解析

 更新時間:2023年11月06日 10:05:49   作者:coder!mq  
在開發(fā)中我們會有各種各樣的模塊依賴,這些模塊可能來自于自己編寫的代碼,也可能來自第三方庫,本文給大家介紹Webpack打包圖片-js-vue的相關知識,感興趣的朋友跟隨小編一起看看吧

一、Webpack打包圖片

1.加載圖片資源的準備

為了演示我們項目中可以加載圖片,我們需要在項目中使用圖片,比較常見的使用圖片的方式是兩種:

  • img元素,設置src屬性;
  • 其他元素(比如div),設置background-image的css屬性;

2.認識asset module type

我們當前使用的webpack版本是webpack5:

  • 在webpack5之前,加載這些資源我們需要使用一些loader,比如raw-loader 、url-loader、file-loader;
  • 在webpack5開始,我們可以直接使用資源模塊類型(asset module type),來替代上面的這些loader;

資源模塊類型(asset module type),通過添加 4 種新的模塊類型,來替換所有這些 loader:

  • asset/resource 發(fā)送一個單獨的文件并導出 URL。
  • 之前通過使用 file-loader 實現(xiàn);
  • asset/inline 導出一個資源的 data URI。
  • 之前通過使用 url-loader 實現(xiàn);
  • asset/source 導出資源的源代碼
  • 之前通過使用 raw-loader 實現(xiàn);
  • asset 在導出一個 data URI 和發(fā)送一個單獨的文件之間自動選擇。
  • 之前通過使用 url-loader,并且配置資源體積限制實現(xiàn);

3.asset module type的使用

比如加載圖片,我們可以使用下面的方式:

{
    test: /\.(png|svg|jpg|jpeg|gif)$/i,
    type: "asset/resource"    
}

但是,如何可以自定義文件的輸出路徑和文件名呢?

  • 方式一:修改output,添加assetModuleFilename屬性;
  • 方式二:在Rule中,添加一個generator屬性,并且設置filename;
output: {
    filename: "js/bundle.js",
    path: path.resolve(__dirname, "./dist"),
    assetModuleFilename: "img/[name].[hash:6][ext]"    
}
{
    test: /\.(png|svg|jpg|jpeg|gif)$/i,
    type: "asset/resource",
    generator: {
        filename: "img/[name].[hash:6][ext]"
    }    
}

我們這里介紹幾個最常用的placeholder:

  • [ext]: 處理文件的擴展名;
  • [name]:處理文件的名稱;
  • [hash]:文件的內(nèi)容,使用MD4的散列函數(shù)處理,生成的一個128位的hash值(32個十六進制);

4.url-loader的limit效果

開發(fā)中我們往往是小的圖片需要轉換,但是大的圖片直接使用圖片即可

  • 這是因為小的圖片轉換base64之后可以和頁面一起被請求,減少不必要的請求過程;
  • 而大的圖片也進行轉換,反而會影響頁面的請求速度;

我們需要兩個步驟來實現(xiàn):

  • 步驟一:將type修改為asset;
  • 步驟二:添加一個parser屬性,并且制定dataUrl的條件,添加maxSize屬性;
module.exports = {
    rules: [
        {
            test: /\.(png|svg|jpg|jpeg|gif)$/i,
            type: "asset",
            generator: {
                filename: "img/[name].[hash:6][ext]"
            },
            parser: {
                dataUrlCondition: {
                    maxSize: 100 * 1024
                }
            }
        }
    ]
}

二、babel

1.為什么需要babel

事實上,在開發(fā)中我們很少直接去接觸babel,但是babel對于前端開發(fā)來說,目前是不可缺少的一部分:

  • 開發(fā)中,我們想要使用ES6+的語法,想要使用TypeScript,開發(fā)React項目,它們都是離不開Babel的;
  • 所以,學習Babel對于我們理解代碼從編寫到線上的轉變過程至關重要;

那么,Babel到底是什么呢?

  • Babel是一個工具鏈,主要用于舊瀏覽器或者環(huán)境中將ECMAScript 2015+代碼轉換為向后兼容版本的JavaScript;
  • 包括:語法轉換、源代碼轉換等;

2.babel命令行的使用

babel本身可以作為一個獨立的工具(和postcss一樣),不和webpack等構建工具配置來單獨使用。

如果我們希望在命令行嘗試使用babel,需要安裝如下庫:

  • @babel/core:babel的核心代碼,必須安裝;
  • @babel/cli:可以讓我們在命令行使用babel;
npm install -D @babel/core @babel/cli

使用babel來處理我們的源代碼:

  • src:是源文件的目錄;
  • –out-dir:指定要輸出的文件夾dist;
npx babel src --out-dir dist

3.babel插件的使用

比如我們需要轉換箭頭函數(shù),那么我們就可以使用箭頭函數(shù)轉換相關的插件

npm install @babel/plugin-transform-arrow-functions -D
npx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functions

查看轉換后的結果:我們會發(fā)現(xiàn) const 并沒有轉成 var

  • 這是因為 plugin-transform-arrow-functions,并沒有提供這樣的功能;
  • 我們需要使用 plugin-transform-block-scoping 來完成這樣的功能;
npm install @babel/plugin-transform-block-scoping -D 
npx babel src --out-dir dist --plugins=@babel/plugin-transform-block-scoping
						,@babel/plugin-transform-arrow-functions

4.babel的預設preset

但是如果要轉換的內(nèi)容過多,一個個設置是比較麻煩的,我們可以使用預設(preset):

后面我們再具體來講預設代表的含義;

安裝@babel/preset-env預設:

npm install -D @babel/preset-env

執(zhí)行如下命令:

npx babel src --out-dir dist --presets=@babel/preset-env

5.babel-loader

在實際開發(fā)中,我們通常會在構建工具中通過配置babel來對其進行使用的,比如在webpack中。

那么我們就需要去安裝相關的依賴:

如果之前已經(jīng)安裝了@babel/core,那么這里不需要再次安裝;

npm install babel-loader -D

我們可以設置一個規(guī)則,在加載js文件時,使用我們的babel:

module.exports = {
	module: {
		rules: [
			{
				test: /\.m?js$/,
				use: {
					loader: "babel-loader"
				}
			}
		]
	}
}

6.babel-preset

如果我們一個個去安裝使用插件,那么需要手動來管理大量的babel插件,我們可以直接給webpack提供一個preset,webpack會根據(jù)我們的預設來加載對應的插件列表,并且將其傳遞給babel。

比如常見的預設有三個:

  • env
  • react
  • TypeScript

安裝preset-env:

npm install @babel/preset-env
module.exports = {
    module: {
        rules: [
			{
				test: /\.m?js$/,
				use: {
					loader: "babel-loader",
                    options: {
                        presets: [
                            ["@babel/preset-env"]
                        ]
                    }
				}
			}
		]
    }
}

三、加載Vue文件

1.編寫App.vue代碼

在開發(fā)中我們會編寫Vue相關的代碼,webpack可以對Vue代碼進行解析:

接下來我們編寫自己的App.vue代碼;

<template>
  <h2>{{ title }}</h2>
</template>
<script>
export default {
  data() {
    return {
      title: "我是標題"
    }
  }
}
</script>

2.App.vue的打包過程

我們對代碼打包會報錯:我們需要合適的Loader來處理文件。

這個時候我們需要使用vue-loader:

npm install vue-loader -D

在webpack的模板規(guī)則中進行配置:

{
    test: /\.vue$/,
    loader: "vue-loader"
}

3.@vue/compiler-sfc

打包依然會報錯,這是因為我們必須添加@vue/compiler-sfc來對template進行解析:

npm install @vue/compiler-sfc -D

另外我們需要配置對應的Vue插件:

const { VueLoaderPlugin } = require('vue-loader/dist/index')
module.exports = {
    module: {},
    plugins: [
        new VueLoaderPlugin()
    ]
}

重新打包即可支持App.vue的寫法

另外,我們也可以編寫其他的.vue文件來編寫自己的組件;

四、resolve模塊解析

1.resolve模塊解析

resolve用于設置模塊如何被解析

  • 在開發(fā)中我們會有各種各樣的模塊依賴,這些模塊可能來自于自己編寫的代碼,也可能來自第三方庫;
  • resolve可以幫助webpack從每個 require/import 語句中,找到需要引入到合適的模塊代碼;
  • webpack 使用 enhanced-resolve 來解析文件路徑;

webpack能解析三種文件路徑:

絕對路徑

  • 由于已經(jīng)獲得文件的絕對路徑,因此不需要再做進一步解析。

相對路徑

  • 在這種情況下,使用 import 或 require 的資源文件所處的目錄,被認為是上下文目錄;
  • 在 import/require 中給定的相對路徑,會拼接此上下文路徑,來生成模塊的絕對路徑;

模塊路徑

  • 在 resolve.modules中指定的所有目錄檢索模塊;
    • 默認值是 [‘node_modules’],所以默認會從node_modules中查找文件;
  • 我們可以通過設置別名的方式來替換初識模塊路徑,具體后面講解alias的配置;

2.文件還是文件夾

如果是一個文件:

  • 如果文件具有擴展名,則直接打包文件;
  • 否則,將使用 resolve.extensions選項作為文件擴展名解析;

如果是一個文件夾:

  • 會在文件夾中根據(jù) resolve.mainFiles配置選項中指定的文件順序查找;
    • resolve.mainFiles的默認值是 [‘index’];
    • 再根據(jù) resolve.extensions來解析擴展名;

3.extensions和alias配置

extensions是解析到文件時自動添加擴展名

默認值是 [‘.wasm’, ‘.mjs’, ‘.js’, ‘.json’];所以如果我們代碼中想要添加加載 .vue 或者 jsx 或者 ts 等文件時,我們必須自己寫上擴展名;

另一個非常好用的功能是配置別名alias:

  • 特別是當我們項目的目錄結構比較深的時候,或者一個文件的路徑可能需要 …/…/…/這種路徑片段;
  • 我們可以給某些常見的路徑起一個別名
module.exports = {
  resolve: {
    extensions: [".js", ".json", ".vue", ".jsx", ".ts", ".tsx"],
    alias: {
      utils: path.resolve(__dirname, "./src/utils")
    }
  },
}

到此這篇關于Webpack打包圖片-js-vue的文章就介紹到這了,更多相關Webpack打包圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 如何在vite初始化項目中安裝scss以及scss的使用

    如何在vite初始化項目中安裝scss以及scss的使用

    今天想要給vite項目,添加全局的scss變量文件引用,這樣我們在使用scss變量和函數(shù)的時候就不需要每個組件都取引用了,下面這篇文章主要給大家介紹了關于如何在vite初始化項目中安裝scss以及scss使用的相關資料,需要的朋友可以參考下
    2022-10-10
  • 關于Vue如何清除緩存的方法詳解

    關于Vue如何清除緩存的方法詳解

    緩存清除成為克服瀏覽器緩存中過時內(nèi)容挑戰(zhàn)的關鍵技術,術語“緩存清除”是指故意使靜態(tài)資源失效或進行版本控制,迫使瀏覽器在發(fā)生更改時獲取新資源,本文給大家介紹了Vue如何清除緩存,需要的朋友可以參考下
    2023-12-12
  • vue3項目打包成apk(android)詳細圖文教程

    vue3項目打包成apk(android)詳細圖文教程

    Vue本身是一個構建用戶界面的漸進式框架,不能直接打包成APK文件,但是你可以使用工具將Vue應用打包成一個可以在Android設備上安裝的APK文件,這篇文章主要給大家介紹了關于vue3項目打包成apk(android)的相關資料,需要的朋友可以參考下
    2024-05-05
  • Vue3實現(xiàn)大文件上傳:切片上傳 / 斷點續(xù)傳 / 秒傳 / 暫?;謴?nbsp;/ 全局并發(fā)控制

    Vue3實現(xiàn)大文件上傳:切片上傳 / 斷點續(xù)傳 / 秒傳 / 

    本文詳細介紹了基于Vue3實現(xiàn)的大文件上傳方案,涵蓋切片上傳、斷點續(xù)傳、秒傳、暫停/恢復和全局并發(fā)控制等功能,通過全局并發(fā)限流器、WebWorker進行切片和Hash計算、以及精確的進度統(tǒng)計,該方案在提高上傳效率和用戶體驗方面表現(xiàn)出色
    2026-02-02
  • Element的Message彈窗重復彈出問題解決

    Element的Message彈窗重復彈出問題解決

    本文主要介紹了Element的Message彈窗重復彈出,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue執(zhí)行配置選項npm?run?serve的本質圖文詳解

    vue執(zhí)行配置選項npm?run?serve的本質圖文詳解

    本地開發(fā)一般通過執(zhí)行npm run serve命令來啟動項目,那這行命令到底存在什么魔法?下面這篇文章主要給大家介紹了關于vue執(zhí)行配置選項npm?run?serve的本質的相關資料,需要的朋友可以參考下
    2023-05-05
  • vant樣式不生效問題的解決辦法

    vant樣式不生效問題的解決辦法

    這篇文章主要給大家介紹了vant樣式不生效問題的解決辦法,文中通過示例代碼介紹的非常詳細,對大家學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-06-06
  • Vuex?localStorage的具體使用

    Vuex?localStorage的具體使用

    本文主要介紹了Vuex?localStorage的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • uniapp?vue與nvue輪播圖之輪播圖組件的示例代碼

    uniapp?vue與nvue輪播圖之輪播圖組件的示例代碼

    這篇文章主要介紹了uniapp?vue與nvue輪播圖輪播圖組件的實例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • vue3中的props組件抽離

    vue3中的props組件抽離

    這篇文章主要介紹了vue3中的props組件抽離,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論

乌什县| 墨玉县| 梁平县| 邹平县| 青州市| 秭归县| 福清市| 大港区| 灯塔市| 封丘县| 江北区| 永兴县| 武隆县| 浑源县| 清原| 仁寿县| 华宁县| 平安县| 阿勒泰市| 巧家县| 富源县| 永安市| 甘肃省| 台中县| 日土县| 两当县| 西昌市| 南华县| 会理县| 金坛市| 霍州市| 华安县| 盐山县| 龙山县| 横山县| 班玛县| 福州市| 铅山县| 巴里| 西丰县| 罗平县|