主頁 > 企業開發 > 現代前端庫開發指南系列(二):使用 webpack 構建一個庫

現代前端庫開發指南系列(二):使用 webpack 構建一個庫

2020-10-08 09:32:27 企業開發

前言

在前文中,我說過本系列文章的受眾是在現代前端體系下能夠熟練撰寫業務代碼的同學,因此本文在介紹 webpack 配置時,僅提及構建一個庫所特有的配置,其余配置請參考 webpack 官方檔案,

輸出產物

構建一個庫與構建一個一般應用最大的不同點在于構建完成后輸出的產物

一般應用構建完成后會輸出:

  • 一個 html 檔案
  • 一個 js 入口 chunk 、若干子 chunk
  • 若干 css 檔案
  • 若干其它資源,如圖片、字體檔案等

雖然輸出的資源非常多,但實際上所有的依賴、加載關系都已經從 html 檔案開始一層一層定下來了,換句話說,這個 html 檔案實際上就是整個應用的入口,

一個庫構建完成后會輸出:

  • 一個 CommonJS 格式的 js 檔案
  • 一個未壓縮的 UMD 格式的 js 檔案
  • 一個已壓縮的 UMD 格式的 js 檔案
  • 可能包括若干的 css 檔案
  • 可能包括若干的其它資源檔案

庫的入口分別是上面羅列的 js 檔案;你可能會奇怪,一個庫怎么會有3個入口檔案呢?莫急,且聽我一一道來,

CommonJS

CommonJS 是 Node.js 推行的一種模塊化規范,主要語法包括module.exportsrequire()等;而我們在使用 webpack 引入 npm 包時,實際上是處于 Node.js 環境,由此可知,這個 CommonJS 格式的入口 js 檔案(<庫名稱>.common.js)是供其它應用在 Node.js 環境下引入 npm 包使用的,由于在參考 npm 包時一般不會過多考慮 npm 包的體積(在構建自己的應用時如有需要可自行壓縮),且為了方便除錯,因此該 js 入口檔案是沒有經過壓縮的,

UMD

UMD 是一個模塊化規范大雜燴,除了兼容 CommonJS 外,它還兼容 AMD 模塊化規范,以及最傳統的全域變數模式,

這邊稍微介紹一下 AMD 規范, AMD 全稱 Asyncchronous Module Definition ,一般應用在瀏覽器端(這是與 CommonJS規范最大的不同點),最著名的 AMD 加載器是 RequireJS ,目前由于 webpack 的流行, AMD 這一模塊化方案已逐漸退出市場,

全域變數模式就很好理解了,就是把庫的入口掛載在一個全域變數(如window.xxx)上,頁面上的任何位置都能隨時取用,屬于最傳統的 js 插件加載方案,

由上可知, UMD 格式的入口 js 檔案,既可以用于參考 npm 包的場景(未壓縮的版本,即<庫名稱>.umd.js),也可以直接用于瀏覽器端(已壓縮的版本,即<庫名稱>.umd.min.js),

如何構建不同模塊化規范的庫檔案

目前, webpack 不支持同時生成多份入口 js 檔案,因此需要分多次來進行構建,

關鍵的 webpack 配置是:

  • CommonJS:output.libraryTarget: "commonjs2"
  • UMD:output.libraryTarget: "umd"

對于 UMD ,我們還需要設定全域變數名稱,即output.library: "LibraryName"

為了壓縮構建出來的檔案,最簡單的方法是在 CLI 中呼叫 webpack 命令時帶上 mode 引數,如webpack --mode=production;這是因為當 mode 的值為production時, webpack 會自動啟用 UglifyJsPlugin 對原始碼進行壓縮,

輸出版本資訊

我在某公司作業時,該公司對第三方依賴抓得很緊,所有在專案里使用的第三方依賴都必須申請且審核通過后才可使用;且申請時是精確到具體版本的,未申請的軟體版本也一概不允許使用,某些第三方依賴無論在檔案內容上,還是在檔案名稱上,都沒有體現出版本號,這就對我們識別這類第三方依賴產生障礙,這是我們開發自己的庫時需要引以為戒的,

在構建庫時,我們完全可以利用 webpack 把庫的資訊直接輸出到檔案內容里,有了這“身份資訊”,用戶使用起來也會格外安心,

輸出庫版本資訊的方法是使用 webpack.BannerPlugin ,最簡單的使用方法如下:

const pgk = require('./package.json');
const banner = `
${pkg.name}
${pkg.description}\n
@version v${pkg.version}
@homepage ${pkg.homepage}
@repository ${pkg.repository.url}\n
(c) 2019 Array-Huang
Released under the MIT License.
hash: [hash]
`;

/* webpack 配置 */
{
    // ...其它配置
    plugins: [
        // ...其它 plugin 配置
        new webpack.BannerPlugin(banner);
    ]
}

最終生成出來的效果是:

/*!
 * 
 * vue-directive-window
 * Vue.js directive that enhance your Modal Window, support drag, resize and maximize.
 * 
 * @version v0.7.5
 * @homepage https://github.com/Array-Huang/vue-directive-window
 * @repository git+https://github.com/Array-Huang/vue-directive-window.git
 * 
 * (c) 2019 Array-Huang
 * Released under the MIT License.
 * hash: dc6c11a1e50821f4444a
 * 
 */

source map

如果庫的用戶是直接通過在瀏覽器里加載你的庫來使用的話,那么提供一份 source map 檔案是非常有必要的;這是因為你的庫在經過 webpack 構建,甚至壓縮后,與源代碼已經大相徑庭了,用戶將難以在瀏覽器中進行除錯;但如果你能為自己的庫附上一份 source map ,瀏覽器開發者工具會呼叫 source map 來幫助決議,用戶的除錯體驗會更接近于除錯庫的原始碼,

相應的 webpack 配置為:

// webpack 配置
{
    // ...其它配置
    devtool: 'cheap-module-source-map'
}

webpack 支持多種型別的 source map ,不同型別的 source map 在生成速度、支持功能(如 babel )、除錯位置偏移等問題上均有不同表現,我這邊只做推薦:

  • 開發環境:cheap-module-eval-source-map
  • 生產環境:cheap-module-source-map

關于其它型別的 source map ,請查看 webpack 官方檔案的 devtool 章節,

排除第三方依賴

與一般應用不一樣,在開發庫的時候,我們應盡量避免引入第三方庫(構建程序中使用的工具鏈除外),因為這些第三方庫會讓我們寫的庫的大小猛增;很可能會出現這樣的情況:我們自己寫的小功能只有幾百行代碼的邏輯,構建出來的庫卻有幾百k,那這樣的庫意義就不大了,

但我們的確也很難避免使用第三方庫,那該咋辦呢?

// webpack 配置
{
    // ...其它配置
    externals: {
        lodash: {
            commonjs: 'lodash',
            commonjs2: 'lodash',
            amd: 'lodash',
            root: '_'
        }
    }
}

使用上述配置后,我們構建出來的庫中就不會包含配置中指定的第三方庫(例子中為lodash)了,下面來一一詳解:

  • commonjscommonjs2項都是指明用戶在 node.js 環境下使用當前庫時,以 CommonJS 的方式來加載名為lodash的 npm 包,
  • amd項表示在瀏覽器中加載運行本庫時,本庫會試圖以 AMD 的方式來加載名為lodash的 AMD 模塊,
  • root項表示在瀏覽器中加載運行本庫時,本庫會試圖取全域變數window._(通過<script>標簽加載lodash.js時, lodash 會把自己注入到全域變數window._中),

與一般應用不一樣的 externals 配置

在一般應用中,你或許會看到這樣的 externals 配置:

// webpack 配置
{
    // ...其它配置
    externals: {
        lodash: '_'
    }
}

這樣的 externals 配置方式意味著:無論在什么環境,都要取_這個全域變數;如果當前是在一般應用且確定已經使用<script>來加載指定的第三方庫(比如 jQueryVue 等核心庫,的確很常以這種方式來加載),當然大可直接這樣用;但我們作為庫的作者,應提供更寬松更靈活的使用方式,

完整的 webpack 配置示例

由于構建不同模塊化規范的庫需要不同的 webpack 配置(其實也只是稍有不同)來進行多次構建,因此本文只針對構建 UMD 格式且已壓縮這一場景來展示最簡單的 webpack 配置示例;如果想知道如何更有效率地拼接 webpack 配置,請看 micro-schema-validator 專案的 webpack 組態檔,

// webpack.config.js
const webpack = require('webpack');
const pkg = require('./package.json'); // 把 package.json 作為資訊源
const banner = `
${pkg.name}
${pkg.description}\n
@version v${pkg.version}
@homepage ${pkg.homepage}
@repository ${pkg.repository.url}\n
(c) 2019 Array-Huang
Released under the MIT License.
hash: [hash]
`;

module.exports = {
  entry: `${__dirname}/index.js`,
  devtool: 'cheap-module-source-map',
  output: {
    path: `${__dirname}/dist`, // 定義輸出的目錄
    filename: 'micro-schema-validator.min.js', // 定義輸出檔案名
    library: 'MicroSchemaValidator', // 定義暴露到瀏覽器環境的全域變數名稱
    libraryTarget: 'umd', // 指定遵循的模塊化規范
  },
  /* 排除第三方依賴 */
  externals: {
    lodash: {
  	  commonjs: 'lodash',
      commonjs2: 'lodash',
      amd: 'lodash',
      root: '_'
    }
  },
  module: {
    rules: [
      {
        test: /(\.jsx|\.js)$/,
        loader: 'babel-loader',
        exclude: /(node_modules|bower_components)/
      },
      {
        test: /(\.jsx|\.js)$/,
        loader: 'eslint-loader',
        exclude: /(node_modules|bower_components)/
      }
    ]
  },
  plugins: [
  	new webpack.BannerPlugin(banner) // 輸出專案資訊
  ]
};

利用 vue-cli 定制并管理 webpack 配置

對于 Vue 生態的庫,如 Vue 組件、Vue 自定義指令等,可以使用 vue-cli (本文特指 vue-cli 3.0 后的版本)根據你的需求來定制 webpack 配置,可定制內容包括:

  • 是否啟用 Babel
  • 是否接入 TypeScript 語法
  • 是否支持 PWA
  • 是否使用 Vue-Router 和 Vuex
  • 是否使用 CSS 前處理器,并可選擇具體的 CSS 前處理器,包括 Sass / Less / Stylus
  • 是否使用 ESLint 和 Prettier
  • 是否接入單元測驗和端對端測驗(E2E)

定制完成后, vue-cli 將生成一個種子專案,該專案可執行(包括本地開發和構建生產環境的包)但沒有實際內容(實際內容不還得由你來寫嘛哈哈),與一般的腳手架工具相比, vue-cli 除了可以生成 webpack 配置外,還將持續對其進行管理和維護,如:

  • 提供一個統一的自定義配置的入口;過往,我們為了達到自定義配置的目的,往往會直接在腳手架工具生成出來的 webpack 配置上直接進行修改,這樣會導致修改點非常分散,難以讓自定義的 webpack 配置在其它專案復用;而使用 vue-cli 后,所有對 webpack 配置的修改點都被集中管理起來了,需要復用的話,直接把這自定義組態檔(vue.config.js)遷移到別的專案即可,
  • 提供持續更新 webpack 配置的機制;假如現在有一個開源庫,我為了達到自己的目的,肆意在庫原始碼上修改,那么當我需要升級該開源庫的時候可就犯難了,因為這會把我之前做的修改都覆寫掉;同理可得,vue-cli 由于統一了自定義配置的入口,并且是在每次運行專案(運行專案也是通過執行 vue-cli 的命令而非 webpack)時動態渲染 webpack 配置的,因此專案的 webpack 配置可以隨著 vue-cli 的升級而不斷升級了,
  • 提供持續更新 webpack 工具鏈的機制;眾所周知, webpack 工具鏈中包含了大量的第三方開源庫,如 Babel 、ESLint 等,這些開源庫也都是在不斷更新當中,在這個程序中,必然會不斷產生 Breaking Change ,所幸 vue-cli 通過自身升級——不斷修改 webpack 配置來達到適配最新版第三方開源庫的目的,而我們的專案也可以以極小的代價(升級 vue-cli 本身)來獲取 webpack 工具鏈的不斷更新,

vue-cli 自定義配置示例

摘自 vue-directive-window 專案的 vue.config.js 檔案:

const webpack = require('webpack');
const pkg = require('./package.json');

const banner = `
${pkg.name}
${pkg.description}\n
@version v${pkg.version}
@homepage ${pkg.homepage}
@repository ${pkg.repository.url}\n
(c) 2019 Array-Huang
Released under the MIT License.
hash: [hash]
`;

module.exports = {
  chainWebpack: config => {
    config.output.libraryExport('default');
    config.plugin('banner').use(webpack.BannerPlugin, [
      {
        banner,
        entryOnly: true,
      },
    ]);
  },
};

看起來是不是比上文中最基礎的 webpack 配置還要簡潔呢?當專案的架構逐漸豐富起來后,這個差距將不斷拉大,

實體專案代碼介紹

在我的作業生涯中,我寫的絕大部分庫都是為公司的專案寫的,很可惜無法帶出來,但我會以我最近寫的兩個開源庫:javascript-library-boilerplate 和 vue-directive-window 來作為實體專案代碼來輔助介紹,

javascript-library-boilerplate

javascript-library-boilerplate 是一個現代前端生態下快速構建 javascript 庫的腳手架(或稱種子專案,或稱示例代碼,看你理解了),本庫支持 GitHub 的 repository templates 功能,你可以直接在專案首頁點擊 Use this template 來直接套用本腳手架的代碼來創建你自己的 javascript 庫,

vue-directive-window

vue-directive-window 是一個可以快速讓模態框(modal)支持類視窗操作的增強庫;類視窗操作主要包括三大類:拖拽移動、拖拽調整視窗尺寸、視窗最大化; vue-directive-window 支持以 Vue 自定義指令或是一般 js 類的方式來呼叫,

vue-directive-window 相對于 javascript-library-boilerplate 來說,更貼近 Vue 生態圈,如果你最近想為 Vue 生態圈添磚加瓦,不妨參考一下本專案,

實體專案代碼介紹

我會以我最近寫的兩個開源庫:javascript-library-boilerplate 和 vue-directive-window 來作為實體專案代碼來輔助介紹,

javascript-library-boilerplate

javascript-library-boilerplate 是一個現代前端生態下快速構建 javascript 庫的腳手架(或稱種子專案,或稱示例代碼,看你理解了),本庫支持 GitHub 的 repository templates 功能,你可以直接在專案首頁點擊 Use this template 來直接套用本腳手架的代碼來創建你自己的 javascript 庫,

vue-directive-window

vue-directive-window 是一個可以快速讓模態框(modal)支持類視窗操作的增強庫;類視窗操作主要包括三大類:拖拽移動、拖拽調整視窗尺寸、視窗最大化; vue-directive-window 支持以 Vue 自定義指令或是一般 js 類的方式來呼叫,

vue-directive-window 相對于 javascript-library-boilerplate 來說,更貼近 Vue 生態圈,如果你最近想為 Vue 生態圈添磚加瓦,不妨參考一下本專案,

系列文章目錄(同步更新)

  • 《現代前端庫開發指南系列(一):融入現代前端生態》
  • 《現代前端庫開發指南系列(二):使用 webpack 構建一個庫》
  • 《現代前端庫開發指南系列(三):從說明檔案看庫的前世今生》

想要閱讀更多我的技術文章?請到我的 GitHub 博客 Array-Huang/blog 來,如果對您有幫助的話請 Star&Watch 走一波哈(〃ω)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/162718.html

標籤:JavaScript

上一篇:jTopo HTML5 Canvas 畫圖組件

下一篇:復選框全選/全部選

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more