dart服务器开发性能,DartVM服务器开发(第四天)--代码优化
優(yōu)化請(qǐng)求上一篇文章中,我們通過依賴第三方http_server這個(gè)包實(shí)現(xiàn)將html頁(yè)面返回給瀏覽器,但是一般的服務(wù)器都包含請(qǐng)求html,json格式的傳遞,這樣就有可能造成了混亂,下面我們使用http_server這個(gè)包進(jìn)行優(yōu)化吧!
在上一篇文章中,有人問了相對(duì)路徑在不同的系統(tǒng)的表現(xiàn)是不一樣的,那么,我們今天使用絕對(duì)路徑,獲取當(dāng)前項(xiàng)目的絕對(duì)路徑是很容易的,通過下面代碼獲取var?webPath=Platform.script.toFilePath();
這里有一個(gè)Platform類,這個(gè)類主要提供有關(guān)計(jì)算機(jī)和操作系統(tǒng)的信息,而PlatForm.script主要獲取當(dāng)前運(yùn)行腳本的絕對(duì)Uri,Uri內(nèi)容為File://地址,然后toFilePath()就是獲取當(dāng)前Uri的地址
我們來輸出運(yùn)行一下看看吧!
pathToBuild的值.png
然后,我的html路徑為
/Users/rhyme/WebstormProjects/ServerApp/webApp
那么我們?cè)趺锤臑樵撀窂侥?下面是我的代碼import?'package:path/path.dart';??var?webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';
可以看到,我導(dǎo)入了path.dart這個(gè)文件,這個(gè)文件中有一個(gè)方法dirname().該方法可以知道,獲取目錄的名字,我獲取了兩次目錄的名字,就是當(dāng)前項(xiàng)目的根目錄,然后就是拼接上"/webApp"這個(gè)字符串,就是html的存放位置了,我們來看一下現(xiàn)在的值吧!
image.png
可以看到成功的獲取到了,這個(gè)就是我的html存放路徑,如果你是win系統(tǒng),也可以通過該方法去試著獲取到html存放路徑,下面就將該路徑傳入到http_server這個(gè)包的一個(gè)類中,在此之前,我們昨天有人可能對(duì)下面這一段代碼有點(diǎn)疑問
main()?async?{
VirtualDirectory?staticFiles=new?VirtualDirectory('.');//.....
}
}
對(duì)的,這里的VirtualDirectory構(gòu)造方法中,我們傳入了一個(gè)“ . ”這個(gè)點(diǎn)就是要傳入我們的html目錄路徑了,我們一定要記得,這里需要傳入絕對(duì)路徑,下面就是拼接的代碼var?webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';
VirtualDirectory?staticFiles=new?VirtualDirectory(webPath);
接下來,我們要讓VirtualDirectory這個(gè)類去接管收到的請(qǐng)求,并根據(jù)路徑訪問html頁(yè)面var?webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';
VirtualDirectory?staticFiles=new?VirtualDirectory(webPath);??//允許目錄監(jiān)聽,按照目錄去請(qǐng)求
staticFiles.allowDirectoryListing=true;//目錄處理,當(dāng)請(qǐng)求根目錄時(shí),會(huì)返回該地址
staticFiles.directoryHandler=(dir,request){????var?indexUri=new?Uri.file(dir.path,).resolve('index.html');
staticFiles.serveFile(new?File(indexUri.toFilePath()),?request);
};??var?requestServer?=?await?HttpServer.bind(InternetAddress.loopbackIPv6,?8080);??print('監(jiān)聽?localhost地址,端口號(hào)為${requestServer.port}');??//監(jiān)聽請(qǐng)求
await?for?(HttpRequest?request?in?requestServer)?{//交給staticFiles處理了
staticFiles.serveRequest(request);//????logUtils.writeHeaders(request);????if(request.uri.toString()=='/'||request.uri.toString().endsWith('.html')){????}else{//??????handleMessage(request);//????}//
}
最后,我們?cè)趙ebApp下面添加幾個(gè)頁(yè)面
添加幾個(gè)頁(yè)面.png
接下來我們根據(jù)路徑請(qǐng)求一下服務(wù)器
頁(yè)面一.png
頁(yè)面二.png
關(guān)于頁(yè)面.png
我們?cè)囍フ?qǐng)求一個(gè)不存在的頁(yè)面
可以看到不存在.png
我們?yōu)闆]有找到的頁(yè)面進(jìn)行定制一下staticFiles.errorPageHandler=(request){????if(request.uri.pathSegments.last.contains('.html')){
staticFiles.serveFile(new?File(webPath+'/404.html'),?request);
}else{
handleMessage(request);
}
};
這里我們判斷請(qǐng)求地址最后請(qǐng)求的文件是否為一個(gè)html頁(yè)面,如果是,就為它返回一個(gè)404的頁(yè)面,如果不是,就去處理消息
404頁(yè)面png
啟動(dòng)服務(wù)器,我們重新請(qǐng)求之前找不到的地址,看看有什么變化
可以看到,返回了404的頁(yè)面.png
接下來,我們優(yōu)化一下代碼main()?async?{??//獲取文件根目錄
var?webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';
VirtualDirectory?staticFiles=new?VirtualDirectory(webPath);??//允許目錄監(jiān)聽
staticFiles.allowDirectoryListing=true;??//處理訪問根目錄
staticFiles.directoryHandler=(dir,request){????var?indexUri=new?Uri.file(dir.path,).resolve('index.html');
staticFiles.serveFile(new?File(indexUri.toFilePath()),?request);
};??//處理訪問不存在的頁(yè)面
staticFiles.errorPageHandler=(request){????if(request.uri.pathSegments.last.contains('.html')){
staticFiles.serveFile(new?File(webPath+'/404.html'),?request);
}else{
handleMessage(request);
}
};??var?requestServer?=?await?HttpServer.bind(InternetAddress.loopbackIPv6,?8080);??print('監(jiān)聽?localhost地址,端口號(hào)為${requestServer.port}');??//監(jiān)聽請(qǐng)求
await?requestServer.forEach(staticFiles.serveRequest);
}
作者:rhyme_lph
鏈接:https://www.jianshu.com/p/2ca96f92efb6
總結(jié)
以上是生活随笔為你收集整理的dart服务器开发性能,DartVM服务器开发(第四天)--代码优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机二级网址打不开,大神为你解决win
- 下一篇: 服务器时间维护制度,网络设备及服务器日常