国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
組織視圖代碼
組織游戲邏輯
資源管理
使用ReactJS和WebGL構(gòu)建游戲的先決條件是什么?
如何將Unity與ReactJS集成?
使用React創(chuàng)建3D應(yīng)用程序的不同方法有哪些?
如何使用WebGL創(chuàng)建交互式3D圖形?
react-unity-webgl在游戲開發(fā)中的作用是什么?
如何優(yōu)化我的ReactJS和WebGL游戲以提高性能?
我可以使用ReactJS和WebGL構(gòu)建手機(jī)游戲嗎?
如何在我的ReactJS和WebGL游戲中處理用戶輸入?
我可以將其他JavaScript庫與ReactJS和WebGL一起使用嗎?
如何調(diào)試我的ReactJS和WebGL游戲?
首頁 web前端 js教程 用三分,react和webGL構(gòu)建游戲

用三分,react和webGL構(gòu)建游戲

Feb 16, 2025 am 11:33 AM

Building a Game with Three.js, React and WebGL

核心要點(diǎn)

  • 使用React驅(qū)動(dòng)游戲開發(fā)中的3D場(chǎng)景,具有諸多優(yōu)勢(shì),包括清晰地將場(chǎng)景渲染與游戲邏輯分離,易于理解的組件,游戲資源的實(shí)時(shí)重載,以及能夠使用原生瀏覽器工具將3D場(chǎng)景作為標(biāo)記進(jìn)行檢查和調(diào)試。
  • react-three-renderer (R3R) 提供了一個(gè)聲明式API,它封裝了Three.js,允許將視圖代碼與游戲邏輯解耦,并創(chuàng)建小型易于理解的組件。
  • 隨著游戲引擎的增長,使用reducer模式將游戲邏輯組織成單獨(dú)的函數(shù)至關(guān)重要。這種模式允許創(chuàng)建簡(jiǎn)潔明了的游戲循環(huán),并輕松地向游戲循環(huán)添加更多邏輯。
  • 使用Three.js、React和WebGL構(gòu)建游戲的過程中,調(diào)試和性能方面的考慮是獨(dú)一無二的。使用Chrome DevTools的時(shí)間軸功能對(duì)于調(diào)試性能來說非常寶貴,而實(shí)現(xiàn)諸如最小化React中重新渲染次數(shù)之類的策略可以幫助優(yōu)化性能。

我正在制作一款名為“變色龍魅力”的游戲。它使用Three.js、React和WebGL構(gòu)建。本文介紹了這些技術(shù)如何使用react-three-renderer(縮寫為R3R)協(xié)同工作。

請(qǐng)查看SitePoint上的《WebGL入門指南》和《React和JSX入門指南》,了解React和WebGL的介紹。本文和隨附的代碼使用ES6語法。

Building a Game with Three.js, React and WebGL

一切的開始

一段時(shí)間前,Pete Hunt在#reactjs IRC頻道中開了一個(gè)玩笑,說要用React來制作游戲:

我敢打賭我們可以用React制作一款第一人稱射擊游戲!敵人有

等等。我笑了。他也笑了。大家都玩得很開心?!笆澜缟险l會(huì)這么做?”我想。

幾年后,我做的正是這件事。

Building a Game with Three.js, React and WebGL

《變色龍魅力》是一款收集增強(qiáng)道具的游戲,這些道具會(huì)讓你縮小以解決無限分形迷宮。我已經(jīng)做了幾年的React開發(fā)者,我很想知道是否有辦法使用React驅(qū)動(dòng)Three.js。這時(shí),R3R吸引了我的注意。

為什么選擇React?

我知道你在想什么:為什么?請(qǐng)容我解釋一下。以下是一些考慮使用React驅(qū)動(dòng)3D場(chǎng)景的原因:

  • “聲明式”視圖允許你清晰地將場(chǎng)景渲染與游戲邏輯分離。
  • 設(shè)計(jì)易于理解的組件,例如<player></player>、<wall></wall>、<level></level>等等。
  • 游戲資源的“熱”(實(shí)時(shí))重載。更改紋理和模型,并實(shí)時(shí)查看它們?cè)趫?chǎng)景中的更新!
  • 使用原生瀏覽器工具(如Chrome檢查器)將3D場(chǎng)景作為標(biāo)記進(jìn)行檢查和調(diào)試。
  • 使用Webpack在依賴關(guān)系圖中管理游戲資源,例如<texture require="" src="%7B"></texture>

讓我們?cè)O(shè)置一個(gè)場(chǎng)景來了解這一切是如何工作的。

React和WebGL

我創(chuàng)建了一個(gè)示例GitHub存儲(chǔ)庫來配合本文??寺〈鎯?chǔ)庫并按照README中的說明運(yùn)行代碼并繼續(xù)學(xué)習(xí)。它以SitePointy 3D機(jī)器人為主角!

Building a Game with Three.js, React and WebGL

警告:R3R仍在測(cè)試階段。其API不穩(wěn)定,將來可能會(huì)發(fā)生變化。目前它只處理Three.js的一個(gè)子集。我發(fā)現(xiàn)它足夠完整,可以構(gòu)建一個(gè)完整的游戲,但你的結(jié)果可能會(huì)有所不同。

組織視圖代碼

使用React驅(qū)動(dòng)WebGL的主要好處是我們的視圖代碼與游戲邏輯解耦。這意味著我們渲染的實(shí)體是小而易于理解的組件。

R3R公開了一個(gè)封裝Three.js的聲明式API。例如,我們可以編寫:

<code><scene>></scene>
  <perspectivecamera>    position={ new THREE.Vector3( 1, 1, 1 )
  />
>
</perspectivecamera></code>

現(xiàn)在我們有一個(gè)帶有攝像機(jī)的空3D場(chǎng)景。向場(chǎng)景添加網(wǎng)格就像包含<mesh></mesh>組件并賦予它<geometry></geometry><material></material>一樣簡(jiǎn)單。

<code><scene>></scene>
  …
  <mesh>></mesh>
    <boxgeometry></boxgeometry>      width={ 1 }
      height={ 1 }
      depth={ 1 }
    />
    <meshbasicmaterial></meshbasicmaterial>      color={ 0x00ff00 }
    />
>
</code>

在幕后,這將創(chuàng)建一個(gè)THREE.Scene并自動(dòng)添加一個(gè)帶有THREE.BoxGeometry的網(wǎng)格。R3R處理舊場(chǎng)景與任何更改的差異。如果你向場(chǎng)景添加一個(gè)新的網(wǎng)格,則不會(huì)重新創(chuàng)建原始網(wǎng)格。就像使用普通的React和DOM一樣,3D場(chǎng)景只更新差異。

因?yàn)槲覀冊(cè)赗eact中工作,所以我們可以將游戲?qū)嶓w分離到組件文件中。示例存儲(chǔ)庫中的Robot.js文件演示了如何使用純React視圖代碼表示主要角色。它是一個(gè)“無狀態(tài)函數(shù)”組件,這意味著它不保存任何本地狀態(tài):

<code>const Robot = ({ position, rotation }) => <group></group>  position={ position }
  rotation={ rotation }
>
  <mesh> rotation={ localRotation }></mesh>
    <geometryresource></geometryresource>      resourceId="robotGeometry"
    />
    <materialresource></materialresource>      resourceId="robotTexture"
    />
  >
>;
</code>

現(xiàn)在我們將<robot></robot>包含在我們的3D場(chǎng)景中!

<code><scene>></scene>
  …
  <mesh>></mesh>…>
  <robot></robot>    position={…}
    rotation={…}
  />
>
</code>

你可以在R3R GitHub存儲(chǔ)庫上查看更多API示例,或者在隨附的項(xiàng)目中查看完整的示例設(shè)置。

組織游戲邏輯

等式的另一半是處理游戲邏輯。讓我們給我們的機(jī)器人SitePointy添加一些簡(jiǎn)單的動(dòng)畫。

Building a Game with Three.js, React and WebGL

傳統(tǒng)的游戲循環(huán)是如何工作的?它們接受用戶輸入,分析舊的“世界狀態(tài)”,并返回新的世界狀態(tài)以進(jìn)行渲染。為方便起見,讓我們將“游戲狀態(tài)”對(duì)象存儲(chǔ)在組件狀態(tài)中。在一個(gè)更成熟的項(xiàng)目中,你可以將游戲狀態(tài)移動(dòng)到Redux或Flux存儲(chǔ)中。

我們將使用瀏覽器的requestAnimationFrame API回調(diào)來驅(qū)動(dòng)我們的游戲循環(huán),并在GameContainer.js中運(yùn)行循環(huán)。為了動(dòng)畫化機(jī)器人,讓我們根據(jù)傳遞給requestAnimationFrame的時(shí)間戳計(jì)算一個(gè)新的位置,然后將新的位置存儲(chǔ)在狀態(tài)中。

<code><scene>></scene>
  <perspectivecamera>    position={ new THREE.Vector3( 1, 1, 1 )
  />
>
</perspectivecamera></code>

調(diào)用setState()將觸發(fā)子組件的重新渲染,并更新3D場(chǎng)景。我們將狀態(tài)從容器組件傳遞到演示性<game></game>組件:

<code><scene>></scene>
  …
  <mesh>></mesh>
    <boxgeometry></boxgeometry>      width={ 1 }
      height={ 1 }
      depth={ 1 }
    />
    <meshbasicmaterial></meshbasicmaterial>      color={ 0x00ff00 }
    />
>
</code>

我們可以應(yīng)用一個(gè)有用的模式來幫助組織這段代碼。更新機(jī)器人位置是一個(gè)簡(jiǎn)單的基于時(shí)間的計(jì)算。將來,它還可能考慮來自先前游戲狀態(tài)的先前機(jī)器人位置。一個(gè)接受一些數(shù)據(jù)、處理它并返回新數(shù)據(jù)的函數(shù)通常被稱為reducer。我們可以將移動(dòng)代碼抽象成一個(gè)reducer函數(shù)!

現(xiàn)在我們可以編寫一個(gè)簡(jiǎn)潔明了的游戲循環(huán),其中只包含函數(shù)調(diào)用:

<code>const Robot = ({ position, rotation }) => <group></group>  position={ position }
  rotation={ rotation }
>
  <mesh> rotation={ localRotation }></mesh>
    <geometryresource></geometryresource>      resourceId="robotGeometry"
    />
    <materialresource></materialresource>      resourceId="robotTexture"
    />
  >
>;
</code>

要向游戲循環(huán)添加更多邏輯,例如處理物理,請(qǐng)創(chuàng)建另一個(gè)reducer函數(shù)并將其傳遞給先前reducer的結(jié)果:

<code><scene>></scene>
  …
  <mesh>></mesh>…>
  <robot></robot>    position={…}
    rotation={…}
  />
>
</code>

隨著游戲引擎的增長,將游戲邏輯組織成單獨(dú)的函數(shù)變得至關(guān)重要。使用reducer模式,這種組織非常簡(jiǎn)單。

資源管理

這仍然是R3R的一個(gè)發(fā)展領(lǐng)域。對(duì)于紋理,你可以在JSX標(biāo)簽上指定一個(gè)url屬性。使用Webpack,你可以要求本地圖像路徑:

<code>// …
gameLoop( time ) {
  this.setState({
    robotPosition: new THREE.Vector3(
      Math.sin( time * 0.01 ), 0, 0
    )
  });
}
</code>

有了這個(gè)設(shè)置,如果你更改磁盤上的圖像,你的3D場(chǎng)景將實(shí)時(shí)更新!這對(duì)于快速迭代游戲設(shè)計(jì)和內(nèi)容非常寶貴。

對(duì)于其他資源(如3D模型),你仍然必須使用Three.js的內(nèi)置加載器(如JSONLoader)來處理它們。我嘗試過使用自定義Webpack加載器來加載3D模型文件,但最終工作量太大,沒有好處。將模型視為二進(jìn)制數(shù)據(jù)并使用文件加載器加載它們更容易。這仍然可以實(shí)現(xiàn)模型數(shù)據(jù)的實(shí)時(shí)重載。你可以在示例代碼中看到這一點(diǎn)。

調(diào)試

R3R支持Chrome和Firefox的React開發(fā)者工具擴(kuò)展。你可以像檢查普通DOM一樣檢查你的場(chǎng)景!將鼠標(biāo)懸停在檢查器中的元素上會(huì)在場(chǎng)景中顯示它們的邊界框。你還可以將鼠標(biāo)懸停在紋理定義上以查看場(chǎng)景中哪些對(duì)象使用這些紋理。

Building a Game with Three.js, React and WebGL

你還可以加入react-three-renderer Gitter聊天室,以獲得有關(guān)調(diào)試應(yīng)用程序的幫助。

性能注意事項(xiàng)

在構(gòu)建《變色龍魅力》時(shí),我遇到了一些此工作流程特有的性能問題。

  • 我使用Webpack的熱重載時(shí)間長達(dá)30秒!這是因?yàn)槊看沃剌d都必須將大型資源寫入包中。解決方案是實(shí)現(xiàn)Webpack的DLLPlugin,這將重載時(shí)間縮短到5秒以下。
  • 理想情況下,你的場(chǎng)景每幀渲染應(yīng)該只調(diào)用一次setState()。在分析我的游戲后,React本身是主要的瓶頸。每幀調(diào)用setState()多次會(huì)導(dǎo)致雙重渲染并降低性能。
  • 超過一定數(shù)量的對(duì)象后,R3R的性能將比普通的Three.js代碼差。對(duì)我來說,大約是1000個(gè)對(duì)象。你可以在示例中的“基準(zhǔn)測(cè)試”中比較R3R和Three.js。

Chrome DevTools的時(shí)間軸功能是調(diào)試性能的絕佳工具。你可以輕松地直觀地檢查游戲循環(huán),而且它比DevTools的“配置文件”功能更易于閱讀。

就是這樣!

查看《變色龍魅力》以了解使用此設(shè)置可以實(shí)現(xiàn)的功能。雖然此工具鏈還很年輕,但我發(fā)現(xiàn)使用R3R的React對(duì)于清晰地組織我的WebGL游戲代碼至關(guān)重要。你還可以查看小型但不斷增長的R3R示例頁面,以查看一些組織良好的代碼示例。

本文由Mark Brown和Kev Zettler進(jìn)行同行評(píng)審。感謝所有SitePoint的同行評(píng)審人員,使SitePoint的內(nèi)容達(dá)到最佳狀態(tài)!

使用ReactJS和WebGL構(gòu)建游戲的常見問題解答(FAQ)

使用ReactJS和WebGL構(gòu)建游戲的先決條件是什么?

要開始使用ReactJS和WebGL構(gòu)建游戲,你需要對(duì)JavaScript、HTML和CSS有基本的了解。還需要了解ReactJS(一個(gè)流行的用于構(gòu)建用戶界面的JavaScript庫)。此外,了解WebGL(Web圖形庫)(一個(gè)用于渲染交互式3D和2D圖形的JavaScript API)至關(guān)重要。熟悉ES6語法、npm(Node包管理器)和命令行也將大有裨益。

如何將Unity與ReactJS集成?

可以使用react-unity-webgl包將Unity與ReactJS集成。此包允許你將Unity WebGL構(gòu)建嵌入到ReactJS應(yīng)用程序中。你可以使用npm安裝它并將其導(dǎo)入到你的項(xiàng)目中。然后,你可以使用包提供的Unity組件將你的Unity游戲嵌入到你的ReactJS應(yīng)用程序中。

使用React創(chuàng)建3D應(yīng)用程序的不同方法有哪些?

有幾種方法可以使用React創(chuàng)建3D應(yīng)用程序。最流行的方法之一是使用Three.js,這是一個(gè)用于創(chuàng)建和顯示動(dòng)畫3D計(jì)算機(jī)圖形的跨瀏覽器JavaScript庫。另一種方法是直接使用WebGL,但這可能更復(fù)雜。其他庫(如react-three-fiber和react-unity-webgl)也可以用于使用React創(chuàng)建3D應(yīng)用程序。

如何使用WebGL創(chuàng)建交互式3D圖形?

WebGL允許你直接在瀏覽器中創(chuàng)建交互式3D圖形,無需插件。你可以使用WebGL的API創(chuàng)建復(fù)雜的3D圖形、動(dòng)畫和游戲。但是,WebGL的API是低級(jí)的,直接使用可能很復(fù)雜。因此,許多開發(fā)人員更喜歡使用像Three.js這樣的庫,這些庫為WebGL提供了更高級(jí)別的接口。

react-unity-webgl在游戲開發(fā)中的作用是什么?

react-unity-webgl包允許你將Unity WebGL構(gòu)建嵌入到ReactJS應(yīng)用程序中。這意味著你可以使用Unity創(chuàng)建復(fù)雜的3D游戲,然后輕松地將它們集成到你的ReactJS應(yīng)用程序中。如果你想創(chuàng)建一個(gè)基于Web的游戲或交互式3D應(yīng)用程序,這將特別有用。

如何優(yōu)化我的ReactJS和WebGL游戲以提高性能?

優(yōu)化使用ReactJS和WebGL構(gòu)建的游戲可能涉及多種策略。這些策略包括最小化React中的重新渲染次數(shù),使用WebGL的內(nèi)置性能功能(如requestAnimationFrame)實(shí)現(xiàn)流暢的動(dòng)畫,以及為Web優(yōu)化3D模型和紋理。

我可以使用ReactJS和WebGL構(gòu)建手機(jī)游戲嗎?

是的,你可以使用ReactJS和WebGL構(gòu)建在移動(dòng)設(shè)備上的Web瀏覽器中運(yùn)行的游戲。但是,對(duì)于原生移動(dòng)游戲,你可能需要考慮使用Unity或Unreal Engine等游戲開發(fā)平臺(tái),這些平臺(tái)可以直接導(dǎo)出到iOS和Android。

如何在我的ReactJS和WebGL游戲中處理用戶輸入?

可以使用標(biāo)準(zhǔn)JavaScript事件處理程序在ReactJS和WebGL游戲中處理用戶輸入。你可以監(jiān)聽鍵盤、鼠標(biāo)和觸摸事件,然后相應(yīng)地更新游戲狀態(tài)。ReactJS還提供合成事件,可以用來以一致的方式跨不同瀏覽器處理用戶輸入。

我可以將其他JavaScript庫與ReactJS和WebGL一起使用嗎?

是的,你可以將其他JavaScript庫與ReactJS和WebGL一起使用。例如,你可能會(huì)使用Three.js進(jìn)行3D圖形處理,使用Howler.js進(jìn)行音頻處理,或使用Matter.js進(jìn)行物理處理。關(guān)鍵是確保這些庫可以在你的游戲中無縫協(xié)同工作。

如何調(diào)試我的ReactJS和WebGL游戲?

可以使用Web瀏覽器中的開發(fā)者工具調(diào)試使用ReactJS和WebGL構(gòu)建的游戲。這些工具允許你檢查HTML、CSS和JavaScript代碼,查看控制臺(tái)日志,并逐步調(diào)試代碼。此外,React開發(fā)者工具是一個(gè)瀏覽器擴(kuò)展,允許你檢查React組件層次結(jié)構(gòu)、道具和狀態(tài)。

以上是用三分,react和webGL構(gòu)建游戲的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用于不同的應(yīng)用場(chǎng)景。Java用于大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

JavaScript評(píng)論:簡(jiǎn)短說明 JavaScript評(píng)論:簡(jiǎn)短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

為什么要將標(biāo)簽放在的底部? 為什么要將標(biāo)簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

Java和JavaScript有什么區(qū)別? Java和JavaScript有什么區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。1.Java是靜態(tài)類型、編譯型語言,適用于企業(yè)應(yīng)用和大型系統(tǒng)。2.JavaScript是動(dòng)態(tài)類型、解釋型語言,主要用于網(wǎng)頁交互和前端開發(fā)。

See all articles