nodejsorphp
① linux ln -s 用ln -s 鏈接 根目錄到 /home/good怎麼做啊。
創建軟連接,命令如下:
ln -s / /home/good/linkname
ln的鏈接分軟鏈接和硬鏈接兩種:
1、軟鏈接就是:「ln –s 源文件 目標文件」,只會在選定的位置上生成一個文件的鏡像,不會佔用磁碟空間,類似與windows的快捷方式。
2、硬鏈接ln源文件目標文件,沒有參數-s, 會在選定的位置上生成一個和源文件大小相同的文件,無論是軟鏈接還是硬鏈接,文件都保持同步變化。
(1)nodejsorphp擴展閱讀
軟鏈接又叫符號鏈接,這個文件包含了另一個文件的路徑名。可以是任意文件或目錄,可以鏈接不同文件系統的文件。
鏈接文件甚至可以鏈接不存在的文件,這就產生一般稱之為」斷鏈」的現象,鏈接文件甚至可以循環鏈接自己。類似於編程語言中的遞歸。
軟鏈接文件只是其源文件的一個標記,當刪除了源文件後,鏈接文件不能獨立存在,雖然仍保留文件名,但卻不能查看軟鏈接文件的內容了。
用ln -s 命令可以生成一個軟連接,如下:
[root@linux236 test]# ln -s source_file softlink_file
在對符號文件進行讀或寫操作的時候,系統會自動把該操作轉換為對源文件的操作,但刪除鏈接文件時,系統僅僅刪除鏈接文件,而不刪除源文件本身。
刪除硬/軟鏈接用rm softlink_file
或者unlink softlink_file
② 如何選擇Node.js Web開發框架
Node.js非常適用於Web開發,但是現在無論是一個網站,還是Web App都已經成為包括很多不同部分,如前端、資料庫、業務模塊、功能模塊等等的大型項目,使用Node.js從零開始進行Web開發,也許大中型團隊能夠 勝任,但對於個人和小型團隊來說是不現實的。這時候框架就成為Web開發利器,對於個人開發來說幾乎是必不可少。那麼如何選擇Node.js Web開發框架呢?
首先,我們必須要弄清楚的是,我們需要的是——
程序 or 框架?
程序是已經成型的應用,你需要的是為它搭建環境、添加配置,然後就可以運行起來;框架則是應用的骨架,你需要為它添加塵氏冊數據模型、業務邏輯,它才能成為應用,開始提供服務。
事實上,對於Web開發來說,程序和框架的區別正越來越模糊,比如幾乎婦孺皆知的Wordpress,它是一個博客程序,但它豐富的插件以及高度的 自定義能夠支持很大程度上的二次開發,在這點上它比起一些PHP框架也並不遜色。我個人認為,如果重心在於提供服務而不是掌握技術,有WordPress 這樣的程序是沒有必要使用框架的。
可惜的是,由於Nodejs還很年輕,目前還沒有WordPress這派宏樣的程序,因此目前在Node.js開發里,如果想做出自己想要的作品,框架是必然的核團選擇。如果是某些特定類型的應用,可以嘗試一些開源的程序,比如要用Nodejs做博客,有Hexo、Ghost等。
Node.js Web框架有哪些?
Node.js里的Web框架分為API框架和Web應用框架。前者能夠開發出RESTful的API,後者也能開發出RESTful API,但還包括模板、渲染等為前端所准備的功能。
API框架的使用場景是為跨平台應用提供統一的數據模型,而渲染由前端/客戶端自行解決。目前比較知名的API框架有
restify(文檔、Github、NPM)
ActionHero.js(官網、Github、NPM)
LoopBack(官網、Github、NPM)
Frisby(官網、Github、NPM)
Fortune.js(官網、Github、NPM)
Web應用框架顧名思義,就是為了打造Web應用所開發的框架。這里有兩種風格的Web應用框架。
一個是Sinatra風格,另一個是Rails風格。Sinatra和Rails都是Ruby語言的Web框架,後者的影響力更大也更為知名。這里簡單的解釋一下兩種風格是什麼意思。
Sinatra風格是指高度可配置,注重開發的自由度。代表性的Nodejs Web框架有:
Express(官網、Github、NPM)TJ大神開發,Node.js官方推薦
hapi(官網、Github、NPM)
koa.js(官網、Github、NPM)
flaliron(官網、Github、NPM)
total.js(官網、Github、NPM)
locomotive(官網、Github、NPM)
Rails風格則是指不重復自己和約定優於配置,以及嚴格遵循MVC結構開發。代表性的框架有:
Sails.js(官網、Github、NPM)
geddy(官網、Github、NPM)
CompoundJS(官網、Github、NPM) 原railswayjs
這兩種風格無所謂誰優誰劣,全憑使用者的偏好。
而在這兩種Web框架之外,還有更大型的框架,即全棧框架,其中的代表是MEAN。
MEAN?
MEAN指MongoDB+Express+Angular.js+Node.js,這一組合包括運行環境、資料庫、Web框架和前端引擎。被稱為 全棧框架(Full-stack framework)。這其中除了Node.js之外,每一個都是可替換的,目標是創建從前端到後端,全部使用javascript的Web應用。
由於這一框架的完善性,有人將其稱為LAMP的接班人。LAMP即PHP的典型運行環境,Linux+Apache+Mysql+PHP,被大量的用於各種虛擬主機上。
MEAN看似龐大,但事實上要構建完整的現代化Web應用,特別是SPA(單頁面應用),這幾個組件都是難以缺少的,並且,其中每一項幾乎都是目前 情況下的最佳選擇,因此用於學習和重頭開始打造新的Web應用是非常合適的。但由於實際業務的獨特性,很可能要替換其中的組件,比如用Mysql來替換 MongoDB,因此,學習其中的原理和架構,打造自己的類MEAN框架也是一種選擇。
作為個人和小團隊來說,全棧框架MEAN基本上足夠了,但目前大多數全棧框架還包含一項特性,那就是實時,擁有實時功能的框架我們又稱為實時框架。
實時框架好嗎?
實時框架(Real-time framework)指包含了webSocket的雙向通信功能,能夠在伺服器和客戶端做到實時通信的框架。
服務端和客戶端自由通信的需求一直都在,但由於HTTP協議本身的局限性,因此催生了Comet等變通的方法,但即使這樣也離實時相距甚遠。而當 Node.js興起後,另一個HTML5技術webSocket也漸漸成熟,人們突然發現,實時通信一下子變得觸手可及,於是webSocket技術在 Node.js中得到大量的應用,其中最為知名的模塊就是socket.io,而各種全棧框架也紛紛加入實時特性來應對更廣闊的開發需求。
目前有代表性的實時框架有:
Meteor(官網、Github、NPM)
MEAN.io(官網、Github、NPM)
Derby(官網、Github、NPM)
SocketStream(官網、Github、NPM)
不過說實話,目前能看到的實時通信的應用場景其實不多,其中大多集中於聊天室、to-do、實時圖表、在線游戲等領域。其他領域使用實時特性不但沒必要,而且是對伺服器資源的浪費。因此目前是否要採用實時框架,要看具體的項目而定。
以上基本就是Node.js Web框架的現狀了,相信看到這里,對於選擇何種框架讀者已經心裡有數了吧。最後再介紹一個容易搞混的概念,和解釋一下我的選擇。
YEOMAN?
第一次見到這個詞,我還以為它和MEAN有什麼聯系。事實上,它們是截然不同的兩個東西。YEOMAN由YO(腳手架)、grunt(構建工具)、bower(包管理器),它代表的是一種工作流,與框架開發的思維方式完全不同。具體的介紹可見這里。
YEOMAN能夠和框架達到類似的目的,都是為構建一個Web應用做好准備,但是要不要採用YEOMAN,則是見仁見智。我個人的看法是,學習 YEOMAN本身就需要不少時間,並且有一定的學習門檻。至少在目前,使用框架開發還是相對經濟的,而如果以後YEOMAN這種模式推廣開來,再來學習也 不遲,更何況有一定的Node.js項目經驗之後再來學習YEOMAN要輕松很多。
事實上,我還是很認可YEOMAN這種Generator+package Manager的模式的,這是因為Node.js本身崇尚微模塊的 概念,即無論是多麼小的功能,都將它們模塊化,甚至大的模塊也要拆分成小的模塊,然後通過搭積木的方式來構建應用。這樣能夠徹底的解耦,對於不容易調試的 Javascript來說,也有助於定位和修復應用中的問題。Generator就是這種理念催生下的產物,通過選擇不同的配置和選項,將積木搭起來。不 過對於這種模式目前大家也還處於實驗當中,不急於進行實際應用。
③ php如何實現websocket
php有可用的websocket庫,不需要php-fpm。
目前比較成熟的有swoole(swoole.com),和workman(workman.net)
swoole是c寫的php擴展, 效率比nodejs還要高,workman是純php實現,兩者都號稱可以實現並發百萬TCP連接。
給你個例子:
這個要通過cmd運行的具體帶的參數有點忘記了
<?php
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
//創建一個socket連接設置參數綁定監聽並且返回
$master=WebSocket("localhost",12345);
//標示是否已經進行過握手了
$is_shaked=false;
//是否已經關閉
$is_closed=true;
//將socket變為一個可用的socket
while(true){
//如果是關閉狀態並且是沒有握手的話則創建一個可用的socket(貌似第二個條件可以去除)
if($is_closed&&!$is_shaked){
if(($sock=socket_accept($master))<0){
echo"socket_accept()failed:reason:".socket_strerror($sock)." ";
}
//將關閉狀態修改為false
$is_closed=false;
}
//開始進行數據處理
process($sock);
}
//處理請求的函數
functionprocess($socket){
//先從獲取到全局變數
global$is_closed,$is_shaked;
//從socket中獲取數據
$buffer=socket_read($socket,2048);
//如果buffer返回值為false並且已經握手的話則斷開連接
if(!$buffer&&$is_shaked){
disconnect($socket);
}else{
//如果沒有握手的話則握手並且修改握手狀態
if($is_shaked==false){
$return_str=dohandshake($buffer);
$is_shaked=true;
}else{
//如果已經握手的話則送入deal函數中進行相應處理
$data_str=decode($buffer);//解析出來的從前端送來的內容
console($data_str);
$return_str=encode(deal($socket,$data_str));
//$return_str=encode($data_str);
}
//將應該返回的字元串寫入socket返回
socket_write($socket,$return_str,strlen($return_str));
}
}
functiondeal($socket,$msgObj){
$obj=json_decode($msgObj);
foreach($objas$key=>$value){
if($key=='close'){
disconnect($socket);
console('closesuccess');
return'closesuccess';
}elseif($key=='msg'){
console($value." ");
return$value;
}
}
}
//獲取頭部信息
functiongetheaders($req){
$r=$h=$o=null;
if(preg_match("/GET(.*)HTTP/",$req,$match)){$r=$match[1];}
if(preg_match("/Host:(.*) /",$req,$match)){$h=$match[1];}
if(preg_match("/Origin:(.*) /",$req,$match)){$o=$match[1];}
if(preg_match("/Sec-WebSocket-Key:(.*) /",$req,$match)){$key=$match[1];}
if(preg_match("/ (.*?)$/",$req,$match)){$data=$match[1];}
returnarray($r,$h,$o,$key,$data);
}
functionWebSocket($address,$port){
$master=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)ordie("socket_create()failed");
socket_set_option($master,SOL_SOCKET,SO_REUSEADDR,1)ordie("socket_option()failed");
socket_bind($master,$address,$port)ordie("socket_bind()failed");
socket_listen($master,20)ordie("socket_listen()failed");
echo"ServerStarted:".date('Y-m-dH:i:s')." ";
echo"Mastersocket:".$master." ";
echo"Listeningon:".$address."port".$port." ";
return$master;
}
functiondohandshake($buffer){
list($resource,$host,$origin,$key,$data)=getheaders($buffer);
echo"resourceis$resource ";
echo"originis$origin ";
echo"hostis$host ";
echo"keyis$key ";
$response_key=base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));
$return_str="HTTP/1.1101SwitchingProtocols ".
"Upgrade:websocket ".
"Connection:Upgrade ".
"Sec-WebSocket-Accept:$response_key ";
return$return_str;
}
functionconsole($msg){
$msg=transToGBK($msg);
echo"$msg ";
return$msg;
}
functiondecode($msg=""){
$mask=array();
$data="";
$msg=unpack("H*",$msg);
$head=substr($msg[1],0,2);
if(hexdec($head{1})===8){
$data=false;
}elseif(hexdec($head{1})===1){
$mask[]=hexdec(substr($msg[1],4,2));
$mask[]=hexdec(substr($msg[1],6,2));
$mask[]=hexdec(substr($msg[1],8,2));
$mask[]=hexdec(substr($msg[1],10,2));
$s=12;
$e=strlen($msg[1])-2;
$n=0;
for($i=$s;$i<=$e;$i+=2){
$data.=chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));
$n++;
}
}
return$data;
}
functionencode($msg=""){
$frame=array();
$frame[0]="81";
$msg.='isok';
$len=strlen($msg);
$frame[1]=$len<16?"0".dechex($len):dechex($len);
$frame[2]=ord_hex($msg);
$data=implode("",$frame);
returnpack("H*",$data);
}
functiontransToGBK($s){//UTF8->GBK
//echo$s;
returniconv("UTF-8","GBK",$s);
return$s;
}
functionord_hex($data){
$msg="";
$l=strlen($data);
for($i=0;$i<$l;$i++){
//ord是返回字元串第一個字元的ascii值
//dechex把十進制轉換為十六進制
$msg.=dechex(ord($data{$i}));
}
return$msg;
}
functiondisconnect($socket){
global$is_shaked,$is_closed;
$is_shaked=false;
$is_closed=true;
socket_close($socket);
}
?>
④ 濡備綍閫夋嫨Node.js Web寮鍙戞嗘灦
棣栧厛錛屾垜浠蹇呴』瑕佸紕娓呮氱殑鏄錛屾垜浠闇瑕佺殑鏄鈥斺
紼嬪簭 or 妗嗘灦錛
紼嬪簭鏄宸茬粡鎴愬瀷鐨勫簲鐢錛屼綘闇瑕佺殑鏄涓哄畠鎼寤虹幆澧冦佹坊鍔犻厤緗錛岀劧鍚庡氨鍙浠ヨ繍琛岃搗鏉ワ紱妗嗘灦鍒欐槸搴旂敤鐨勯ㄦ灦錛屼綘闇瑕佷負瀹冩坊鍔犳暟鎹妯″瀷銆佷笟鍔¢昏緫錛屽畠鎵嶈兘鎴愪負搴旂敤錛屽紑濮嬫彁渚涙湇鍔°
浜嬪疄涓婏紝瀵逛簬Web寮鍙戞潵璇達紝紼嬪簭鍜屾嗘灦鐨勫尯鍒姝h秺鏉ヨ秺妯$硦錛屾瘮濡傚嚑涔庡囧虹殕鐭ョ殑Wordpress錛屽畠鏄涓涓鍗氬㈢▼搴忥紝浣嗗畠涓板瘜鐨勬彃浠朵互鍙婇珮搴︾殑 鑷瀹氫箟鑳藉熸敮鎸佸緢澶х▼搴︿笂鐨勪簩嬈″紑鍙戱紝鍦ㄨ繖鐐逛笂瀹冩瘮璧蜂竴浜汸HP妗嗘灦涔熷苟涓嶉婅壊銆傛垜涓浜鴻や負錛屽傛灉閲嶅績鍦ㄤ簬鎻愪緵鏈嶅姟鑰屼笉鏄鎺屾彙鎶鏈錛屾湁WordPress 榪欐牱鐨勭▼搴忔槸娌℃湁蹇呰佷嬌鐢ㄦ嗘灦鐨勩
鍙鎯滅殑鏄錛岀敱浜嶯odejs榪樺緢騫磋交錛岀洰鍓嶈繕娌℃湁WordPress榪欐牱鐨勭▼搴忥紝鍥犳ょ洰鍓嶅湪Node.js寮鍙戦噷錛屽傛灉鎯沖仛鍑鴻嚜宸辨兂瑕佺殑浣滃搧錛屾嗘灦鏄蹇呯劧鐨勯夋嫨銆傚傛灉鏄鏌愪簺鐗瑰畾綾誨瀷鐨勫簲鐢錛屽彲浠ュ皾璇曚竴浜涘紑婧愮殑紼嬪簭錛屾瘮濡傝佺敤Nodejs鍋氬崥瀹錛屾湁Hexo銆丟host絳夈
鍥炲埌欏墮儴
Node.js Web妗嗘灦鏈夊摢浜涳紵
Node.js閲岀殑Web妗嗘灦鍒嗕負API妗嗘灦鍜學eb搴旂敤妗嗘灦銆傚墠鑰呰兘澶熷紑鍙戝嚭RESTful鐨凙PI錛屽悗鑰呬篃鑳藉紑鍙戝嚭RESTful API錛屼絾榪樺寘鎷妯℃澘銆佹覆鏌撶瓑涓哄墠絝鎵鍑嗗囩殑鍔熻兘銆
API妗嗘灦鐨勪嬌鐢ㄥ満鏅鏄涓鴻法騫沖彴搴旂敤鎻愪緵緇熶竴鐨勬暟鎹妯″瀷錛岃屾覆鏌撶敱鍓嶇/瀹㈡埛絝鑷琛岃В鍐熾傜洰鍓嶆瘮杈冪煡鍚嶇殑API妗嗘灦鏈
restify錛堟枃妗c丟ithub銆丯PM錛
ActionHero.js錛堝畼緗戙丟ithub銆丯PM錛
LoopBack錛堝畼緗戙丟ithub銆丯PM錛
Frisby錛堝畼緗戙丟ithub銆丯PM錛
Fortune.js錛堝畼緗戙丟ithub銆丯PM錛
Web搴旂敤妗嗘灦欏懼悕鎬濅箟錛屽氨鏄涓轟簡鎵撻燱eb搴旂敤鎵寮鍙戠殑妗嗘灦銆傝繖閲屾湁涓ょ嶉庢牸鐨刉eb搴旂敤妗嗘灦銆
涓涓鏄瘲inatra椋庢牸錛屽彟涓涓鏄疪ails椋庢牸銆係inatra鍜孯ails閮芥槸Ruby璇璦鐨刉eb妗嗘灦錛屽悗鑰呯殑褰卞搷鍔涙洿澶т篃鏇翠負鐭ュ悕銆傝繖閲岀畝鍗曠殑瑙i噴涓涓嬩袱縐嶉庢牸鏄浠涔堟剰鎬濄
Sinatra椋庢牸鏄鎸囬珮搴﹀彲閰嶇疆錛屾敞閲嶅紑鍙戠殑鑷鐢卞害銆備唬琛ㄦх殑Nodejs Web妗嗘灦鏈夛細
Express錛堝畼緗戙丟ithub銆丯PM錛塗J澶х炲紑鍙戱紝Node.js瀹樻柟鎺ㄨ崘
hapi錛堝畼緗戙丟ithub銆丯PM錛
koa.js錛堝畼緗戙丟ithub銆丯PM錛
flaliron錛堝畼緗戙丟ithub銆丯PM錛
total.js錛堝畼緗戙丟ithub銆丯PM錛
locomotive錛堝畼緗戙丟ithub銆丯PM錛
Rails椋庢牸鍒欐槸鎸囦笉閲嶅嶈嚜宸卞拰綰﹀畾浼樹簬閰嶇疆錛屼互鍙婁弗鏍奸伒寰狹VC緇撴瀯寮鍙戙備唬琛ㄦх殑妗嗘灦鏈夛細
Sails.js錛堝畼緗戙丟ithub銆丯PM錛
geddy錛堝畼緗戙丟ithub銆丯PM錛
CompoundJS錛堝畼緗戙丟ithub銆丯PM錛 鍘焤ailswayjs
榪欎袱縐嶉庢牸鏃犳墍璋撹皝浼樿皝鍔o紝鍏ㄥ嚟浣跨敤鑰呯殑鍋忓ソ銆
鑰屽湪榪欎袱縐峎eb妗嗘灦涔嬪栵紝榪樻湁鏇村ぇ鍨嬬殑妗嗘灦錛屽嵆鍏ㄦ爤妗嗘灦錛屽叾涓鐨勪唬琛ㄦ槸MEAN銆
鍥炲埌欏墮儴
MEAN錛
MEAN鎸嘙ongoDB+Express+Angular.js+Node.js錛岃繖涓緇勫悎鍖呮嫭榪愯岀幆澧冦佹暟鎹搴撱乄eb妗嗘灦鍜屽墠絝寮曟搸銆傝縐頒負 鍏ㄦ爤妗嗘灦錛團ull-stack framework錛夈傝繖鍏朵腑闄や簡Node.js涔嬪栵紝姣忎竴涓閮芥槸鍙鏇挎崲鐨勶紝鐩鏍囨槸鍒涘緩浠庡墠絝鍒板悗絝錛屽叏閮ㄤ嬌鐢╦avascript鐨刉eb搴旂敤銆
鐢變簬榪欎竴妗嗘灦鐨勫畬鍠勬э紝鏈変漢灝嗗叾縐頒負LAMP鐨勬帴鐝浜恆侺AMP鍗砅HP鐨勫吀鍨嬭繍琛岀幆澧冿紝Linux+Apache+MySql+PHP錛岃澶ч噺鐨勭敤浜庡悇縐嶈櫄鎷熶富鏈轟笂銆
MEAN鐪嬩技搴炲ぇ錛屼絾浜嬪疄涓婅佹瀯寤哄畬鏁寸殑鐜頒唬鍖朩eb搴旂敤錛岀壒鍒鏄瘲PA錛堝崟欏甸潰搴旂敤錛夛紝榪欏嚑涓緇勪歡閮芥槸闅句互緙哄皯鐨勶紝騫朵笖錛屽叾涓姣忎竴欏瑰嚑涔庨兘鏄鐩鍓 鎯呭喌涓嬬殑鏈浣抽夋嫨錛屽洜姝ょ敤浜庡︿範鍜岄噸澶村紑濮嬫墦閫犳柊鐨刉eb搴旂敤鏄闈炲父鍚堥傜殑銆備絾鐢變簬瀹為檯涓氬姟鐨勭嫭鐗規э紝寰堝彲鑳借佹浛鎹㈠叾涓鐨勭粍浠訛紝姣斿傜敤Mysql鏉ユ浛鎹 MongoDB錛屽洜姝わ紝瀛︿範鍏朵腑鐨勫師鐞嗗拰鏋舵瀯錛屾墦閫犺嚜宸辯殑綾籑EAN妗嗘灦涔熸槸涓縐嶉夋嫨銆
浣滀負涓浜哄拰灝忓洟闃熸潵璇達紝鍏ㄦ爤妗嗘灦MEAN鍩烘湰涓婅凍澶熶簡錛屼絾鐩鍓嶅ぇ澶氭暟鍏ㄦ爤妗嗘灦榪樺寘鍚涓欏圭壒鎬э紝閭e氨鏄瀹炴椂錛屾嫢鏈夊疄鏃跺姛鑳界殑妗嗘灦鎴戜滑鍙堢О涓哄疄鏃舵嗘灦銆
鍥炲埌欏墮儴
瀹炴椂妗嗘灦濂藉悧錛
瀹炴椂妗嗘灦錛圧eal-time framework錛夋寚鍖呭惈浜唚ebSocket鐨勫弻鍚戦氫俊鍔熻兘錛岃兘澶熷湪鏈嶅姟鍣ㄥ拰瀹㈡埛絝鍋氬埌瀹炴椂閫氫俊鐨勬嗘灦銆
鏈嶅姟絝鍜屽㈡埛絝鑷鐢遍氫俊鐨勯渶奼備竴鐩撮兘鍦錛屼絾鐢變簬HTTP鍗忚鏈韜鐨勫矓闄愭э紝鍥犳ゅ偓鐢熶簡Comet絳夊彉閫氱殑鏂規硶錛屼絾鍗充嬌榪欐牱涔熺誨疄鏃剁浉璺濈敋榪溿傝屽綋 Node.js鍏磋搗鍚庯紝鍙︿竴涓狧TML5鎶鏈痺ebSocket涔熸笎娓愭垚鐔燂紝浜轟滑紿佺劧鍙戠幇錛屽疄鏃墮氫俊涓涓嬪瓙鍙樺緱瑙︽墜鍙鍙婏紝浜庢槸webSocket鎶鏈鍦 Node.js涓寰楀埌澶ч噺鐨勫簲鐢錛屽叾涓鏈涓虹煡鍚嶇殑妯″潡灝辨槸socket.io錛岃屽悇縐嶅叏鏍堟嗘灦涔熺悍綰峰姞鍏ュ疄鏃剁壒鎬ф潵搴斿規洿騫塊様鐨勫紑鍙戦渶奼傘
鐩鍓嶆湁浠h〃鎬х殑瀹炴椂妗嗘灦鏈夛細
Meteor錛堝畼緗戙丟ithub銆丯PM錛
MEAN.io錛堝畼緗戙丟ithub銆丯PM錛
Derby錛堝畼緗戙丟ithub銆丯PM錛
SocketStream錛堝畼緗戙丟ithub銆丯PM錛
涓嶈繃璇村疄璇濓紝鐩鍓嶈兘鐪嬪埌鐨勫疄鏃墮氫俊鐨勫簲鐢ㄥ満鏅鍏跺疄涓嶅氾紝鍏朵腑澶у氶泦涓浜庤亰澶╁ゃ乼o-do銆佸疄鏃跺浘琛ㄣ佸湪綰挎父鎴忕瓑棰嗗煙銆傚叾浠栭嗗煙浣跨敤瀹炴椂鐗規т笉浣嗘病蹇呰侊紝鑰屼笖鏄瀵規湇鍔″櫒璧勬簮鐨勬氮璐廣傚洜姝ょ洰鍓嶆槸鍚﹁侀噰鐢ㄥ疄鏃舵嗘灦錛岃佺湅鍏蜂綋鐨勯」鐩鑰屽畾銆
浠ヤ笂鍩烘湰灝辨槸Node.js Web妗嗘灦鐨勭幇鐘朵簡錛岀浉淇$湅鍒拌繖閲岋紝瀵逛簬閫夋嫨浣曠嶆嗘灦璇昏呭凡緇忓績閲屾湁鏁頒簡鍚с傛渶鍚庡啀浠嬬粛涓涓瀹規槗鎼炴販鐨勬傚康錛屽拰瑙i噴涓涓嬫垜鐨勯夋嫨銆
鍥炲埌欏墮儴
YEOMAN錛
絎涓嬈¤佸埌榪欎釜璇嶏紝鎴戣繕浠ヤ負瀹冨拰MEAN鏈変粈涔堣仈緋匯備簨瀹炰笂錛屽畠浠鏄鎴鐒朵笉鍚岀殑涓や釜涓滆タ銆俌EOMAN鐢盰O錛堣剼鎵嬫灦錛夈乬runt錛堟瀯寤哄伐鍏鳳級銆乥ower錛堝寘綆$悊鍣錛夛紝瀹冧唬琛ㄧ殑鏄涓縐嶅伐浣滄祦錛屼笌妗嗘灦寮鍙戠殑鎬濈淮鏂瑰紡瀹屽叏涓嶅悓銆傚叿浣撶殑浠嬬粛鍙瑙佽繖閲屻
YEOMAN鑳藉熷拰妗嗘灦杈懼埌綾諱技鐨勭洰鐨勶紝閮芥槸涓烘瀯寤轟竴涓猈eb搴旂敤鍋氬ソ鍑嗗囷紝浣嗘槸瑕佷笉瑕侀噰鐢╕EOMAN錛屽垯鏄瑙佷粊瑙佹櫤銆傛垜涓浜虹殑鐪嬫硶鏄錛屽︿範 YEOMAN鏈韜灝遍渶瑕佷笉灝戞椂闂達紝騫朵笖鏈変竴瀹氱殑瀛︿範闂ㄦ涖傝嚦灝戝湪鐩鍓嶏紝浣跨敤妗嗘灦寮鍙戣繕鏄鐩稿圭粡嫻庣殑錛岃屽傛灉浠ュ悗YEOMAN榪欑嶆ā寮忔帹騫垮紑鏉ワ紝鍐嶆潵瀛︿範涔 涓嶈繜錛屾洿浣曞喌鏈変竴瀹氱殑Node.js欏圭洰緇忛獙涔嬪悗鍐嶆潵瀛︿範YEOMAN瑕佽交鏉懼緢澶氥
浜嬪疄涓婏紝鎴戣繕鏄寰堣ゅ彲YEOMAN榪欑岹enerator+package Manager鐨勬ā寮忕殑錛岃繖鏄鍥犱負Node.js鏈韜宕囧皻寰妯″潡鐨 姒傚康錛屽嵆鏃犺烘槸澶氫箞灝忕殑鍔熻兘錛岄兘灝嗗畠浠妯″潡鍖栵紝鐢氳嚦澶х殑妯″潡涔熻佹媶鍒嗘垚灝忕殑妯″潡錛岀劧鍚庨氳繃鎼縐鏈ㄧ殑鏂瑰紡鏉ユ瀯寤哄簲鐢ㄣ傝繖鏍瘋兘澶熷交搴曠殑瑙h︼紝瀵逛簬涓嶅規槗璋冭瘯鐨 Javascript鏉ヨ達紝涔熸湁鍔╀簬瀹氫綅鍜屼慨澶嶅簲鐢ㄤ腑鐨勯棶棰樸侴enerator灝辨槸榪欑嶇悊蹇靛偓鐢熶笅鐨勪駭鐗╋紝閫氳繃閫夋嫨涓嶅悓鐨勯厤緗鍜岄夐」錛屽皢縐鏈ㄦ惌璧鋒潵銆備笉 榪囧逛簬榪欑嶆ā寮忕洰鍓嶅ぇ瀹朵篃榪樺勪簬瀹為獙褰撲腑錛屼笉鎬ヤ簬榪涜屽疄闄呭簲鐢ㄣ
鍥炲埌欏墮儴
涓轟粈涔堟垜閫夋嫨浜咹ackathon Starter錛
鍦ㄦ垜鐨勪釜浜洪」鐩涓錛屼嬌鐢ㄧ殑鏄疕ackathon Starter錛屼竴涓狽ode.js Web搴旂敤鑴氭墜鏋躲
鎴戜嬌鐢ㄥ畠鐨勫師鍥犳槸錛岃佹眰楂樺害鍙閰嶇疆錛屽悓鏃跺張璁ㄥ帉鍐欎竴浜涢厤緗鐨勪唬鐮侊紝鍥犳ゅ畠瀵逛簬鎴戞潵璇存槸寰堝ソ鐨勯夋嫨銆備竴浜涘叏鏍堟嗘灦瀵規垜鏉ヨ達紝灝佽呰繃澶氾紝灝嗗師鐢熺殑 Node.js/Express API闅愯棌鎺変簡錛岃佷嬌鐢ㄨ繕闇瑕佷竴瀹氱殑瀛︿範鎴愭湰銆傝孍xpress榪欐牱鐨勬嗘灦鍙堝お榪囩畝媧侊紝鍦ㄥ疄闄呯殑欏圭洰涓浣跨敤榪橀渶瑕佸ぇ閲忕殑鎻掍歡鍜岄厤緗錛岃岃繖浜涘湪 Hackathon Starter涓閮藉凡緇忓府鎴戜滑鍋氬ソ浜嗭紝鍚屾椂榪樻湁涓浜涚ず渚嬩唬鐮佷互渚涘︿範錛屽逛簬鏂頒漢鏉ヨ撮潪甯稿弸濂斤紝鍙浠ラ伩鍏嶈繃澶氱殑鎸鎶樻劅銆