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

webpack-dev-server原理解析及跨域解決方法

 更新時間:2024年01月22日 10:45:46   作者:背太陽的牧羊人  
這篇文章主要介紹了webpack-dev-server原理解析及跨域解決方法,需要的朋友可以參考下

webpack proxy ,就是 webpack 提供的解決跨域的方案。其基本行為是接受客戶端發(fā)送的請求后轉發(fā)給其他的服務器,目的是為了解決在開發(fā)模式下的跨域問題。

原理

webpack中的proxy 工作原理是利用了 http-proxy-middleware 這個http 代理中間件,實現(xiàn)將請求轉發(fā)給其他的服務器。

如下:在開發(fā)階段,本地地址是 Http://loaclhost:3000 , 該瀏覽器發(fā)送一個前綴帶有 /api 標識的向服務器請求數據,但是這個服務器只是將這個請求轉發(fā)給另一臺服務器:

const express = require('express');
const proxy = require('http-proxy-middleware');
const app = express();
app.use('/api', proxy({target: 'http://www.test.org', changeOrigin: true}));
app.listen(3000);
// http://localhost:3000/api/foo/bar -> http://www.test.org/api/foo/bar

在開發(fā)階段,webpack-dev-server 會自動啟動一個本地開發(fā)服務器,所以我們的應用在開發(fā)階段是獨立運行在 localhost 的一個端口上的,而后端服務器又是運行在另一個地址上.。

所以在開發(fā)階段中,由于瀏覽器的同源策略,當本地瀏覽器訪問后端服務器的時候就會出現(xiàn)跨域請求資源的問題。

在這里插入圖片描述

通過設置 webpack proxy 實現(xiàn)代理請求后,相當于瀏覽器和服務器之間添加了一個代理服務器。
當本地發(fā)送請求的時候,中間服務器會接受這個情求,并將這個請求轉發(fā)給目標服務器(也就是后端服務器),目標服務器返回數據后,中間服務器又會將數據返回給瀏覽器,當中間服務器將數據返回給服務器的時候,它們兩者是同源的,并不會存在跨域的問題。

服務器和服務器之間是不會存在跨域資源的問題的。

webpack-dev-server

webpack 提供代理服務器的工具是webpack-dev-server,但只適用于開發(fā)階段,線上要實現(xiàn)代理一般通過 nginx 來配置。

webpack 中的服務器工具 webpack-dev-server,實質上是啟動了一個 express 服務器。

proxy 代理是利用 http-proxy-middleware 這個http代理中間件實現(xiàn)將請求轉發(fā)給其他服務器。
(vite 是用的 http-proxy,其實 http-proxy-middleware 也是基于 http-proxy 的)

背后其實都是使用 node 來啟動 server 服務器,這也是為什么我們常說這種代理只能在開發(fā)階段使用,因為 build 生產包時我們并不會打包一個 node 服務器進去,線上要實現(xiàn)代理一般直接通過 nginx 來配置。

可以在webpack 配置對象屬性中通過 devServer 屬性來配置:

// ./webpack.config.js
const path = require('path')
module.exports = {
    // ...
    devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true,
        port: 9000,
        proxy: {
            '/api': {
                target: 'https://api.github.com'
            }
        }
        // ...
    }
}

在這里插入圖片描述

webpack-dev-server常用的配置項

Proxy代理

它的目的是設置代理來解決跨域訪問的問題。舉例:
我們的一個api請求地址(也就是服務器地址)是 http://localhost:8888,
但是本地啟動服務器的域名是 http://localhost:8000,
這個時候發(fā)送網絡請求就會出現(xiàn)跨域的問題(端口不同)。
所以將請求先發(fā)送到一個代理服務器,代理服務器和API服務器沒有跨域的問題,就可以解決我們的跨域問題了。

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {// 以 /api 開頭的請求,會轉發(fā)到下面的 target 配置
        target: 'http://localhost:8888',// 目標服務器
         pathRewrite: { 
          "^/api": "", // 重寫路徑為空,即請求路徑中沒有/api字符串
          "^/api": "/abcd" // 重寫路徑為abcd,即將請求路徑中的/api字符串替換成/abcd
        },
        secure: false,// https接口,需要配置這個參數
        changeOrigin: true,// 將請求頭中的host 配置為 target
      },
    },
     host: '0.0.0.0', //用于指定devDerve使用的host,如果你希望服務器外部可以訪問,設定如 host: '0.0.0.0'
     https: true, // 默認情況下dev-server使用http協(xié)議,通過配置可以支持https,
     // 注意:默認使用自簽名證書,也可以配置自己的證書
     // https: {
     //     ca: './path/to/server.pem',
     //     pfx: './path/to/server.pfx',
     //     key: './path/to/server.key',
     //     cert: './path/to/server.crt',
     //     passphrase: 'webpack-dev-server',
     //     requestCert: true,
     // },
     // 開啟熱模塊替換
     hot: true,
  },
};
  • target:表示的是代理到的目標地址(也就是要訪問的服務器地址),比如 /api會被代理到 http://localhost:8888/api
  • pathRewrite:默認情況下,我們的 /api 也會被寫入到URL中,即:http://localhost:8888/api, 如果希望刪除,可以使用pathRewrite,比如:
  • 配置成 "^/api": "",那么/api/user => http://localhost:8888/user,地址中沒有/api,因為重新路徑是空的;
  • 配置成"^/api": "/abcd" ,那么/api/user => http://localhost:8888/abcd/user,即將請求路徑中的/api字符串替換成/abcd
  • secure: 默認情況下,不接受在 HTTPS 上運行且證書無效的后端服務器。 https接口,需要配置這個參數為false;
  • changeOrigin:它表示是否更新代理后請求的headers中host地址,一般設置為true

proxy配置中 changeOrigin: true,// 將請求頭中的host 配置為 target。
那為什么要更改請求頭中的host呢?

因為一臺服務器上可以部署多個項目,當我們發(fā)送請求時,DNS 會將域名解析為 IP 地址,此時,也就確定了我們目標服務器,那如何確定我們要訪問的是哪個項目呢?這就需要用到 host 字段了。

請求頭中Host用來指定請求的 域名/ip地址和端口號,通常用于指定服務器的地址,端口號可以省略,省略時默認為80端口。

此時我們將host指定為a.com就會訪問到淘寶服務了。

在這里插入圖片描述

所以如果一臺服務器上部署多個項目時,我們需要更改請求頭中的host,來指定我們要訪問的項目。

一臺服務器只有一個項目時,我們可以不用更改請求頭中的host,因為DNS解析后,就確定了我們要訪問的項目。

但為了以后用起來方便,就統(tǒng)一將這個配置項changeOrigin設置為true。

host

devServer.host 配置項?于配置 DevServer 服務監(jiān)聽的地址,默認使? 8080 端?。 如果 8080 端? 已經被其它程序占有就使? 8081,如果 8081 還是被占?就使? 8082,以此類推

例如:
你想要局域?中的其它設備訪問你本地的服務,可以在啟動 DevServer 時帶上 --host 0.0.0.0 ,
也可以在webpack配置項devServer.host中設置0.0.0.0
host 的默認值是 127.0.0.1 即只有本地可以訪問 DevServer 的 HTTP 服務。

localhost 和 0.0.0.0 的區(qū)別:

localhost:本質上是一個域名,通常情況下會被解析成127.0.0.1。127.0.0.1:回環(huán)地址(Loop Back Address),表達的意思其實是我們主機自己發(fā)出去的包,直接被自己接收。

正常的數據庫包經過 應用層 - 傳輸層 - 網絡層 - 數據鏈路層 - 物理層 ,而回環(huán)地址,是在網絡層直接就被獲取到了,是不會經過數據鏈路層和物理層的。

比如:
我們監(jiān)聽 127.0.0.1時,在同一個網段下的主機中,通過ip地址是不能訪問的。
0.0.0.0:監(jiān)聽IPV4上所有的地址,再根據端口找到不同的應用程序,比如我們監(jiān)聽 0.0.0.0時,在同一個網段下的主機中,通過ip地址是可以訪問的

port、open、compress

devServer.port設置監(jiān)聽的端口,默認情況下是8080,不能設置為null,可以設置自動為auto

module.exports = {
  //...
  devServer: {
    port: 8080, 
  },
};

devServer.open告訴 dev-server 在服務器已經啟動后打開瀏覽器。設置其為 true 以打開你的默認瀏覽器。

module.exports = {
  //...
  devServer: {
    open: true,
    //在瀏覽器中打開指定頁面:open: ['/my-page']
    //提供要使用的瀏覽器名稱,而不是默認名稱
  // open: {
      //   app: {
      //  name: 'google-chrome',
    //  },
   // },
  },
};

devServer.compress告訴 dev-server 在服務器端啟用 gzip 壓縮,用于減少服務器向前端傳輸的數據量,提高瀏覽的速度。

module.exports = {
  //...
  devServer: {
    compress: true,
  },
};

在這里插入圖片描述

參考

到此這篇關于webpack-dev-server原理解析及其中跨域解決方法的文章就介紹到這了,更多相關webpack-dev-server原理解析及其中跨域解決方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JS實現(xiàn)面向對象繼承的5種方式分析

    JS實現(xiàn)面向對象繼承的5種方式分析

    這篇文章主要介紹了JS實現(xiàn)面向對象繼承的5種方式,結合實例形式分析了JavaScript面向對象繼承功能的5種常見實現(xiàn)方法原理與操作技巧,需要的朋友可以參考下
    2018-07-07
  • JS獲取URL中的參數數據

    JS獲取URL中的參數數據

    這篇文章主要介紹了JS獲取URL中的參數數據,有需要的朋友可以參考一下
    2013-12-12
  • MyEclipse取消驗證Js的兩種方法

    MyEclipse取消驗證Js的兩種方法

    通過js寫一個web工程的相關頁面時感覺很卡,修改內存也不行下面有兩種解決方法,大家可以嘗試下
    2013-11-11
  • setTimeout在類中使用的問題!

    setTimeout在類中使用的問題!

    setTimeout在類中使用的問題!...
    2007-04-04
  • Js 彈出框口并返回值的兩種常用方法

    Js 彈出框口并返回值的兩種常用方法

    有時候我們需要在新窗口執(zhí)行一些代碼并講求將執(zhí)行的結果返回到這個頁面,那么就需要下面的方法,js常用的就是下面這中方法。
    2010-12-12
  • js面向對象的寫法

    js面向對象的寫法

    這篇文章主要介紹了四種js面向對象的常見寫法,還介紹了有關this的相關內容,感興趣的小伙伴們可以參考一下
    2016-02-02
  • ES6中字符串的使用方法擴展

    ES6中字符串的使用方法擴展

    這篇文章主要給大家介紹了關于ES6中字符串的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用ES6具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • JavaScript使用rem實現(xiàn)移動頁面響應式

    JavaScript使用rem實現(xiàn)移動頁面響應式

    在當今的移動互聯(lián)網時代,確保網頁在各種移動設備上都能完美顯示是至關重要的,響應式設計是實現(xiàn)這一目標的關鍵技術之一,而使用 rem 單位是實現(xiàn)移動端響應式頁面的一種有效方法,本文將詳細介紹如何使用 rem 單位來創(chuàng)建響應式的移動端頁面,需要的朋友可以參考下
    2025-04-04
  • 微信小程序實現(xiàn)文字滾動

    微信小程序實現(xiàn)文字滾動

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)文字滾動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 收集json解析的四種方法分享

    收集json解析的四種方法分享

    這篇文章主要介紹了json解析的四種方法,有需要的朋友可以參考一下
    2014-01-01

最新評論

伊吾县| 阿巴嘎旗| 武川县| 泰宁县| 渝北区| 陇川县| 锦屏县| 封开县| 三穗县| 开阳县| 蒙阴县| 吴桥县| 洛川县| 垦利县| 芜湖县| 土默特左旗| 图木舒克市| 中卫市| 宜春市| 锡林郭勒盟| 惠州市| 永兴县| 南安市| 安龙县| 凉城县| 汉川市| 高碑店市| 淳化县| 田阳县| 清苑县| 宜都市| 平安县| 邳州市| 马山县| 河西区| 新邵县| 庄浪县| 靖江市| 仙游县| 新田县| 新津县|