主頁 > 企業開發 > 使用three.js實作炫酷的酸性風格3D頁面

使用three.js實作炫酷的酸性風格3D頁面

2021-09-29 06:56:32 企業開發

背景

近期學習了 WebGLThree.js 的一些基礎知識,于是想結合最近流行的酸性設計風格,裝飾一下個人主頁,同時總結一些學到的知識,本文內容主要介紹,通過使用 React + three.js 技術堆疊,加載 3D模型、添加 3D文字、增加影片、點擊互動等,配合樣式設計,實作充滿設計感的 ?? 酸性風格頁面,

基礎知識

Three.js

Three.js 是一款基于原生 WebGL封裝運行在瀏覽器中的 3D引擎,可以用它創建各種三維場景,包括了攝影機、光影、材質等各種物件,是一款使用非常廣泛的三維引擎,可以在 three.js官方中文檔案 進一步深入學習,

酸性設計

酸性設計 一詞翻譯自 Acid Graphics,起源于 上世紀90年代 的酸浩室音樂、電子舞曲以及嬉皮士文化,在設計領域,這種酸性美學承載一種 自由的主張,怪誕的圖形,大膽鮮明的配色,特殊的材料質感,搭配多種字體,組成了獨特的酸性設計風格,

總之,鮮艷高飽和度 的色彩組合;黑灰色打底高飽和 熒光色 點綴畫面的 五彩斑斕的黑;充滿未來感、炫酷、充滿科技感的液態金屬玻璃鋁箔塑料等材質;隨機 的元素、圖形的布局;不斷 重復、裁切、組合 幾何圖形 等都是酸性設計風格,酸性風格在音樂專輯封面、視覺海報、書籍電影封面、網頁設計中也逐漸開始流行,

實作效果

在線預覽:https://tricell.fun

實作

3D模型

場景初始化

?? 創建場景
scene = new THREE.Scene();
?? 初始化相機

透視相機 PerspectiveCamera4個 引數分別是指:視場、長寬比、近面、遠面,

camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.1, 1000);
// 設定相機位置
camera.position.set(600, 20, -200);
// 相機聚焦到螢屏中央
camera.lookAt(new THREE.Vector3(0, 0, 0));
?? 初始化光源

添加 半球光源 HemisphereLight:創建室外效果更加自然的光源

light = new THREE.HemisphereLight(0xffffff, 0x444444);
light.position.set(0, 20, 0);
scene.add(light);
light = new THREE.DirectionalLight(0xffffff);
light.position.set(0, 20, 10);
light.castShadow = true;
scene.add(light);

添加 環境光 AmbientLight

var ambiColor = '#0C0C0C';
var ambientLight = new THREE.AmbientLight(ambiColor);
scene.add(ambientLight);

添加輔助工具(可選)

?? 添加輔助網格

GridHelper 可用于添加網格輔助線,也可用于裝飾,通過 GridHelper(size, divisions, colorCenterLine, colorGrid) 實作,

  • size:網格寬度,默認值為 10
  • divisions:等分數,默認值為 10
  • colorCenterLine:中心線顏色,默認值為 0x444444
  • colorGrid: 網格線顏色,默認值為 0x888888
var grid = new THREE.GridHelper(1000, 100, 0x000000, 0x000000);
grid.material.opacity = 0.1;
grid.material.transparent = true;
grid.position.set(0, -240, 0);
scene.add(grid);
?? 添加相機控制元件

通過相機控制元件 OrbitControls 可以對三維場景進行縮放、平移、旋轉操作,本質上改變的并不是場景,而是相機的引數,開發時 OrbitControls.js 需要單獨引入,

controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.target.set(0, 0, 0);
controls.update();
?? 添加性能查看插件

stats 是一個 Three.js 開發的輔助庫,主要用于檢測影片運行時的幀數,stats.js 也需要單獨引入,

stats = new Stats();
container.appendChild(stats.dom);

加載模型

本文示例用到的 扔鐵餅的人 雕像 3D 模型來源于 threedscans.com,可 免費?? 下載使用,本文末尾提供了多個免費模型下載網站,有 200多頁 免費模型,大家感興趣的話可以挑選自己夏歡的自己下載使用,當然,有建模能力的同學,也可以使用 blender3dmax 等專業建模軟體生成自己喜歡的模型,

加載 objfbx 模型

需要單獨引入 FBXLoader.jsOBJLoader.js.fbx.obj 格式的模型加載方法是一樣的,

// var loader = new THREE.FBXLoader();
var loader = new THREE.OBJLoader();
loader.load(model, function (object) {
  object.traverse(function (child) {
    if (child.isMesh) {
      child.castShadow = true;
      child.receiveShadow = true;
    }
  });
  object.rotation.y = Math.PI / 2;
  object.position.set(0, -200, 0);
  object.scale.set(0.32, 0.32, 0.32);
  model = object;
  scene.add(object);
});
加載 gltf 模型

需要單獨引入 GLTFLoader.js,加載 .gltf 格式模型方法稍有不同,需要注意的是模型的遍歷物件和最終添加到場景中的是 object.scene 而不是 object

var loader = new THREE.GLTFLoader();
loader.load(model, function (object) {
  object.scene.traverse(function (child) {
    if (child.isMesh) {
      child.castShadow = true;
      child.receiveShadow = true;
    }
  });
  object.scene.rotation.y = Math.PI / 2;
  object.scene.position.set(0, -240, 0);
  object.scene.scale.set(0.33, 0.33, 0.33);
  model = object.scene;
  scene.add(object.scene);
});

添加網格、加載完成模型之后的效果如下圖所示,

添加轉盤影片

通過 requestAnimationFrame 重繪頁面的方法添加轉盤影片效果,window.requestAnimationFrame() 告訴瀏覽器希望執行一個影片,并且要求瀏覽器在下次重繪之前呼叫指定的回呼函式更新影片,該方法需要傳入一個回呼函式作為引數,該回呼函式會在瀏覽器下一次重繪之前執行,

function animate () {
  requestAnimationFrame(animate);
  // 隨著頁面重回不斷改變場景的rotation.y來實作旋轉
  scene.rotation.y -= 0.015;
  renderer.render(scene, camera);
}

添加點擊互動

Three.js 場景中我們要點擊某個模型獲取它的資訊、或者做一些其他操作,要用到 Raycaster(光線投射),原理就是在你滑鼠點擊的位置發射一束射線,被射線中的物體都被記錄下來,基本語法是 Raycaster(origin, direction, near, far),其中:

  • origin:射線的起點向量,
  • direction:射線的方向向量,
  • near:所有回傳的結果應該比 near 遠,值不能為負,默認值為 0
  • far:所有回傳的結果應該比 far 近,不能小于 near,默認值為 無窮大

代碼實作的基本步驟是:獲取滑鼠在螢屏的坐標 螢屏坐標轉標準設備坐標 標準設備坐標轉世界坐標 拿到滑鼠在場景的世界坐標 根據世界坐標和相機生成射線投射方向單位向量 根據射線投射方向單位向量創建射線投射器物件,

//宣告raycaster和mouse變數
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
onMouseClick = event => {
  // 將滑鼠點擊位置的螢屏坐標轉成threejs中的標準坐標,以螢屏中心為原點,值的范圍為-1到1.
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
  // 通過滑鼠點的位置和當前相機的矩陣計算出raycaster
  raycaster.setFromCamera(mouse, camera);
  // 獲取raycaster直線和所有模型相交的陣列集合
  let intersects = raycaster.intersectObjects(scene.children);
  if (intersects.length > 0) {
    alert('HELLO WORLD')
    // 可以通過遍歷實作點擊不同mesh觸發不同互動,如:
    let selectedObj = intersects[0].object;
    if (selectedObj.name === 'car') {
      alert('汽車??')
    }
  }
}
window.addEventListener('click', onm ouseClick, false);

添加3D文字

使用 TextGeometry(text : String, parameters : Object) 添加 3D文字,以下是可設定屬性的說明:

  • size:字號大小,一般為大寫字母的高度,
  • height:文字的厚度,
  • weight:值為 normalbold,表示是否加粗,
  • font:字體,默認是 helvetiker,需對應參考的字體檔案,
  • style:值為 normalitalics,表示是否斜體
  • bevelThickness:倒角厚度,
  • bevelSize:倒角寬度,
  • curveSegments:弧線分段數,使得文字的曲線更加光滑,
  • bevelEnabled:布林值,是否使用倒角,意為在邊緣處斜切,
var loader = new THREE.FontLoader();
loader.load('gentilis_regular.typeface.json', function (font) {
  var textGeo = new THREE.TextGeometry('HELLO WORLD', {
    font: font,
    size: .8,
    height: .8,
    curveSegments: .05,
    bevelThickness: .05,
    bevelSize: .05,
    bevelEnabled: true
  });
  var textMaterial = new THREE.MeshPhongMaterial({ color: 0x03c03c });
  var mesh = new THREE.Mesh(textGeo, textMaterial);
  mesh.position.set(0, 3.8, 0);
  scene.add(mesh);
});

優化

現在模型加載已經基本完成了,但是 3D 模型的體積一般比較大,部署之后我發現網頁加載非常慢,影響用戶體驗,減小模型體積是十分必要的,在網上找了很久壓縮工具,發現在不需要安裝大型 3D建模軟體 的情況下,使用 obj2gltf 可以將體積較大的 OBJ 格式模型轉化為 gltf 模型,有效優化模型體積,提升網頁加載速度,

安裝
npm install obj2gltf --save
將obj模型復制到以下目錄中
node_modules\obj2gltf\bin
執行轉碼指令
node obj2gltf.js -i demo.obj -o demo.gltf

如圖出現類似上述內容,轉碼完成,對比轉化前后的檔案體積,本例中 kas.obj 初始檔案大小為 9.7M 轉化后的檔案 kas.gltf 只有 4.6M,體積縮小一半,此時將轉化后的模型加載到頁面上,肉眼幾乎看不出模型效果的變化,同時頁面加載速度得到明顯提升,

obj2gltf 也可以作為庫使用,通過 node服務 實時轉化模型,感興趣的同學可以通過文章末尾鏈接深入學習,
也可以是使用 3D 建模軟體如 blender 等手動通過減少模型 面數縮小體積 等途徑對模型壓縮優化,這種優化效果更明顯,

完整代碼

var model = require('@/assets/models/kas.gltf');
var container, stats, controls;
var camera, scene, renderer, light, model;
class Kas extends React.Component {
  render () {
    return (
      <div id="kas"></div>
    )
  }
  componentDidMount () {
    this.initThree();
  }
  initThree () {
    init();
    animate();
    function init () {
      container = document.getElementById('kas');
      scene = new THREE.Scene();
      scene.fog = new THREE.Fog(0xa0a0a0, 200, 1000);
      // 透視相機:視場、長寬比、近面、遠面
      camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.1, 1000);
      camera.position.set(600, 20, -200);
      camera.lookAt(new THREE.Vector3(0, 0, 0));
      // 半球光源:創建室外效果更加自然的光源
      light = new THREE.HemisphereLight(0xffffff, 0x444444);
      light.position.set(0, 20, 0);
      scene.add(light);
      light = new THREE.DirectionalLight(0xffffff);
      light.position.set(0, 20, 10);
      light.castShadow = true;
      scene.add(light);
      // 環境光
      var ambiColor = '#0C0C0C';
      var ambientLight = new THREE.AmbientLight(ambiColor);
      scene.add(ambientLight);
      // 網格
      var grid = new THREE.GridHelper(1000, 100, 0x000000, 0x000000);
      grid.material.opacity = 0.1;
      grid.material.transparent = true;
      grid.position.set(0, -240, 0);
      scene.add(grid);
      // 加載gltf模型
      var loader = new THREE.GLTFLoader();
      loader.load(model, function (object) {
        object.scene.traverse(function (child) {
          if (child.isMesh) {
            child.castShadow = true;
            child.receiveShadow = true;
          }
        });
        object.scene.rotation.y = Math.PI / 2;
        object.scene.position.set(0, -240, 0);
        object.scene.scale.set(0.33, 0.33, 0.33);
        model = object.scene;
        scene.add(object.scene);
      });
      renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
      renderer.setPixelRatio(window.devicePixelRatio);
      renderer.setSize(window.innerWidth, window.innerHeight);
      renderer.setClearAlpha(0);
      renderer.shadowMap.enabled = true;
      container.appendChild(renderer.domElement);
      window.addEventListener('resize', () => {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
      }, false);
      stats = new Stats();
      container.appendChild(stats.dom);
    }
    function animate () {
      var clock = new THREE.Clock()
      requestAnimationFrame(animate);
      var delta = clock.getDelta();
      scene.rotation.y -= 0.015;
      renderer.render(scene, camera);
      stats.update();
    }
    // 增加點擊事件
    //宣告raycaster和mouse變數
    var raycaster = new THREE.Raycaster();
    var mouse = new THREE.Vector2();
    function onm ouseClick(event) {
      // 通過滑鼠點擊位置計算出raycaster所需要點的位置,以螢屏中心為原點,值的范圍為-1到1.
      mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
      mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
      // 通過滑鼠點的位置和當前相機的矩陣計算出raycaster
      raycaster.setFromCamera(mouse, camera);
      // 獲取raycaster直線和所有模型相交的陣列集合
      var intersects = raycaster.intersectObjects(scene.children);
      if (intersects.length > 0) {
        alert('HELLO WORLD')
      }
    }
    window.addEventListener('click', onm ouseClick, false);
  }
}

其他設計元素

本文主要介紹 3D元素 的加載,由于文章篇幅以及時間有限(博主太懶??)其他元素的實作不做詳細講解(可能后續有時間會總結整理 maybe)感興趣的同學可以擴展閱讀以下其他大神優秀的文章,

流體背景

靜態 液態背景圖可以通過 SVG filter 實作,實作 動態 流體背景,可以閱讀《Creating Patterns With SVG Filters》,可以使用Three.js 結合原生GLSL實作,可參考《CodePen Shader Template》示例來實作,

金屬、霓虹、故障效果等酸性效果字體可以閱讀我的另一篇文章《僅用CSS幾步實作賽博朋克2077風格視覺效果》,也可以使用設計生成,由于時間關系,本文專案中的金屬效果文字以及本文banner頭圖中的文字都是使用在線藝術字體生成網站生成的,感興趣的同學可以自行嘗試設計,

未來進一步優化

  • #todo 酸性風格液態背景實作,
  • #todo 3D模型液化金屬化效果,

three.js 優秀案例推薦

最后給大家推薦幾個非常驚艷的 three.js 專案來一起體驗和學習,無論是頁面互動、視覺設計還是性能優化都做到了極致,可以從中學到很多,

  • github首頁:3D地球 實時顯示全球熱門倉庫,
  • kodeclubs:低面數 3D城市 第三人稱小游戲,
  • 球鞋展示:720度 球鞋動態展示,
  • 沙雕dance:沙雕動物舞者,
  • Zenly軟體:Zenly App中文主頁,

參考資料

  • three.js: https://threejs.org
  • obj2gltf: https://github.com/CesiumGS/obj2gltf
  • 200多頁免費3d模型 https://www.turbosquid.com
  • 免費3D雕像: https://threedscans.com
  • 免費3D模型:https://free3d.com
  • 藝術字體在線生成:https://cooltext.com
  • 什么是酸性設計:https://www.shejipi.com/361258.html

作者:dragonir 本文地址:https://www.cnblogs.com/dragonir/p/15350537.html

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

標籤:Html/Css

上一篇:前端規范之CSS規范(Stylelint)

下一篇:Spirit帶你徹底搞懂JS的6種繼承方案

標籤雲
其他(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