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涓閮藉凡缁忓府鎴戜滑锅氩ソ浜嗭纴钖屾椂杩樻湁涓浜涚ず渚嬩唬镰佷互渚涘︿範锛屽逛簬鏂颁汉𨱒ヨ撮潪甯稿弸濂斤纴鍙浠ラ伩鍏嶈繃澶氱殑鎸鎶樻劅銆