resolve屬性的配置

resolve屬性的配置

1、做什么用的?

用來(lái)定義webpack如何查找模塊對(duì)應(yīng)的文件

2、常用配置

resolve:{
  //定義查找目錄順序 查找import包的時(shí)候 先找 node_modules 目錄,若找不到就找 myPackageDir目錄
  modules:["node_modules","myPackageDir"],
  //定義別名 定義某些包的真實(shí)加載路徑
  alias: {
    //定義 import bootstrap 包的時(shí)候去 "bootstrap/dist/style/bootstrap.css"目錄加載
    bootstrap: "bootstrap/dist/style/bootstrap.css",
    //定義 componets 關(guān)鍵字被解析為'./src/components/'
    //比如我們要引用 './src/components/toast.vue',
    // 如果我們定義了以下這個(gè)配置 則引用時(shí)可直接寫為 
    // import toast from  "components/toast.vue"
    componets: './src/components/'
  },
  //引用模塊時(shí),省略擴(kuò)展名,定義模塊查找順序
  // 實(shí)例 import "./style"; 其實(shí)就是先找 style.js,如果發(fā)現(xiàn)沒有就找style.css,找到了就不再往下找,沒找到就繼續(xù)
  extensions:[".js",".css",".json",".vue"]
}

webpack在啟動(dòng)后會(huì)從配置的入口模塊觸發(fā)找出所有依賴的模塊,Resolve配置webpack如何尋找模塊對(duì)應(yīng)的文件。webpack內(nèi)置JavaScript模塊化語(yǔ)法解析功能,默認(rèn)會(huì)采用模塊化標(biāo)準(zhǔn)里約定好的規(guī)則去尋找,但你可以根據(jù)自己的需要修改默認(rèn)的規(guī)則。

1. alias

resolve.alias配置項(xiàng)通過別名來(lái)把原來(lái)導(dǎo)入路徑映射成一個(gè)新的導(dǎo)入路徑。如下:

//webpack alias配置
resolve: {
    alias: {
        componets: './src/components/'
    }
}

當(dāng)你通過import Button from 'components/button'導(dǎo)入時(shí),實(shí)際上被alias等價(jià)替換成import Button from './src/components/button'。

以上alias配置的含義是把導(dǎo)入語(yǔ)句里的components關(guān)鍵字替換成./src/components。

樣做可能會(huì)命中太多的導(dǎo)入語(yǔ)句, alias還支持$符號(hào)來(lái)縮小范圍只命中以關(guān)鍵字結(jié)尾的導(dǎo)入語(yǔ)句:

resolve: {
    alias: {
        'react$' : '/path/to/react.min.js'
    }
}

這樣react$只會(huì)命中以react結(jié)尾的導(dǎo)入語(yǔ)句,即只會(huì)把import react關(guān)鍵字替換成import '/path/to/react.min.js'

2. mainFields

有一些第三方模塊會(huì)針對(duì)不同環(huán)境提供幾份代碼。例如分別提供采用ES5 和 ES6的2份代碼,這2份代碼的位置寫在package.json文件里:

{
    "jsnext: main": "es/index.js", //采用ES6語(yǔ)法的代碼入口文件
    "main": "lib/index.js"http://采用ES5語(yǔ)法的代碼入口文件
}

webpack會(huì)根據(jù)mainFields的配置去決定有限采用哪份代碼, mainFields默認(rèn)如下:

mainFields: ['browser', 'main']

webpack會(huì)按照數(shù)組里的順序去package.json文件里面找,只會(huì)使用找到的第一個(gè)。

假如我們想要ES6的那份代碼,可以這樣進(jìn)行配置:

mainFields: ['jsnext:main', 'browser', 'main']

3. extensions

在導(dǎo)入語(yǔ)句沒帶文件后綴時(shí),webpack會(huì)自動(dòng)帶上后綴去嘗試訪問文件是否存在。resolve.extensions用于配置在嘗試過程中用到的后綴列表,默認(rèn)是:

extensions:['.js', '.json']

也就是說當(dāng)遇到require('./data')這樣的導(dǎo)入語(yǔ)句時(shí),webpack會(huì)先去尋找./data.js文件,如果找不到則去找./data.json文件,如果還是找不到則會(huì)報(bào)錯(cuò)。

4. modules

resolve.modules配置webpack去哪些目錄下尋找第三方模塊。默認(rèn)是去node_modules目錄下尋找。有時(shí)你的項(xiàng)目中會(huì)有一些模塊大量被其他模塊依賴和導(dǎo)入,由于其他模塊的位置分布不定,針對(duì)不同的文件都要去計(jì)算被導(dǎo)入模塊文件的相對(duì)路徑,這個(gè)路徑有時(shí)候會(huì)很長(zhǎng),例如:import './../../components/button',這時(shí)你可以利用modules配置項(xiàng)優(yōu)化,假如那些大量導(dǎo)入的模塊都在./src/components目錄下:

modules:['./src/components', 'node_modules']

5. descriptionFiles

resolve.descriptionFiles配置描述第三方模塊的文件名稱,也就是package.json文件。默認(rèn)如下:

descriptionFiles: ['package.json']

6. enforceExtension

resolve.enforceExtension如果配置為true,所有導(dǎo)入語(yǔ)句都必須帶文件后綴。

7. enforceModuleExtension

enforceModuleExtension 和 enforceExtension 作用類似,但 enforceModuleExtension 只對(duì) node_modules 下的模塊生效。 enforceModuleExtension 通常搭配 enforceExtension 使用,在 enforceExtension:true 時(shí),因?yàn)榘惭b的第三方模塊中大多數(shù)導(dǎo)入語(yǔ)句沒帶文件后綴, 所以這時(shí)通過配置 enforceModuleExtension:false 來(lái)兼容第三方模塊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容