背景
成都創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、武宣網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為武宣等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
隨著Flutter對(duì)現(xiàn)有業(yè)務(wù)的不斷參透,閑魚(yú)Serverless基建的重心也傾向了dart生態(tài),先是將dart容器打包到服務(wù)器上,實(shí)現(xiàn)dart編程語(yǔ)言的統(tǒng)一,在統(tǒng)一的容器之上實(shí)現(xiàn)編程框架一體化(nexus、story),以及后端領(lǐng)域服務(wù)一體化。基于dart生態(tài)下,前端的FaaS在研發(fā)交付其實(shí)并不高效,研發(fā)階段主要面臨的問(wèn)題是:
編程語(yǔ)言不統(tǒng)一:編程語(yǔ)言本身雖然不是最大的障礙,但這也確實(shí)給前端開(kāi)發(fā)者增加不少門(mén)檻,而且更重要的是語(yǔ)言背后的生態(tài)、環(huán)境與體系更是一道高高的墻。
工程割裂與背后環(huán)境復(fù)雜:端側(cè)一個(gè)工程,F(xiàn)aaS側(cè)也有一個(gè)獨(dú)立的工程,它們背后都有著自己的一套構(gòu)建、調(diào)試、集成/發(fā)布的工具鏈;除此之外FaaS還有自己配套的環(huán)境、runtime、框架作為支撐。開(kāi)發(fā)者面對(duì)這樣復(fù)雜的FaaS研發(fā)環(huán)境與雙重的研發(fā)工作流是無(wú)法做到高效交付的。
編程語(yǔ)言一體化
Typescript作為Javascript的超集,彌補(bǔ)了Javascript的靜態(tài)類型檢查,同時(shí)擴(kuò)展了很多OOP的語(yǔ)法特性,使得TS跟dart在語(yǔ)法特性上有非常多相似的地方,為后面的轉(zhuǎn)換提供了可能與便利。要實(shí)現(xiàn)語(yǔ)言層面轉(zhuǎn)換背后都會(huì)有一個(gè)小型的編譯器在支撐著,不過(guò)幸運(yùn)的是Typescript官方已經(jīng)提供語(yǔ)法解析器,通過(guò)它我們很容易就拿到一份可靠的AST,所以我們只需要實(shí)現(xiàn)一個(gè)dart generator就行了。生成器大致可以分為四個(gè)層面的工作:
基礎(chǔ)語(yǔ)法轉(zhuǎn)換
原生方法差異轉(zhuǎn)換
業(yè)務(wù)框架橋接
依賴庫(kù)與頭文件橋接
基礎(chǔ)語(yǔ)法轉(zhuǎn)換
這部分很好理解,就是最基本的語(yǔ)法層面轉(zhuǎn)換,用個(gè)最簡(jiǎn)單的例子看下。
原生方法差異轉(zhuǎn)換
兩種語(yǔ)言在內(nèi)置原生方法上也有很大區(qū)別,舉個(gè)例子:可以看到下面數(shù)組的實(shí)例方法在兩種語(yǔ)言體系上是不一致的,除了數(shù)組插入還有很多很多原生方法是不一致的。當(dāng)然也沒(méi)太必要被這個(gè)難以想象的數(shù)量嚇到,大多數(shù)情況:90%的場(chǎng)景只會(huì)用到那10%的方法,完成了10%的轉(zhuǎn)換就能cover到90%的場(chǎng)景。
// ts
list2.push(10)
// dart
list2.add(10)
要實(shí)現(xiàn)系統(tǒng)方法的差異轉(zhuǎn)化首先要識(shí)別出該方法是來(lái)自于哪個(gè)類,比如說(shuō)list2.push(10)
我不可能只檢查push
,因?yàn)殡S便一個(gè)類/對(duì)象都可以實(shí)現(xiàn)一個(gè)push方法。我們必須識(shí)別出list2.push
的push
屬于Array.push
,別忘了整個(gè)typescript編譯器中占比最大的類型檢查器ts.TypeChecker
,它可以很好的幫我們解決這個(gè)問(wèn)題。大致思路如下:
業(yè)務(wù)框架橋接
在完成上面兩塊能力轉(zhuǎn)換后,常規(guī)裸寫(xiě)一段邏輯進(jìn)行轉(zhuǎn)換問(wèn)題是不大的;但業(yè)務(wù)是不可能裸寫(xiě),業(yè)務(wù)需要框架,需要借助框架進(jìn)行通訊、與容器打交道。需要借助框架進(jìn)行業(yè)務(wù)抽象,更好的組織、管理業(yè)務(wù)邏輯。我們來(lái)看個(gè)例子:
DartMtopResultresult = awaitHsfServices.request(moduleName, parameter);
上面的這段代碼是用于在dart側(cè)進(jìn)行內(nèi)部服務(wù)請(qǐng)求的,從代碼表明我們可以獲取到三部分信息:
有一個(gè)HsfServices的類
HsfServices有一個(gè)同步返回結(jié)果的request方法,接收兩個(gè)參數(shù)
最終返回DartMtopResult的數(shù)據(jù)結(jié)構(gòu)
我們?cè)俜幌?code>request 的實(shí)現(xiàn)與DartMtopResult
的申明:
// DartMtopResult.dart
classDartMtopResult
implements xxxx {
T data;
bool success;
String errMsg;
String errCode;
// more code hidden
}
// HsfServices.dart
classHsfServices{
// more code hidden
staticFuture
> request(String moduletName,String parameter)async{
// more code hidden
}
// more code hidden
}
就看這么多足夠了,打個(gè)比方如果我希望在typescript側(cè)編寫(xiě)一個(gè)能用HsfServices.request
發(fā)請(qǐng)求的ts代碼且不報(bào)錯(cuò),那應(yīng)該怎么做呢?像下面這樣申明一個(gè):
// HsfServices.d.ts
export declareclassHsfServices{
static request(moduletName:string, parameter:string):Promise
>;
}
// DartMtopResult.d.ts
export declareclassDartMtopResult
{
data: T;
success:boolean;
errMsg:string;
errCode:string;
}
// business.ts
import{HsfServices}from"HsfServices.d.ts"
import{DartMtopResult}from"DartMtopResult.d.ts"
const result:DartMtopResult
=awaitHsfServices.request >('recycleGet', parameter);
非常簡(jiǎn)單就能讓業(yè)務(wù)邏輯正常寫(xiě)下去并且不報(bào)錯(cuò)。但你肯定會(huì)說(shuō)這樣的代碼也沒(méi)法運(yùn)行起來(lái),是的,但我并不需要上面代碼運(yùn)行起來(lái),我需要的是將它轉(zhuǎn)成dart,并能在dart runtime中運(yùn)行就可以了。大致的橋接思路如下:
依賴庫(kù)與頭文件橋接
// business.tsimport {HsfServices} from "@ali/faas-hsf"import {DartMtopResult} from "@ali/faas-mtop-result"const result: DartMtopResult= await HsfServices.request >('recycleGet', parameter);
// business.dartimport 'package:hsf_services/hsf_services.dart';import 'package:dart_mtop_result/dart_mtop_result.dart';DartMtopResultresult = await HsfServices.request(moduleName, parameter);
@ali/faas-hsf
對(duì)應(yīng)dart側(cè)的pub包與引入頭文件。我們的解決思路大致是這樣的:在@ali/faas-hsf
模塊中放入faas.yaml
文件來(lái)指定對(duì)應(yīng)的映射關(guān)系。
@ali/faas-hsf
|--lib/
|--faas.yaml
|--package.json
// faas.yaml
faas_pub:
# 映射的dart側(cè)依賴包
hsf_services: ^1.1.7
# 映射引入頭文件
index: hsf_services.dart
faas_src
存放業(yè)務(wù)邏輯的ts版,package.json
存放業(yè)務(wù)邏輯所依賴的編程框架(前面我們介紹到業(yè)務(wù)框架橋接最終就體現(xiàn)在端側(cè)的依賴包上)├── faas_pub.yaml├── faas_src│ └── Home│ └── index.ts├── package.json├── src│ ├── components│ └── pages│ └── Home│ ├── index.css│ └── index.js└── README.md
init
dev
,讓開(kāi)發(fā)者0門(mén)檻初始化出一套統(tǒng)一而可靠環(huán)境的FaaS工程。faas_pub.yaml
由腳手架通過(guò)探測(cè)端側(cè)package.json中的faas依賴包來(lái)進(jìn)行提取生成的,并不需要人工維護(hù)。閑魚(yú)技術(shù)團(tuán)隊(duì)不僅是阿里巴巴集團(tuán)旗下閑置交易社區(qū)的創(chuàng)造者,更是移動(dòng)與高并發(fā)大數(shù)據(jù)應(yīng)用新技術(shù)的引導(dǎo)者與創(chuàng)新者。我們與Google Flutter/Dart小組密切合作,為社區(qū)貢獻(xiàn)了多個(gè)高star的項(xiàng)目和大量PR。我們正在積極探索深度學(xué)習(xí)和視覺(jué)技術(shù)在互動(dòng)、交易、社區(qū)場(chǎng)景的創(chuàng)新應(yīng)用。閑魚(yú)技術(shù)與集團(tuán)中間件團(tuán)隊(duì)共同打造的FaaS平臺(tái)每天支持?jǐn)?shù)以千萬(wàn)級(jí)用戶的高并發(fā)訪問(wèn)場(chǎng)景。
就是現(xiàn)在!客戶端/服務(wù)端java/架構(gòu)/前端/質(zhì)量工程師面向社會(huì)+校園招聘,base杭州阿里巴巴西溪園區(qū),一起做有創(chuàng)想空間的社區(qū)產(chǎn)品、做深度頂級(jí)的開(kāi)源項(xiàng)目,一起拓展技術(shù)邊界成就極致!