ÕªÒª£ºÈçºÎ»ùÓÚES6£¬Ê¹ÓÃReact¹¹½¨Ò»¸öÐÂJavaScriptÓ¦Óã¿ÈçºÎ½«ES6´úÂë·¢²¼µ½NPMÉÏ£¿ÓÖÈçºÎÔÚºóÐøÏîÄ¿ÖÐʹÓÃÕâЩ´úÂ룿¡¡±¾ÎÄͨ¹ý¾ßÌåµÄ±à³Ìʵ¼ù£¬Ò»Ò»½ÒÏþ¡£
¡¾±àÕß°´¡¿±¾ÎÄΪ¡¶Building modular javascript applications in ES6 with React, Webpack and Babel¡·µÄ¼òÒëÄÚÈÝ£¬½²ÊöÁË×÷Õß»ùÓÚES6£¬Ê¹ÓÃReact¡¢Webpack¡¢Babel¹¹½¨Ä£¿é»¯JavaScriptÓ¦Óõıà³ÌÐĵá£
Èç¹ûÄãÏëÓÃReact¹¹½¨Ò»¸öеÄJavaScriptÓ¦Ó㬶øÇÒÄ㻹Ïëʵ¼ùES6Óï·¨ÖеÄÐÂÌØÐÔ£¬´ËÍ⣬ÄãÉõÖÁÏë´´½¨Ò»Ð©¿ÉÖØÓÃ×é¼þ²¢·¢²¼µ½NPMÉÏ£¬ÄÇôÄ㾿¾¹Ó¦¸ÃÔõÑùʵÏÖÕâЩÐèÇó£¿ÄãÈçºÎ½«ES6´úÂë·¢²¼µ½NPM£¬ÓÖÈçºÎÔÚºóÐøµÄÏîÄ¿ÖÐʹÓÃÕâЩ´úÂ룿ÎÒ»¨ÁËһЩʱ¼ä½â¾öÉÏÃæÕâЩÎÊÌ⣬ÏÖÔÚÎÒÔ¸ÒâÓëÄãÃÇ·ÖÏíÎÒϰµÃµÄÐÂ֪ʶ¡£
Èç¹ûÄãÕæµÄ²»Ï£ÍûÔĶÁËùÓеÄϸ½Ú£¬Ö»Ïë¿´¿´´úÂë×îÖÕµÄЧ¹û¡ª¡ª¿ÉÒÔÖ±½ÓÔĶÁ×îºóÒ»²¿·Ö¡£
ÐèÇó
ÎÒÃÇÏÈÀ´¸ãÇå³þÎÒÃǵ½µ×ÏëÒªµÃµ½Ê²Ã´£¬Ó¦¸ÃÈçºÎȥʵÏÖ¡£
ÎÒÃǵÄÖ÷ҪĿ±êÊÇ£º»ùÓÚES6£¬Ê¹ÓÃÎÒÃÇ×Ô¶¨ÒåµÄReact×é¼þ´´½¨Ò»¸öReactÓ¦Óá£ÆäÖÐ×ÊֵIJ¿·ÖÊÇ×Ô¶¨ÒåReact×é¼þ¡£ÒÔÏÂÊÇʵÏÖÕâЩĿ±êµÄÐèÇóÁÐ±í£º
- ×Ô¶¨Òå×é¼þÓ¦¸ÃʹÓÃES6±àд£»
-
×Ô¶¨Òå×é¼þÓ¦¸ÃÍêÈ«×Ô¸ø×Ô×㣨ʹÓ÷½·¨×ã¹»¼òµ¥£º°²×°£¬µ¼È룬äÖȾ£©£»
-
×Ô¶¨Òå×é¼þÓ¦¸ÃÌṩ×ÔÉíËùÐèµÄÑùʽ£¨²Î¿¼µÚ2Ìõ£¬×Ô¸ø×Ô×㣩£»
-
×Ô¶¨Òå×é¼þÓ¦¸Ãͨ¹ýNPM°²×°£¨ÒòΪbowerÓкܶàÎÊÌ⣩£»
-
×îºó¡ª¡ªËùÓÐ×Ô¶¨Òå×é¼þÓ¦¸ÃÓе¥Ôª²âÊԺʹúÂ븲¸ÇÂʱ¨¸æ£»
-
¼Ó·ÖÏ¡ª×Ô¶¨Òå×é¼þ²»Ó¦¸ÃÏ໥ÒÀÀµ£¬µ«ÊÇÓ¦¸ÃÄܹ»Ï໥ӰÏì¡£
´ËÍ⣬ÎÒÃÇÐèҪһЩºÜ°ôµÄµ÷ÊÔ¹¤¾ß£¬ÀýÈ磺´úÂë¼ì²é¡¢Ô´ÂëÓ³É䣨ÒòΪ´úÂëÐèÒª±àÒ룬ËùÒÔÕâÊǵ÷ÊԵıØÒª¹¤¾ß£©¡£
´¦ÀíÐèÇó
ÏÖÔÚÎÒÃÇÒÑÁ˽âËùÓÐÐèÇ󣬿ÉÒÔ¿ªÊ¼Ñ°ÕÒÂú×ãÕâЩÐèÇóµÄ·½·¨¡£ËùÒÔ£¬Ê×ÏÈÐèҪѡ¶¨ÎÒÃǽ«Ê¹ÓõŤ¾ß¼¯ºÍÏà¹Ø¿â¡£
±àÒë
ÎÒÃÇÒª»ùÓÚES6¿ª·¢Ó¦Óã¬Ä¿Ç°µÄä¯ÀÀÆ÷Ôݲ»Íêȫ֧³ÖËùÓÐÐÂÓï·¨ÌØÐÔ£¬ËùÒÔÎÒÃÇÐèÒª½«ES6±àÒëΪES5¡£Í¬Ê±ÎÒÃÇÏ£Íûͨ¹ýNPM¹ÜÀí×Ô¶¨Òå×é¼þ£¬ÐèҪѡÓÃÒ»¸ö¼æÈÝCommonJSµÄ¹¤¾ß¼¯¡£
ĿǰÓÐÁ½ÖÖÁ÷ÐеĿÉÓÃÑ¡Ôñ¡ª¡ªBrowserifyºÍWebpack¡£¶þÕß¶¼Âú×ãÎÒÃǵĴ󲿷ÖÐèÇ󣬿¼Âǵ½ÎÒÃǵÄÏîÄ¿ÐèҪʹÓÃÑùʽÎļþ£¬¶øWebpack¶Ô·ÇJavaScriptÎļþ£¨ÀýÈ磺ÑùʽÎļþ¡¢Í¼Æ¬¡¢×ÖÌåÎļþ£©·Ç³£ÓѺã¬ËùÒÔ×îÖÕÎÒÃǽ«Ñ¡ÓÃWebpack¡£
WebpackÒѾÄܹ»Âú×ã´ó²¿·ÖÐèÇó£¬ÎÒÃǽ«ÔÚ´Ë»ù´¡ÉϼÓÈëGulp.js£¬°ïÖúÎÒÃÇÍê³É¸ü¶àÈÎÎñ£¨ÀýÈ磺µ¥Ôª²âÊÔ¡¢´úÂ븲¸ÇÂʼì²â¡¢¾²Ì¬×ÊÔ´ËÅ·þ£©¡£
ʹÓÃES6
ÏÖÔÚÎÒÃÇÒѾ֪µÀÈçºÎʹÓÃWebpackºÍGulp.jsÀ´¹¹½¨´úÂ룬¿ÉÊÇÈçºÎ²ÅÄÜÂú×ãÎÒÃǵĵÚÒ»¸öÐèÇ󡪡ªÊ¹ÓÃES6£¿ÎÒÃÇ¿ÉÒÔʹÓÃתÒëÆ÷£¬°ïÖúÎÒÃǽ«ES6´úÂëתÒëΪÖ÷Á÷ä¯ÀÀÆ÷Ö§³ÖµÄES5´úÂ롣ĿǰÁ÷ÐеÄתÒëÆ÷ÓУºTraceur¡¢Babel.js¡¢TypeScript£¨ÃãÇ¿ËãÊÇ£©£¬ÎÒÃǽ«Ñ¡ÓÃBabel.js£¬ËüÓÐÒ»¸ö¸üºÃµÄÉú̬ϵͳ£¨²å¼þ¡¢À©Õ¹µÈ£©¡£Èç¹ûÄãÉв»ÖªÏþÆäΪºÎÎÇë¼ÇסÕâÊÇÒ»¸ö·Ç³£°ôµÄÏîÄ¿£¬ÎÒÍÆ¼öÄãÔĶÁËüÃǵÄÎĵµ¡£×î°ôµÄÊÇ£¬Babel.js²»½öÖ§³ÖES6Óï·¨£¬Ëü»¹¿ÉÒÔ±àÒëJSX£¬ËùÒÔÎÒÃÇ¿ÉÒÔÔÚ±àÒë²½Öè³¹µ×ÆúÓñê×¼React JSX±àÒëÆ÷ÁË£¡
Èç¹ûÄãÖ»ÏëʹÓÃBabel.js£¬ÎÒÍÆ¼öÄãÔĶÁËüÃǵÄʹÓÃÎĵµ¡£Axel Rauschmayer²©Ê¿Ôø¾×«Ð´¡¶½ÌÄãʹÓÃBabel.js¡·Ò»ÎÄ£¬Ò²ÖµµÃÒ»¶Á£¬Èç¹ûÄã¶ÔJavaScript¸ÐÐËȤ£¬ÎÒÒ²¼«Á¦ÍƼö¶©ÔÄËûµÄ²©¿Í¡£
×Ô¸ø×Ô×ã
ÏÖÔÚÎÒÃÇÑ¡¶¨ÁËES6תÒëÆ÷£¬ÈÃÎÒÃÇÌÖÂÛÒ»ÏÂ×Ô¸ø×Ô×ãµÄÎÊÌâ¡£Èç¹ûÎÒÃÇ¿ª·¢´¿React×é¼þ¡ª¡ªÄÇô¿ÉÒÔÇáËɵØÈÃËüÃǶÀÁ¢¹¤×÷£¨¿ÉÖØÓã©£¬ÄãÉõÖÁ¿ÉÒԲο¼¹Ù·½Ö¸ÄÏѧϰ±àÂ뷽ʽ¡£µ«Èç¹ûÎÒÃÇÐèÒªÔÚ×é¼þÄÚÌṩĬÈϵÄ×ÔÉíÑùʽ£¬ÐèÒªÔõÑùʵÏÖÄØ£¿
µ±È»£¬ÎÒÃÇ¿ÉÒÔÑ¡Ôñ¡°´¿JS¡±·½·¨ÏòÎÒÃǵÄJSXÎļþ¼ÓÈëÄÚÁªÑùʽ£¬¾ÍÏñÕâÑù£º
const render = function() {
const defaultStyle = {
color: 'red',
};
return ( <div style={defaultStyle}>
I have inline styles </div>
);
}; |
JSXÄÚÁªÑùʽ
Õâ¸ö·½·¨´æÔÚÒ»¸öÎÊÌ⣬ÎÒÃǼ¸ºõÎÞ·¨Í¨¹ý¸¸Ó¦ÓÿØÖÆÕâ¸ö×é¼þµÄÑùʽ¡£¶øÇÒ£¬Èç¹ûÎÒÃÇÐèÒª¼ÓÔØÍ¼Æ¬»ò×Ô¶¨Òå×ÖÌåÎļþ£¬Õâ¸ö·½·¨¾Í»áʧЧ¡£ËùÒÔ£¬ÊÇ·ñÓиüºÃµÄ·½·¨ÄØ£¿
Webpack¿ÉÒÔ°ïÄã½â¾öÕâ¸öÎÊÌ⣡ÐÒÔ˵ÄÊÇ£¬Webpack ¼ÓÔØÆ÷¿ÉÒÔ¼ÓÔØÐí¶àÀàÐ͵ÄÎļþ¡£Æä±³ºóµÄ˼Ïë·Ç³£¼òµ¥¡ª¡ªÔÚ¼ÓÔØ¹ý³ÌÖж¯Ì¬µØ¶ÔÔØÈëÎļþ½øÐпɲå°Îת»»¡£´Ó±¾ÖÊÉÏÀ´Ëµ£¬¼ÓÔØÆ÷ΪÎÒÃÇ´¦Àí¸÷ÖÖÎļþ¡£ÎÒÃǽ«Ñ¡ÓÃÒ»¸öÌØÊâµÄbabel-loaderÀ´½«ÎÒÃǵÄES6´úÂëתÒëΪES5´úÂë¡£
µ«×î¿áµÄÊÇ£¬¼ÓÔØÆ÷¿ÉÒÔ´¦ÀíÈκÎÎļþ¡£ËùÒÔ£¬Èç¹ûÎÒÃÇÏë¼ÓÔØÑùʽ¡ª¡ªÎÒÃÇÖ»ÐèÒªÌí¼Óstyle-loader£¡×îÖÕ£¬ÎÒ¾ö¶¨Ê¹ÓÃLESS£¬ËüÉÔ΢¸´ÔÓһЩ¡ª¡ªÎÒ½«´´½¨ÈçϵļÓÔØÁ´£º
- Ê×ÏÈ£¬Ê¹ÓÃless-loader´¦Àí*.lessÎļþ£¬½«Æäת»»ÎªCSS£»
-
È»ºó£¬Ê¹ÓÃcss-loader½«±àÒëºÃµÄcss´«µÝ¸øÏÂÒ»¸ö²½Ö裻
-
×îºó£¬Ê¹ÓÃstyle-loader½«×îÖÕµÄÑùʽÒýÈëµ½Éú³ÉµÄ´úÂëÖС£
ͨ¹ýÕâ¸ö¼ÓÔØÁ´£¬ÎÒÃÇ¿ÉÒÔʹÓÃLESS±àд×é¼þµÄÑùʽ£¬ÏÂÃæÕâ¶Î´úÂëÑÝʾÁËÕâÖÖ×é¼þµÄÈë¿Úµã£º
import './style/style.less';
import Component from './src/component';
export default Component; |
½èÖúWebpack½«ÑùʽÒýÈëµ½JavaScriptÖÐ
ÕýÈçÄãËù¼û£¬¼ÓÔØÑùʽÏñµ¼ÈëÎļþÒ»Ñù¼òµ¥¡£µÄÈ·£¬ÓÉless-loader¡¢css-loaderÒÔ¼°style-loader¹¹³ÉµÄ¼ÓÔØÁ´±ØÐëÒªÔÚÎÒÃǵÄWebpackÅäÖÃÎļþÖÐÌáǰÅäÖú㨲ο¼ÏÂÒ»½ÚµÄµÚÒ»¸öʾÀý£©¡£
ÏÖÔÚÎÒÃÇ¿ÉÒÔ´ÓÏ໥¶ÀÁ¢µÄ×é¼þÖмÓÔØÑùʽ£¬µ«ÊÇCSSĬÈÏʹÓÃÈ«¾Ö±äÁ¿£¬ÕâÒâζ×ÅÈç¹ûÁ½¸ö×é¼þÖÐʹÓÃÁËÏàͬµÄÀàÃû£¬ÆäÖÐÒ»¸ö½«±»¸Äд£¬ÎÒÃÇÈçºÎ»Ø±ÜÕâ¸öÎÊÌâÄØ£¿
ÎÒÄÜÏë³öÀ´µÄ×î¼òµ¥µÄ·½·¨ÊÇ£ºÔÚHTML±êÇ©ºÍÑùʽÎļþÖУ¬Ê¹ÓÃ×é¼þÃû³Æ×÷Ϊ×îÍâ²ãÔªËØµÄÀàÃû£¬ÈËΪµØ´´½¨×é¼þµÄ×÷ÓÃÓò¡£¾ÍÏñÕâÑù£º
.component-name {
span {
color: red;
}
}
const render = function() {
return ( <div className="component-name"> <span>I have scoped styles</span> </div>
);
};
|
×é¼þÑùʽµÄÈËΪ×÷ÓÃÓò
Èç´ËÒ»À´£¬ËùÓÐ×é¼þ½«ÓµÓÐΨһÃüÃû£¬µ±ËûÃDZ»·â×°½øÍ¬Ò»¸öÓ¦ÓÃÖÐʱ²»ÔÙ²úÉú³åÍ»£¬Äܹ»ºÜºÃµØÐͬ¹¤×÷¡£¶øÇÒ£¬µ±ÎÒÃÇÏëÔÚÓ¦ÓòãÖØÐ¶¨Òå×é¼þÑùʽʱ£¬¿ÉÒÔʹÓÃ×é¼þÃüÃû×÷ΪÀàÃûÖ±½Ó¸Äд¡£
·¢²¼µ½NPM
½Ó×Å£¬ÄãÈçºÎ½«ES6Ä£¿é·¢²¼µ½NPMÉÏÄØ£¿ÊÂʵÉÏ£¬ÄãÎÞÐëÕâÑù×ö¡£ÖÁÉÙĿǰ»¹²»ÐèÒª¡£Äã¿ÉÒÔÖ±½ÓÏòÍâ·¢²¼ÄãµÄÔÉú´úÂ룬µ«Õâͨ³£ÊÇÒ»¸öÔã¸âµÄÏë·¨£¬µ±ÄãºóÐøÏ뽫´úÂëÒýÈëµ½Ö÷Ó¦ÓûòÆäËü×é¼þÖÐʱ»á¸Ðµ½·Ç³£Í´¿à¡£µ±È»£¬Äã¿ÉÒÔ֪ͨWebpack£¨Í¬ÑùÒ²¿ÉÒÔ֪ͨBrowserify£©À´±àÒëÐèÒªÓõ½µÄ´úÂë¡£µ«ÊÇ£¬Èç¹ûÕâÑù×ö£¬Äã²»µÃ²»Ê¹ÓÃWebpack£¨ÒÔ¼°ä¯ÀÀÆ÷£©À´ÔËÐи÷ÖÖ²âÊÔ£¬ÎÒͨ³£ÔÚÃüÁîÐÐÖÐÔËÐвâÊÔ£¬ÒòΪÕâÑùÔËÐÐËٶȸü¿ì£¬²¢ÇÒ±ãÓÚºóÐøµÄ×Ô¶¯»¯²âÊÔ·â×°£¨Ò²¾ÍÊÇÎÒÃdz£ËµµÄ³ÖÐø¼¯³É£©¡£
ĿǰÎÒÔÚÏîÄ¿ÖÐÓ¦ÓõÄ×îºÃ·½·¨ÊÇ¡ª¡ªÍ¬Ê±´«ËÍÔÉúES6´úÂëºÍ±àÒëºóµÄES5´úÂ룬ʵÏÖÕâ¸ö·½·¨·Ç³£¼òµ¥£º
- ÏòÄãµÄpackage.jsonÎļþÌí¼Ó¹¹½¨Ö¸Á
-
ÔÚÔ¤·¢²¼½×¶ÎÔËÐй¹½¨Ö¸Á
-
ʹÓñàÒëºóµÄES5´úÂë×÷ΪÖ÷Îļþ£»
-
ͨ¹ýpackage.jsonÎļþµÄ¶îÍâ×ֶα©Â¶ES6´úÂë¡£
Ëü¿´ÆðÀ´ÊÇÕâÑùµÄ£º
{ "name": "es6-component", "version": "1.0.0", "description": "My awesome ES6 component", "main": "es5/component.js", "es6": "index.js", "scripts": { "build": "gulp build", "prepublish": "npm run build"
}
} |
½«ES6Ä£¿é·¢²¼µ½NPMÉϵÄpackage.json
ÕâÖÖ·½·¨ÓÐÁ½¸öÓŵ㣺
- ÔÚËùÓÐES5´úÂëÖУ¬ÎÒÃÇ¿ÉÒÔÇáËɵØÒýÈë»òrequire()Õâ¸öÄ£¿é£¬ËüÄܹ»Õý³£¹¤×÷£¡
-
Èç¹ûÎÒÃdzöÓÚijЩÔÒòÐèÒªÓõ½Ä£¿éµÄÔ´´úÂ룬ÎÒÃÇͬÑù¿ÉÒÔÇáËɵØÍ¨ÖªWebpackʹÓá°ES6¡±×Ö¶ÎÀ´¼ÓÔØ»òÒýÈëES6´úÂë¡£
µ¥Ôª²âÊÔ¼°´úÂ븲¸ÇÂÊ
Äã±ØÐëÅå·þµÄÊÇ£¬ÔÚBabelÖÐÅäÖõ¥Ôª²âÊԺʹúÂ븲¸ÇÂʼì²â·Ç³£¼òµ¥£¨µÃÒæÓÚBabelΰ´óµÄÉú̬ϵͳ£¬ÕýÈçÎÒ֮ǰÌáµ½µÄÄÇÑù£©¡£
--compilers: jsx?:babel/register |
ÎÒһֱʹÓÃmocha×÷Ϊ²âÊÔ¹¤¾ß£¬ËùÒÔÎһὲ½âÈçºÎ½«ÆäÓ¦Óõ½ÏîÄ¿ÖС£Ö§³ÖES6´úÂë·Ç³£¼òµ¥£¬ÄãÖ»ÐèÔÚÖ´ÐÐmochaÖ¸ÁîʱÌí¼ÓÒ»¸ö±àÒëflag£¨»òÌí¼Óµ½mochaÅäÖÃÎļþ£©¾Í¿ÉÒÔ֪ͨmochaʹÓÃbabelÔ¤±àÒëÆ÷£º
Íê³ÉÕâÒ»²½Ö®ºó£¬¾Í¿ÉÒÔÔÚES6´úÂëÖÐÔËÐвâÊÔÁË£¬µ±È»ÄãÒ²¿ÉÒÔʹÓÃES6À´±àд²âÊÔÎļþ£¡
ÏÖÔÚÒª´¦Àí×ÊֵIJ¿·Ö¡ª¡ªÎÒÃÇÓÐÁËReact×é¼þ£¬ÎÒÃÇÏëʹÓÃmochaÍê³É²âÊÔ£¬È´ÓÖ²»ÏëÔÚä¯ÀÀÆ÷ÖÐÔËÐвâÊÔ£¨¿ÉÒÔÔËÐÐÒ»¸öPhantomJS£¬µ«ÊÇËü·Ç³£·±ÖØ£©£¬ÎÒÃÇÓ¦¸ÃÈçºÎÈ¥×öÄØ£¿
´ð°¸¾ÍÊÇjsdom¡ª¡ª»ùÓÚiojsÓÃJavaScriptʵÏÖÁËWHATWGµÄDOMºÍHTML±ê×¼¡£Ëü±ÈPhantom¸üÇáÁ¿£¬²¢ÇÒÂú×㼸ºõËùÓÐÎÒÃDzâÊÔReactËùÐèµÄ¹¦ÄÜ¡£
ÒÔÏÂÊÇΪReactÅäÖÃjsdom»·¾³µÄ²âÊÔhelperÎļþµÄʾÀý£º
import localStorage from 'localStorage';
import {jsdom} from 'jsdom';
// init jsdom
global.document = jsdom();
global.window = global.document.defaultView;
global.navigator = global.window.navigator;
// local storage polyfill
global.window.localStorage = localStorage;
global.localStorage = localStorage;
// import react after dom
const React = require('react/addons');
before(function() {
// expose react and testutils
this.React = React;
this.TestUtils = React.addons.TestUtils;
});
beforeEach(function() {
// create container
this.container = global.window.document.createElement('div');
});
afterEach(function(done) {
// clean jsdom
this.React.unmountComponentAtNode(this.container);
// timeout
setTimeout(done);
}); |
ÔÚÃüÁîÐÐÖÐÔËÐÐReact²âÊÔµÄjsdom»·¾³
×¢ÒâÎÒʹÓÃimportÉùÃ÷ÒýÈëjsdomºÍlocalStorage£¬µ«È´Ê¹ÓÃrequire()¼ÓÔØReact£¬ÕâÊÇÒòΪimportÉùÃ÷»á±»Ìáǰ£¬ÎÒÃÇÐèҪȷ±£ÔÚjsdom³õʼ»¯Ö®ºó¼ÓÔØReact¡£Èç¹ûÄã³¢ÊÔÔÚDOM¾ÍÐ÷ǰ¼ÓÔØReact£¬ÄÇôֱµ½ÄãÓë×é¼þ½øÐн»»¥Ê±Ëü²Å»á¿ªÊ¼¹¤×÷£¬È»ºóÄãµÃµ½µÄÍùÍùÊǸ÷ÖÖ¸÷ÑùµÄ´íÎó£¬ÒòΪReact¼ÙÉèÕâÊôÓÚ·Çä¯ÀÀÆ÷»·¾³£¬²»Ê¹ÓÃDOMÏà¹ØÌØÐÔ¡£
ÏÖÔÚÎÒÃÇÓÐÁËÕýÈ·ÔËÐеÄmocha²âÊÔ£¬ÎÒÃÇÒ²¿ÉÒÔÇáËÉ»ñÈ¡Istanbul¸²¸ÇÂʼì²â¹¤¾ß²¢Õý³£Ö´ÐУº
istanbul cover _mocha -- -R spec |
×é¼þ½»»¥
½ÓÏÂÀ´ÊµÏÖÎÒÃǵļӷÖÐèÇ󡪡ªÎÞÏ໥ÒÀÀµµÄ½»»¥¡£ÕâÒ»²¿·ÖÄÚÈÝÀ´×ÔÓÚÎÒÕý´ÓʵÄÒ»¸öÏîÄ¿£¬Èç¹ûÄ㲻̫¸ÐÐËȤ£¬´ó¿ÉÌø¹ýÕâÒ»½Ú¡£
µ±È»£¬Èç¹ûÄãÒÀÈ»¸ÐÐËȤ£¬ÄÇÈÃÎÒÃÇÒ»ÆðÌÖÂÛÒ»ÏÂʵÏÖÕâ¸öÄ¿±êµÄ·½·¨¡£
ÎÒÃÇÐèҪʹËÉñîºÏµÄϵͳÖи÷²¿·ÖÏ໥½»Á÷£¬ÔÚÍêÃÀµÄʵÏÖÖÐËüÃÇÉõÖÁÎÞÐëÖªµÀÏ໥µÄ´æÔÚ£¬Ö»ÐëÏìÓ¦ÇëÇó¡£ÕâÑùµÄÈÎÎñÌýÆðÀ´ÊÇ·ñ·Ç³£ÊìϤ£¿
Äã»òÐíÔø¾Ìý˵¹ý΢·þÎñÕâ¸ö¸ÅÄÄãÉõÖÁ¿ÉÄÜÒѾʹÓùýËüÃÇ¡£Èç¹ûÄã¶Ô΢·þÎñËùÖªÉõÉÙ£¬ÎÒÍÆ¼öÄã¿´Ò»ÏÂFred George¶ÔÓÚ΢·þÎñ¾«²ÊµÄ½²½â¡£
Èç¹ûÄãÀÁµÃ¿´£¨»òÕßÏëÉÔºó¿´£©ËûµÄÑݽ²£¬ÄÇô¼òµ¥Á˽âÒ»ÏÂ΢·þÎñµÄ˼Ï룺Ðí¶àС¹æÄ£¡¢¶ÀÁ¢µÄ£¬Í¨¹ýͨÓýӿÚÏ໥½»Á÷µÄÀëÉ¢·þÎñʵÌ塣ͨÓýӿڿÉÒÔÓжàÖÖÐÎʽ£¬ÆäÖаüÀ¨£ºÏûÏ¢×ÜÏß¡¢±íÕ÷״̬´«Ê䣨REST£¬ÓֳƱíÕ÷×´Ì¬×ªÒÆ£©¡¢Ô¶³Ì¹ý³Ìµ÷Óã¨RPC£©µÈ¡£
ÒòΪÎÒÃÇ×öµÄÊǿͻ§¶ËJavaScriptÓ¦Óã¬ÔÚ½Ó¿ÚÎÊÌâÉÏÎÒÃǵÄȷûÓÐÄÇô¶àµÄÑ¡Ôñ¡£ÐÒÔ˵ÄÊÇ£¬ÓÐÒ»¸ö·Ç³£Ô޵Ŀ⣬ËüרÃÅ´¦ÀíÀàËÆÕâÑùµÄÇé¿ö¡ª¡ªpostal.js¡£
¼´Ê¹ËüÈÔÈ»»ùÓڻص÷º¯ÊýʵÏֵײ㹦ÄÜ£¬µ«ÊÇËü½«ÏûÏ¢·ÖΪchannelºÍtopicÁ½À࣬ÌṩÁ˷dz£´óµÄµ¯ÐÔ¡£
ͨ¹ýʾÀýÑÝʾËùÓеÄÕâÒ»ÇÐÊÇÈçºÎ¹¤×÷µÄ£¬Ê®·ÖÈÝÒס£
ÏëÏóÒ»ÏÂÎÒÃÇÓÐÒ»¸öAppÐèҪһЩÈÏÖ¤ºÍURLÇ©Ãû¹¦ÄÜÀ´»ñÈ¡Êý¾Ý¡£Í¨¹ýpostalÎÒÃÇ¿ÉÒÔ¶¨ÒåÒ»¸öÈÏÖ¤channel£¬Ëü½«»á¼àÌýÄÇЩǩÃûÇëÇ󣬲¢Í¨¹ý²»Í¬µÄtopic·µ»ØÒÑÇ©ÃûµÄURL£¬¾ÍÏñÕâÑù£º
import postal from 'postal';
// get postal channel for current component
const channel = postal.channel("auth");
const signUrl = () => {
// signing code here
};
// listen to sign requests
const signAction = channel.subscribe("url.sign", function(url, envelope) {
const signedUrl = signUrl(url);
channel.publish("url.signed", signedUrl);
});
import postal from 'postal';
// get postal channels
const channel = postal.channel("query");
const authChannel = postal.channel("auth");
// define data fetching stuff
const requestUrl = 'http://...';
const getData = () => {
// data-fetching logic here
};
// listen for data requests
const allItemsAction = channel.subscribe("items.all", () => {
// wait for signed url
authChannel.subscribe("url.signed", (signedUrl) => {
const data = getData(signedUrl);
channel.publish("items.data", data);
});
authChannel.publish("url.sign", requestUrl);
}); |
ÔÚ×é¼þÖÐʹÓÃpostal.jsµÄchannels½øÐÐͨÐÅ
Õâ¶Î´úÂë¿ÉÒԺܺõع¤×÷£¬ÒòΪÎÒÃÇÎÞÐëÁ˽âÈκÎÓÐ¹ØÆäËü×é¼þµÄÐÅÏ¢¡ª¡ªÎÒÃÇÖ»ÐëÁ˽âʹÓÃÄĸöchannelºÍtopic¡£Ò»·½Ã棬ÕâÒâζ׏ÜÀíÕâЩÄÚÈݵĸºµ£Âäµ½¿ª·¢ÕßÉíÉÏ£»ÁíÒ»·½Ã棬ÔÚÕâÖÖʵÏֵĻù´¡ÉÏ£¬ÎÒÃÇ¿ÉÒÔÇáËɵظü»»ÈÏÖ¤×é¼þ¡ª¡ª½ñÌìÎÒÃÇʹÓÃOAuth£¬Ã÷ÌìÎÒÃÇʹÓÃ×Ô¶¨Òåtokenϵͳ£¬ÒÔºóʹÓÃÆäËü¹¦ÄÜ£¬ÎÒÃÇÖ»Ðë¸ü»»Ò»ÏÂÈÏÖ¤×é¼þ¾Í¿ÉÒÔÖ§³ÖÐµĹ¤×÷Á÷¡£
´úÂë¼ì²éºÍÔ´ÂëÓ³É䣨Source Map£©
×îºó£¬ÎÒÃÇÔÙΪÏîÄ¿¼ÓÈëһЩС¸Ä½ø£ºÖ§³Ö´úÂë¼ì²é£¬ÆôÓÃÔ´ÂëÓ³Éä¡£
jshint²»Ö§³ÖES6ºÍReact´úÂ룬ÎÒÃǽ«Ê¹ÓÃeslint´úÌæËü¡£eslintÖ§³ÖJavaScriptºÍJSXµÄÓï·¨£¬²¢¿ÉÒÔͨ¹ý²å¼þ½øÐÐÀ©Õ¹¡£
½«Ö®ÓÚWebpack½áºÏ·Ç³£ÈÝÒ×£¬ÄãÖ»ÐëÔÚÄãµÄWebpackÅäÖÃÎļþÖÐÌí¼Ó¼¸ÐдúÂë¡£ÏÂÃæÕâ¸ö´úÂëÆ¬¶ÎչʾÁËËùÐèµÄÅäÖãº
var path = require('path');
module.exports = {
devtool: 'inline-source-map',
debug: true,
// your other props here
// ...
module: {
preLoaders: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'eslint-loader'
},
]
// other modules options here
}
}; |
×¢Òânode_modulesÎļþ¼Ð²»°üÀ¨ÔÚ¼ì²éµÄ·¶Î§ÄÚ£¬ËùÒÔ³ÌÐòÖ»»á¼ì²éÄãʵ¼ÊµÄ×é¼þ´úÂë¡£
Webpack½«ÔÚ±àÒë¹ý³Ì½áÊøºó°ÑËùÓеļì²é½á¹ûÊä³öµ½¿ØÖÆÌ¨¡£
Turris.js¡ª¡ª»ã×ÜÒ»ÇÐ
½áºÏÒÔÉÏÌá¼°µÄËùÓÐÄÚÈÝ£¬ÎÒ´´ÔìÁËTurris.js¡ª¡ªËü°üº¬Ò»ÏµÁÐhelper°ü£¬»¹ÓÐÒ»¸öyeomanÉú³ÉÆ÷£¬Äã¿ÉÒÔÓÃËüÇáËɵØÎªES6 ReactÓ¦ÓúͶÀÁ¢×é¼þ´î½¨½ÅÊּܡ£
Èç¹ûÄã¶ÔÉú³ÉÆ÷²»¸ÐÐËȤ£¬Ö»Ïë¿´¿´Ó¦ÓúͶÀÁ¢×é¼þµÄʾÀý´úÂ룬Äã¿ÉÒÔÔÚËüÃǸ÷×ÔµÄGithub²Ö¿âÖÐÕÒµ½ËüÃÇ£ºturris-example-application»¹ÓÐturris-example-component¡£
´´½¨ÐÂÓ¦ÓÃ
ÎÒ³¢ÊÔʹ´´½¨ÐÂÓ¦Óþ¡¿ÉÄܵؼòµ¥£¬Äã¿ÉÒÔÕâÑù´´½¨Ò»¸öÐÂÓ¦Óãº
- È·±£ÄãÒѰ²×°×îеÄio.jsºÍNPM£»
-
´ÓNPM°²×°yeomanºÍturris-generator£º
npm install -g yo generator-turris |
-
´´½¨Ò»¸öÐÂÎļþ¼Ð´æ·ÅÄãµÄApp£¬½øÈëÕâ¸öÎļþ¼Ð£¬Ö´ÐÐturrisÉú³ÉÆ÷£º

- ÔڻشðһϵÁÐÎÊÌâºó£¬yeoman½«ÎªÄãÍê³ÉËùÓй¤×÷£»
-
Ö´ÐС°npm start¡±£¬Æô¶¯ÄãµÄÐÂApp£»
-
·ÃÎÊhttp://localhost:8080£¬´ò¿ªÄã×îϲ»¶µÄ±à¼Æ÷²¢½«Ó¦ÓøÄΪÄãϲ»¶µÄÑù×Ó¡£
³ýÁËΪ»ù´¡Ó¦Óô½ÅÊÖ¼ÜÍ⣬TurrisÉú³ÉÆ÷»¹ÌṩÁËÈý¸öhelperÉú³ÉÆ÷£º
- ×é¼þÉú³ÉÆ÷¡ª¡ª½«ÔÚÄãµÄAppÖÐÉú³ÉÒ»¸öеÄ×é¼þ£¬¿ÉÒԷdz£±ã½ÝµØÉú³ÉÄ㽫²»»áÖØÓõÄС×é¼þ£»
-
Ò³ÃæÉú³ÉÆ÷¡ª¡ª½«Éú³ÉÒ»¸öÐÂÒ³Ãæ²¢½«Ëü²åÈëµ½React·ÓÉÖУ¬ÕâÀïûÓÐÊ²Ã´ÆæÃîÖ®´¦£¬ËüÖ»ÊÇÒ»¸ö°ïÖúÄã½Úʡʱ¼äµÄ×ÓÉú³ÉÆ÷£»
-
DockerÉú³ÉÆ÷¡ª¡ª½«Éú³ÉÒ»¸ödockfile£¬ÆäÖаüº¬ËùÓÐÔËÐÐAppËùÐèµÄÎļþ¡£
¸ü¶àÓйØÊ¹Ó÷½·¨¡¢×ÓÉú³ÉÆ÷¡¢ÏîÄ¿½á¹¹ÒÔ¼°ÆäËüÄÚÈÝÐÅÏ¢£¬¿ÉÒÔÔÚÏîÄ¿²Ö¿âµÄReadmeÎļþÖÐÕÒµ½¡£
´´½¨Ò»¸ö¶ÀÁ¢×é¼þ
´´½¨Ò»¸ö×é¼þ²¢²»ÄÑ£¬Äã¿ÉÒÔÕâÑù×ö£¨ÐèÇóÓëÖ÷Éú³ÉÆ÷Ïàͬ£©£º
- ͨ¹ýNPM°²×°turris-generator-component£º
-
ΪÄãµÄ×é¼þ´´½¨Ò»¸öÐÂÎļþ¼Ð£¬½øÈëÕâ¸öÎļþ¼Ð£¬Ö´ÐÐturris×é¼þÉú³ÉÆ÷£º

- ÔڻشðһϵÁÐÎÊÌâºó£¬yeoman½«ÎªÄãÍê³ÉËùÓй¤×÷£»
-
Ö´ÐС°npm start¡±£¬ÔÚµ÷ÊÔģʽÏÂÆô¶¯ÄãµÄ×é¼þ£»
-
·ÃÎÊhttp://localhost:8080£¬´ò¿ªÄã×îϲ»¶µÄ±à¼Æ÷²¢½«Ó¦ÓøÄΪÄãϲ»¶µÄÑù×Ó¡£
¸ü¶àÓйØÊ¹Ó÷½·¨¡¢ÏîÄ¿½á¹¹ÒÔ¼°ÆäËüÄÚÈÝÐÅÏ¢£¬¿ÉÒÔÔÚÏîÄ¿²Ö¿âµÄReadmeÎļþÖÐÕÒµ½¡£
½áÊøÓï
Ï£ÍûÄãÒÑÔÚÕâÆªÎÄÕÂÖÐÕÒµ½ÓÐÓõÄÄÚÈÝ£¬»òÐíÄãÉõÖÁÒѳ¢ÊÔÎÒ±àдµÄÉú³ÉÆ÷¡£¼´Ê¹ÄãûÓÐÕâÑù×ö¡ª¡ªÒ²Çë°ïÖúÎÒÐû´«Ò»Ï£¡Èç¹ûÄãÒѾ³¢ÊÔ¹ý¡ª¡ªÎҷdz£ÀÖÒâÌýÈ¡Èκη´À¡Òâ¼û£¬´¦ÀíÄãÃÇ¿ÉÄÜÓöµ½µÄÎÊÌâ¡£µ±È»£¬Ò²ºÜ»¶Ó´ó¼ÒÌá½»Pull Requests¡££¨ÒëÕߣºÁõÕñÌΣ¬ÉóУ£º³ÂÇï¸è£©
¹ØÓÚ×÷ÕߣºTim Ermilov£¬´ÓÊÂÒÆ¶¯ºÍWeb¿ª·¢¹¤×÷¡£ |