qiankun 微前端應(yīng)用實踐與部署(四)

一般情況下,我們對應(yīng)用進行配置打包秤茅,要對圖片字體等資源進行下面配置稚补,使得資源路徑正常加載。但是嫂伞,在微前端模式下孔厉,子應(yīng)用打包部署后,往往會出現(xiàn)子應(yīng)用 css 文件里面引入資源路徑加載失敗的問題帖努,下面就讓我們來探究一下撰豺。

?? 獨立應(yīng)用下的 url-loader 配置:

// vue-cli 2 寫法

module: {
  rules: [
    {
      test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
      loader: "url-loader",
      options: {
        limit: 10000,
        // 此處的 utils.assetsPath 是函數(shù),返回根據(jù)配置項拼接好的路徑拼余,如 static/fonts/[name].[hash:7].[ext] 
        name: utils.assetsPath("img/[name].[hash:7].[ext]")
      }
    },
    {
      test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
      loader: "url-loader",
      options: {
        limit: 10000,
        // 此處的 utils.assetsPath 是函數(shù)污桦,返回根據(jù)配置項拼接好的路徑,如 static/fonts/[name].[hash:7].[ext] 
        name: utils.assetsPath("fonts/[name].[hash:7].[ext]")
      }
    }
  ]
}

因為 url-loaderoptions 項的屬性 publicPath 屬性默認是 ''匙监,表示相對路徑凡橱,即打包出來的資源引用 url 都會加上相對路徑尋找 static 靜態(tài)資源入口小作,比如:

/* static/css/app.e99e9aae.css */

background-header {
    background: url(../../static/img/bg_header.790a94f4.png);
}

所有應(yīng)用編譯打包部署后,當(dāng)主應(yīng)用加載子應(yīng)用稼钩,子應(yīng)用加載自身的 css 文件樣式時顾稀,由于 其對應(yīng)的 css 文件里面的圖片 url 引用是相對路徑,會出現(xiàn)子應(yīng)用的資源相對路徑拼接主應(yīng)用 domain 的情況坝撑,即子應(yīng)用的 ../../static/img/bg_header.790a94f4.png 會在主應(yīng)用的 domain 下進行資源的尋找静秆,導(dǎo)致加載失敗 404 的情況。

解決打包后的 css 背景圖片與字體圖標路徑問題

如果項目有用到第三方庫巡李,比如 element-ui抚笔,那么就更有必要進行處理了。因為 element-ui 的字體圖標是在 css 里面引入的侨拦,還有相關(guān)背景圖片的引入也是在 css 里累舷,所以需要配置 webpackurl-loader哨坪,生產(chǎn)模式情況下直接指定資源前綴,使之成為絕對路徑。

module: {
  rules: [
    {
      test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
      loader: "url-loader",
      options: {
        limit: 10000,
        name: utils.assetsPath("img/[name].[hash:7].[ext]"),
        //這里 192.168.2.192:7100 是子應(yīng)用部署地址
        publicPath: process.env.NODE_ENV === 'production' ? '//192.168.2.192:7100' : ''
      }
    },
    {
      test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
      loader: "url-loader",
      options: {
        limit: 10000,
        name: utils.assetsPath("fonts/[name].[hash:7].[ext]"),
        publicPath: process.env.NODE_ENV === 'production' ? '//192.168.2.192:7100' : ''
      }
    }
  ]
}

這樣配置后邓尤,打包出來的 css 樣式文件會變成:

/* static/css/app.e99e9aae.css */

background-header {
    background: url(//192.168.2.192:7100/static/img/bg_header.790a94f4.png);
}

資源是絕對路徑砍聊,就不會出現(xiàn)上面子應(yīng)用資源加載失敗的情況唧龄。

但是局冰,這種前端配置文件寫死路徑的做法靈活性并不好,比如不能做到編譯一次训貌,任意部署制肮,因為路徑寫死,所以如果需要部署到其他服務(wù)器的話递沪,就需要重新編譯了豺鼻。

接下來,講的是實現(xiàn)靈活部署的方案款慨。

結(jié)合 nginx 配置資源引用路徑代理轉(zhuǎn)發(fā)

我們在只編譯打包一次前端應(yīng)用的前提下儒飒,為了實現(xiàn)靈活部署,需要借助 nginx 來實現(xiàn)檩奠。

下面以 vue-cli 3 的配置為例桩了,與 vue-cli 2 只是寫法上的區(qū)別,其他都一樣埠戳。

不過 vue-cli 3 對 webpack 配置進行了抽象井誉,要理解配置中包含的東西會比較困難,尤其是當(dāng)我們需要重寫或者調(diào)整配置的時候整胃,可以參考 審查項目的 webpack 配置颗圣。

module.exports = {
  chainWebpack: (config) => 

    config.module
      .rule("fonts")
      .test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/)
      .use("url-loader")
      .loader("url-loader")
      .options({
        limit: 4096,
        name: 'static/fonts/[name].[hash:8].[ext]',
        publicPath: process.env.NODE_ENV === 'production' ? '/live' : '',
      });

    config.module
      .rule("images")
      .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
      .use("url-loader")
      .loader("url-loader")
      .options({
        limit: 4096,
        // name 代表 url-loader 會將資源寫到 static/fonts/ 下
        name: 'static/img/[name].[hash:8].[ext]',
        // publicPath 代表資源引入 url 會生成 /live 的前綴,比如 /live/static/img/bg_header.790a94f4.png
        publicPath: process.env.NODE_ENV === 'production' ? '/live' : '',
      });

  }
}

假設(shè)主應(yīng)用部署地址是 192.168.2.192,子應(yīng)用的部署地址是 192.168.2.192:7102在岂。

打包編譯部署后奔则,子應(yīng)用的 css 文件里面的圖片資源引用 url 如下:

/* static/css/app.e99e9aae.css */

background-header {
    background: url(/live/static/img/bg_header.790a94f4.png);
}

主應(yīng)用加載子應(yīng)用的時候,子應(yīng)用的資源拼接主應(yīng)用 domian 后蔽午,子應(yīng)用的 css 文件里面的圖片資源加載路徑 url 就會變成:

192.168.2.192/live/static/img/bg_header.790a94f4.png

此時的關(guān)鍵就是要訪問到子應(yīng)用的資源易茬,而不是去主應(yīng)用資源目錄去找。

所以我們采用 nginx 路徑代理轉(zhuǎn)發(fā)端口的方案祠丝,當(dāng)應(yīng)用訪問 192.168.2.192/live 這個路徑時疾呻,經(jīng)過 nginx 進行路徑代理轉(zhuǎn)發(fā)配置,轉(zhuǎn)發(fā)到子應(yīng)用端口写半。

配置 nginx 代理規(guī)則:

# nginx.conf

http {
  server {
    listen  80;
    server_name 192.168.2.192;
  
    location /live {
      proxy_pass  127.0.0.1:7102

      try_files $uri $uri/ /index.html;
    }
  }
}

此時真正訪問的資源路徑(子應(yīng)用資源路徑)是:

192.168.2.192:7102/static/img/bg_header.790a94f4.png

?? 至此,通過修改配置 url-loaderpublicPath 以及配置 nginx 的路徑代理轉(zhuǎn)發(fā)尉咕,就可以實現(xiàn)編譯打包一次叠蝇,到處部署的目的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末年缎,一起剝皮案震驚了整個濱河市悔捶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌单芜,老刑警劉巖蜕该,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洲鸠,居然都是意外死亡堂淡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門扒腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绢淀,“玉大人,你說我怎么就攤上這事瘾腰〗缘模” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵蹋盆,是天一觀的道長费薄。 經(jīng)常有香客問我,道長栖雾,這世上最難降的妖魔是什么楞抡? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮岩灭,結(jié)果婚禮上拌倍,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好柱恤,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布数初。 她就那樣靜靜地躺著,像睡著了一般梗顺。 火紅的嫁衣襯著肌膚如雪泡孩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天寺谤,我揣著相機與錄音仑鸥,去河邊找鬼。 笑死变屁,一個胖子當(dāng)著我的面吹牛眼俊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粟关,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疮胖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闷板?” 一聲冷哼從身側(cè)響起澎灸,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遮晚,沒想到半個月后性昭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡县遣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年糜颠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺玲。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡括蝠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饭聚,到底是詐尸還是另有隱情忌警,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布秒梳,位于F島的核電站法绵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酪碘。R本人自食惡果不足惜朋譬,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兴垦。 院中可真熱鬧徙赢,春花似錦字柠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枕屉,卻和暖如春常柄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搀擂。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工西潘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哨颂。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓喷市,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咆蒿。 傳聞我的和親對象是個殘疾皇子东抹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359