ÉÏһƪÎÒÃǶÔReactÓÐÁËÒ»¸ö×ÜÌåµÄÈÏʶ£¬ÔÚ½éÉÜÆäÖеļ¼Êõϸ½Ú֮ǰ£¬ÎÒÃÇÊ×ÏÈÀ´Á˽âÒ»ÏÂÓÃÓÚReact¿ª·¢ºÍÄ£¿é¹ÜÀíµÄÖ÷Á÷¹¤¾ßWebpack¡£³ÆÖ®ÎªReact¿ª·¢ÉñÆ÷Óеã±êÌâµ³ÁË£¬²»¹ýWebpackȷʵÊDZÊÕß¼û¹ýµÄ¹¦ÄÜ×îΪǿ´óµÄǰ¶ËÄ£¿é¹ÜÀíºÍ´ò°ü¹¤¾ß¡£ËäÈ»WebpackÊÇÒ»¸öͨÓõŤ¾ß£¬²¢²»Ö»ÊʺÏÓÚReact£¬µ«ÊǺܶàReactµÄÎÄÕ»òÕßÏîÄ¿¶¼Ê¹ÓÃÁËWebpack£¬ÓÈÆäÊÇreact-hot-loaderÕâÑùµÄÉñÆ÷´æÔÚ£¬ÈÃWebpack³ÉΪ×îÖ÷Á÷µÄReact¿ª·¢¹¤¾ß¡£
CommonJSºÍAMDÊÇÓÃÓÚJavaScriptÄ£¿é¹ÜÀíµÄÁ½´ó¹æ·¶£¬Ç°Õß¶¨ÒåµÄÊÇÄ£¿éµÄͬ²½¼ÓÔØ£¬Ö÷ÒªÓÃÓÚNodeJS£»¶øºóÕßÔòÊÇÒì²½¼ÓÔØ£¬Í¨¹ýrequirejsµÈ¹¤¾ßÊÊÓÃÓÚǰ¶Ë¡£Ëæ×Ånpm³ÉΪÖ÷Á÷µÄJavaScript×é¼þ·¢²¼Æ½Ì¨£¬Ô½À´Ô½¶àµÄǰ¶ËÏîĿҲÒÀÀµÓÚnpmÉϵÄÏîÄ¿£¬»òÕß×ÔÉí¾Í»á·¢²¼µ½npmƽ̨¡£Òò´Ë£¬ÈÃǰ¶ËÏîÄ¿¸ü·½±ãµÄʹÓÃnpmÉϵÄ×ÊÔ´³ÉΪһ´óÐèÇó¡£ÓÚÊǵ®ÉúÁËÀàËÆbrowserifyÕâÑùµÄ¹¤¾ß£¬´úÂëÖпÉÒÔʹÓÃrequireº¯ÊýÖ±½ÓÒÔͬ²½Óï·¨ÐÎʽÒýÈënpmÄ£¿é£¬´ò°üºóÔÙÓÉä¯ÀÀÆ÷Ö´ÐС£
WebpackÆäʵÓеãÀàËÆbrowserify£¬³ö×ÔFacebookµÄInstagramÍŶӣ¬µ«¹¦ÄܱÈbrowserify¸üΪǿ´ó¡£ÆäÖ÷ÒªÌØÐÔÈçÏ£º
ͬʱ֧³ÖCommonJSºÍAMDÄ£¿é£¨¶ÔÓÚÐÂÏîÄ¿£¬ÍƼöÖ±½ÓʹÓÃCommonJS£©£»
´®ÁªÊ½Ä£¿é¼ÓÔØÆ÷ÒÔ¼°²å¼þ»úÖÆ£¬ÈÃÆä¾ßÓиüºÃµÄÁé»îÐÔºÍÀ©Õ¹ÐÔ£¬ÀýÈçÌṩ¶ÔCoffeeScript¡¢ES6µÄÖ§³Ö£»
¿ÉÒÔ»ùÓÚÅäÖûòÕßÖÇÄÜ·ÖÎö´ò°ü³É¶à¸öÎļþ£¬ÊµÏÖ¹«¹²Ä£¿é»òÕß°´Ðè¼ÓÔØ£»
Ö§³Ö¶ÔCSS£¬Í¼Æ¬µÈ×ÊÔ´½øÐдò°ü£¬´Ó¶øÎÞÐè½èÖúGrunt»òGulp£»
¿ª·¢Ê±ÔÚÄÚ´æÖÐÍê³É´ò°ü£¬ÐÔÄܸü¿ì£¬ÍêÈ«¿ÉÒÔÖ§³Ö¿ª·¢¹ý³ÌµÄʵʱ´ò°üÐèÇó£»
¶ÔsourcemapÓкܺõÄÖ§³Ö£¬Ò×ÓÚµ÷ÊÔ¡£
Webpack½«ÏîÄ¿ÖÐÓõ½µÄÒ»Çо²Ì¬×ÊÔ´¶¼ÊÓ֮Ϊģ¿é£¬Ä£¿éÖ®¼ä¿ÉÒÔ»¥ÏàÒÀÀµ¡£Webpack¶ÔËüÃǽøÐÐͳһµÄ¹ÜÀíÒÔ¼°´ò°ü·¢²¼£¬Æä¹Ù·½Ö÷Ò³ÓÃÏÂÃæÕâÕÅͼÀ´ËµÃ÷WebpackµÄ×÷Óãº

¿ÉÒÔ¿´µ½WebpackµÄÄ¿±ê¾ÍÊǶÔÏîÄ¿Öеľ²Ì¬×ÊÔ´½øÐÐͳһ¹ÜÀí£¬Îª²úÆ·µÄ×îÖÕ·¢²¼Ìṩ×îÓŵĴò°ü²¿Êð·½°¸¡£±¾Îľͽ«Î§ÈÆReact¶ÔÆäÏà¹ØÓ÷¨×öÒ»¸ö×ÜÌå½éÉÜ£¬´Ó¶øÄÜÈÃÄ㽫ÆäÓ¦ÓÃÔÚ×Ô¼ºµÄʵ¼ÊÏîĿ֮ÖС£
°²×°Webpack£¬²¢¼ÓÔØÒ»¸ö¼òµ¥µÄReact×é¼þWebpackÒ»°ã×÷Ϊȫ¾ÖµÄnpmÄ£¿é°²×°£º
Ö®ºó±ãÓÐÁËÈ«¾ÖµÄwebpackÃüÁֱ½ÓÖ´ÐдËÃüÁî»áĬÈÏʹÓõ±Ç°Ä¿Â¼µÄwebpack.config.js×÷ΪÅäÖÃÎļþ¡£Èç¹ûÒªÖ¸¶¨ÁíÍâµÄÅäÖÃÎļþ£¬¿ÉÒÔÖ´ÐУº
webpack ¡ªconfig webpack.custom.config.js |
¾¡¹ÜWebpack¿ÉÒÔͨ¹ýÃüÁîÐÐÀ´Ö¸¶¨²ÎÊý£¬µ«ÎÒÃÇͨ³£»á½«ËùÓÐÏà¹Ø²ÎÊý¶¨ÒåÔÚÅäÖÃÎļþÖС£Ò»°ãÎÒÃǻᶨÒåÁ½¸öÅäÖÃÎļþ£¬Ò»¸öÓÃÓÚ¿ª·¢Ê±£¬ÁíÍâÒ»¸öÓÃÓÚ²úÆ··¢²¼¡£Éú²ú»·¾³ÏµĴò°üÎļþ²»ÐèÒª°üº¬sourcemapµÈÓÃÓÚ¿ª·¢Ê±µÄ´úÂë¡£ÅäÖÃÎļþͨ³£·ÅÔÚÏîÄ¿¸ùĿ¼֮Ï£¬Æä±¾ÉíÒ²ÊÇÒ»¸ö±ê×¼µÄCommonJSÄ£¿é¡£
Ò»¸ö×î¼òµ¥µÄWebpackÅäÖÃÎļþwebpack.config.jsÈçÏÂËùʾ£º
module.exports = { entry:[ './app/main.js' ], output: { path: __dirname + '/assets/', publicPath: "/assets/", filename: 'bundle.js' } }; |
ÆäÖÐentry²ÎÊý¶¨ÒåÁË´ò°üºóµÄÈë¿ÚÎļþ£¬Êý×éÖеÄËùÓÐÎļþ»á°´Ë³Ðò´ò°ü¡£Ã¿¸öÎļþ½øÐÐÒÀÀµµÄµÝ¹é²éÕÒ£¬Ö±µ½ËùÓÐÏà¹ØÄ£¿é¶¼±»´ò°ü¡£output²ÎÊý¶¨ÒåÁËÊä³öÎļþµÄλÖã¬ÆäÖг£ÓõIJÎÊý°üÀ¨£º
path: ´ò°üÎļþ´æ·ÅµÄ¾ø¶Ô·¾¶
publicPath: ÍøÕ¾ÔËÐÐʱµÄ·ÃÎÊ·¾¶
filename: ´ò°üºóµÄÎļþÃû
ÏÖÔÚÀ´¿´ÈçºÎ´ò°üÒ»¸öReact×é¼þ¡£¼ÙÉèÓÐÈçÏÂÏîÄ¿Îļþ¼Ð½á¹¹£º
- react-sample + assets/ - js/ Hello.js entry.js index.html webpack.config.js |
ÆäÖÐHello.js¶¨ÒåÁËÒ»¸ö¼òµ¥µÄReact×é¼þ£¬Ê¹ÓÃES6Óï·¨£º
var React = require('react'); class Hello extends React.Component { render() { return ( <h1>Hello {this.props.name}!</h1> ); } } |
entry.jsÊÇÈë¿ÚÎļþ£¬½«Ò»¸öHello×é¼þÊä³öµ½½çÃæ£º
var React = require('react'); var Hello = require('./Hello'); React.render(<Hello name="Nate" />, document.body); |
index.htmlµÄÄÚÈÝÈçÏ£º
<html> <head></head> <body> <script src="/assets/bundle.js"></script> </body> </html> |
ÔÚÕâÀïHello.jsºÍentry.js¶¼ÊÇJSX×é¼þÓï·¨£¬ÐèÒª¶ÔËüÃǽøÐÐÔ¤´¦Àí£¬Õâ¾ÍÒªÒýÈëwebpackµÄJSX¼ÓÔØÆ÷¡£Òò´ËÔÚÅäÖÃÎļþÖмÓÈëÈçÏÂÅäÖãº
module: { loaders: [ { test: /\.jsx?$/, loaders: ['jsx?harmony']} ] } |
¼ÓÔØÆ÷µÄ¸ÅÄîÉÔºó»¹»áÏêϸ½éÉÜ£¬ÕâÀïÖ»ÐèÒªÖªµÀËüÄܽ«JSX±àÒë³ÉJavaScript²¢¼ÓÔØÎªWebpackÄ£¿é¡£ÕâÑùÔÚµ±Ç°Ä¿Â¼Ö´ÐÐwebpackÃüÁîÖ®ºó£¬ÔÚassetsĿ¼½«Éú³Ébundle.js£¬´ò°üÁËentry.jsµÄÄÚÈÝ¡£µ±ä¯ÀÀÆ÷´ò¿ªµ±Ç°·þÎñÆ÷ÉϵÄindex.html£¬½«ÏÔʾ¡°Hello
Nate!¡±¡£ÕâÊÇÒ»¸ö·Ç³£¼òµ¥µÄÀý×Ó£¬ÑÝʾÁËÈçºÎʹÓÃWebpackÀ´½øÐÐ×î¼òµ¥µÄReact×é¼þ´ò°ü¡£
¼ÓÔØAMD»òCommonJSÄ£¿éÔÚʵ¼ÊÏîÄ¿ÖУ¬´úÂëÒÔÄ£¿é½øÐÐ×éÖ¯£¬AMDÊÇÔÚCommonJSµÄ»ù´¡ÉÏ¿¼ÂÇÁËä¯ÀÀÆ÷µÄÒì²½¼ÓÔØÌØÐÔ¶ø²úÉúµÄ£¬¿ÉÒÔÈÃÄ£¿éÒì²½¼ÓÔØ²¢±£Ö¤Ö´ÐÐ˳Ðò¡£¶øCommonJSµÄrequireº¯ÊýÔòÊÇͬ²½¼ÓÔØ¡£ÔÚWebpackÖбÊÕ߸ü¼ÓÍÆ¼öCommonJS·½Ê½È¥¼ÓÔØÄ£¿é£¬ÕâÖÖ·½Ê½Óï·¨¸ü¼Ó¼ò½àÖ±¹Û¡£¼´Ê¹ÔÚ¿ª·¢Ê±£¬ÎÒÃÇÒ²ÊǼÓÔØWebpack´ò°üºóµÄÎļþ£¬Í¨¹ýsourcemapÈ¥½øÐе÷ÊÔ¡£
³ýÁËÏîÄ¿±¾ÉíµÄÄ£¿é£¬ÎÒÃÇÒ²ÐèÒªÒÀÀµµÚÈý·½µÄÄ£¿é£¬ÏÖÔڱȽϳ£ÓõĵÚÈý·½Ä£¿é»ù±¾¶¼Í¨¹ýnpm½øÐз¢²¼£¬Ê¹ÓÃËüÃÇÒѾÎÞÐèµ¥¶ÀÏÂÔØ¹ÜÀí£¬ÐèҪʱִÐÐnpm
install¼´¿É¡£ÀýÈ磬ÎÒÃÇÐèÒªÒÀÀµjQuery£¬Ö»ÐèÖ´ÐУº
npm install jquery ¡ªsave-dev |
¸ü¶àÇé¿öÏÂÎÒÃÇÊÇÔÚÏîÄ¿µÄpackage.jsonÖнøÐÐÒÀÀµ¹ÜÀí£¬È»ºóͨ¹ýÖ±½ÓÖ´ÐÐnpm
installÀ´°²×°ËùÓÐÒÀÀµ¡£ÕâÑùÔÚÏîÄ¿µÄ´úÂë²Ö¿âÖв¢²»ÐèÒª´æ´¢Êµ¼ÊµÄµÚÈý·½ÒÀÀµ¿âµÄ´úÂë¡£
°²×°Ö®ºó£¬ÔÚÐèҪʹÓÃjqueryµÄÄ£¿éÖÐÐèÒªÔÚÍ·²¿½øÐÐÒýÈ룺
var $ = require('jquery'); $('body').html('Hello Webpack!'); |
¿ÉÒÔ¿´µ½£¬ÕâÖÖÒÔCommonJSµÄͬ²½ÐÎʽȥÒýÈëÆäËüÄ£¿éµÄ·½Ê½´úÂë¸ü¼Ó¼ò½à¡£ä¯ÀÀÆ÷²¢²»»áʵ¼ÊµÄȥͬ²½¼ÓÔØÕâ¸öÄ£¿é£¬requireµÄ´¦ÀíÊÇÓÉWebpack½øÐнâÎöºÍ´ò°üµÄ£¬ä¯ÀÀÆ÷Ö»ÐèÒªÖ´Ðдò°üºóµÄ´úÂë¡£Webpack×ÔÉíÒѾ¿ÉÒÔÍêÈ«´¦ÀíJavaScriptÄ£¿éµÄ¼ÓÔØ£¬µ«ÊǶÔÓÚReactÖеÄJSXÓï·¨£¬Õâ¾ÍÐèҪʹÓÃWebpackµÄÀ©Õ¹¼ÓÔØÆ÷À´´¦ÀíÁË¡£
Webpack¿ª·¢·þÎñÆ÷³ýÁËÌṩģ¿é´ò°ü¹¦ÄÜ£¬Webpack»¹ÌṩÁËÒ»¸ö»ùÓÚNode.js
Express¿ò¼ÜµÄ¿ª·¢·þÎñÆ÷£¬ËüÊÇÒ»¸ö¾²Ì¬×ÊÔ´Web·þÎñÆ÷£¬¶ÔÓÚ¼òµ¥¾²Ì¬Ò³Ãæ»òÕß½öÒÀÀµÓÚ¶ÀÁ¢·þÎñµÄǰ¶ËÒ³Ãæ£¬¶¼¿ÉÒÔÖ±½ÓʹÓÃÕâ¸ö¿ª·¢·þÎñÆ÷½øÐпª·¢¡£ÔÚ¿ª·¢¹ý³ÌÖУ¬¿ª·¢·þÎñÆ÷»á¼àÌýÿһ¸öÎļþµÄ±ä»¯£¬½øÐÐʵʱ´ò°ü£¬²¢ÇÒ¿ÉÒÔÍÆËÍ֪ͨǰ¶ËÒ³Ãæ´úÂë·¢ÉúÁ˱仯£¬´Ó¶ø¿ÉÒÔʵÏÖÒ³ÃæµÄ×Ô¶¯Ë¢Ð¡£
Webpack¿ª·¢·þÎñÆ÷ÐèÒªµ¥¶À°²×°£¬Í¬ÑùÊÇͨ¹ýnpm½øÐУº
npm install -g webpack-dev-server |
Ö®ºó±ã¿ÉÒÔÔËÐÐwebpack-dev-serverÃüÁîÀ´Æô¶¯¿ª·¢·þÎñÆ÷£¬È»ºóͨ¹ýlocalhost:8080/webpack-dev-server/·ÃÎʵ½Ò³ÃæÁË¡£Ä¬ÈÏÇé¿öÏ·þÎñÆ÷ÒÔµ±Ç°Ä¿Â¼×÷Ϊ·þÎñÆ÷Ŀ¼¡£ÔÚReact¿ª·¢ÖУ¬ÎÒÃÇͨ³£»á½áºÏreact-hot-loaderÀ´Ê¹Óÿª·¢·þÎñÆ÷£¬Òò´ËÕâÀï²»×öÌ«¶à½éÉÜ£¬Ö»ÐèÒªÖªµÀÓÐÕâÑùÒ»¸ö¿ª·¢·þÎñÆ÷¿ÉÒÔÓÃÓÚ¿ª·¢Ê±µÄÄÚÈÝʵʱ´ò°üºÍÍÆËÍ¡£ÏêϸÅäÖúÍÓ÷¨¿ÉÒԲο¼¹Ù·½Îĵµ¡£
WebpackÄ£¿é¼ÓÔØÆ÷£¨Loaders£©Webpack½«ËùÓо²Ì¬×ÊÔ´¶¼ÈÏΪÊÇÄ£¿é£¬±ÈÈçJavaScript£¬CSS£¬LESS£¬TypeScript£¬JSX£¬CoffeeScript£¬Í¼Æ¬µÈµÈ£¬´Ó¶ø¿ÉÒÔ¶ÔÆä½øÐÐͳһ¹ÜÀí¡£Îª´ËWebpackÒýÈëÁ˼ÓÔØÆ÷µÄ¸ÅÄ³ýÁË´¿JavaScriptÖ®Í⣬ÿһÖÖ×ÊÔ´¶¼¿ÉÒÔͨ¹ý¶ÔÓ¦µÄ¼ÓÔØÆ÷´¦Àí³ÉÄ£¿é¡£ºÍ´ó¶àÊý°ü¹ÜÀíÆ÷²»Ò»ÑùµÄÊÇ£¬WebpackµÄ¼ÓÔØÆ÷Ö®¼ä¿ÉÒÔ½øÐд®Áª£¬Ò»¸ö¼ÓÔØÆ÷µÄÊä³ö¿ÉÒÔ³ÉΪÁíÒ»¸ö¼ÓÔØÆ÷µÄÊäÈë¡£±ÈÈçLESSÎļþÏÈͨ¹ýless-load´¦Àí³Écss£¬È»ºóÔÙͨ¹ýcss-loader¼ÓÔØ³ÉcssÄ£¿é£¬×îºóÓÉstyle-loader¼ÓÔØÆ÷¶ÔÆä×ö×îºóµÄ´¦Àí£¬´Ó¶øÔËÐÐʱ¿ÉÒÔͨ¹ýstyle±êÇ©½«ÆäÓ¦Óõ½×îÖÕµÄä¯ÀÀÆ÷»·¾³¡£
¶ÔÓÚReactµÄJSXÒ²ÊÇÈç´Ë£¬Ëüͨ¹ýjsx-loaderÀ´ÔØÈë¡£jsx-loaderרÃÅÓÃÓÚÔØÈëReactµÄJSXÎļþ£¬WebpackµÄ¼ÓÔØÆ÷Ö§³Ö²ÎÊý£¬jsx-loader¾Í¿ÉÒÔÌí¼Ó?harmony²ÎÊýʹÆäÖ§³ÖES6Óï·¨¡£ÎªÁËÈÃWebpackʶ±ðʲôÑùµÄ×ÊÔ´Ó¦¸ÃÓÃʲô¼ÓÔØÆ÷È¥ÔØÈ룬ÐèÒªÔÚÅäÖÃÎļþ½øÐÐÅäÖãºÍ¨¹ýÕýÔò±í´ïʽ¶ÔÎļþÃû½øÐÐÆ¥Åä¡£ÀýÈ磺
module: { preLoaders: [{ test: /\.js$/, exclude: /node_modules/, loader: 'jsxhint' }], loaders: [{ test: /\.js$/, exclude: /node_modules/, loader: 'react-hot!jsx-loader?harmony' }, { test: /\.less/, loader: 'style-loader!css-loader!less-loader' }, { test: /\.(css)$/, loader: 'style-loader!css-loader' }, { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192' }] } |
¿ÉÒÔ¿´µ½£¬¸ÃʹÓÃʲô¼ÓÔØÆ÷Íêȫȡ¾öÓÚÕâÀïµÄÅäÖ㬼´Ê¹¶ÔÓÚJSXÎļþ£¬ÎÒÃÇÒ²¿ÉÒÔÓÃjs×÷Ϊºó׺£¬´Ó¶øËùÓеÄJavaScript¶¼¿ÉÒÔͨ¹ýjsx-loaderÔØÈ룬ÒòΪjsx±¾Éí¾ÍÊÇÍêÈ«¼æÈÝJavaScriptµÄ£¬ËùÒÔ¼´Ê¹Ã»ÓÐJSXÓï·¨£¬ÆÕͨJavaScriptÄ£¿éÒ²¿ÉÒÔʹÓÃjsx-loaderÀ´ÔØÈë¡£
¼ÓÔØÆ÷Ö®¼äµÄ¼¶ÁªÊÇͨ¹ý¸Ð̾ºÅÀ´Á¬½Ó£¬ÀýÈç¶ÔÓÚLESS×ÊÔ´£¬Ð´·¨Îªstyle-loader!css-loader!less-loader¡£¶ÔÓÚСÐ͵ÄͼƬ×ÊÔ´£¬Ò²¿ÉÒÔ½«Æä½øÐÐͳһ´ò°ü£¬ÓÉurl-loaderʵÏÖ£¬´úÂëÖÐurl-loader?limit=8192º¬Òå¾ÍÊǶÔÓÚËùÓÐСÓÚ8192×Ö½ÚµÄͼƬ×ÊÔ´Ò²½øÐдò°ü¡£ÕâÔÚÒ»¶¨³Ì¶ÈÉÏ¿ÉÒÔÌæ´úCss
Sprites·½°¸£¬ÓÃÓÚ¼õÉÙ¶ÔÓÚСͼƬ×ÊÔ´µÄHTTPÇëÇóÊýÁ¿¡£
³ýÁËÒÑÓмÓÔØÆ÷£¬ÄãÒ²¿ÉÒÔ×Ô¼ºÊµÏÖ×Ô¼ºµÄ¼ÓÔØÆ÷£¬´Ó¶ø¿ÉÒÔÈÃWebpackͳһ¹ÜÀíÏîÄ¿ÌØ¶¨µÄ¾²Ì¬×ÊÔ´¡£ÏÖÔÚÒ²ÒѾÓкܶàµÚÈý·½µÄ¼ÓÔØÆ÷ʵÏÖ³£¼û¾²Ì¬×ÊÔ´µÄ´ò°ü¹ÜÀí£¬¿ÉÒԲο¼WebpackÖ÷Ò³ÉϵļÓÔØÆ÷ÁÐ±í¡£
React¿ª·¢ÉñÆ÷£ºreact-hot-loaderWebpack±¾Éí¾ßÓÐÔËÐÐʱģ¿éÌæ»»¹¦ÄÜ£¬³ÆÖ®ÎªHot
Module Replacement (HMR)¡£µ±Ä³¸öÄ£¿é´úÂë·¢Éú±ä»¯Ê±£¬Webpackʵʱ´ò°ü½«ÆäÍÆË͵½Ò³Ãæ²¢½øÐÐÌæ»»£¬´Ó¶øÎÞÐèË¢ÐÂÒ³Ãæ¾ÍʵÏÖ´úÂëÌæ»»¡£Õâ¸ö¹ý³ÌÏà¶Ô±È½Ï¸´ÔÓ£¬ÐèÒª½øÐÐ¶à·½Ãæ¿¼ÂǺÍÅäÖ᣶øÏÖÔÚÕë¶ÔReact³öÏÖÁËÒ»¸öµÚÈý·½react-hot-loader¼ÓÔØÆ÷£¬Ê¹ÓÃÕâ¸ö¼ÓÔØÆ÷¾Í¿ÉÒÔÇáËÉʵÏÖReact×é¼þµÄÈÈÌæ»»£¬·Ç³£·½±ã¡£ÆäʵÕýÊÇÒòΪReactµÄÿһ´Î¸üж¼ÊÇÈ«¾ÖˢеÄÐéÄâDOM»úÖÆ£¬ÈÃReact×é¼þµÄÈÈÌæ»»¿ÉÒÔ³ÉΪͨÓõļÓÔØÆ÷£¬´Ó¶ø¼«´óÌá¸ß¿ª·¢Ð§ÂÊ¡£
ҪʹÓÃreact-hot-loader£¬Ê×ÏÈͨ¹ýnpm½øÐа²×°£º
npm install ¡ªsave-dev react-hot-loader |
Ö®ºó£¬Webpack¿ª·¢·þÎñÆ÷ÐèÒª¿ªÆôHMR²ÎÊýhot£¬ÎªÁË·½±ã£¬ÎÒÃÇ´´½¨Ò»¸öÃûΪserver.jsµÄÎļþÓÃÒÔÆô¶¯Webpack¿ª·¢·þÎñÆ÷£º
var webpack = require('webpack'); var WebpackDevServer = require('webpack-dev-server'); var config = require('../webpack.config'); new WebpackDevServer(webpack(config), { publicPath: config.output.publicPath, hot: true, noInfo: false, historyApiFallback: true }).listen(3000, '127.0.0.1', function (err, result) { if (err) { console.log(err); } console.log('Listening at localhost:3000'); }); |
ΪÁËÈȼÓÔØReact×é¼þ£¬ÎÒÃÇÐèÒªÔÚǰ¶ËÒ³ÃæÖмÓÈëÏàÓ¦µÄ´úÂ룬ÓÃÒÔ½ÓÊÕWebpackÍÆË͹ýÀ´µÄ´úÂëÄ£¿é£¬½ø¶ø¿ÉÒÔ֪ͨËùÓÐÏà¹ØReact×é¼þ½øÐÐÖØÐÂRender¡£¼ÓÈëÕâ¸ö´úÂëºÜ¼òµ¥£º
entry: [ 'webpack-dev-server/client?http://127.0.0.1:3000', // WebpackDevServer host and port 'webpack/hot/only-dev-server', './scripts/entry' // Your app?s entry point ] |
ÐèҪעÒâµÄÊÇ£¬ÕâÀïµÄclient?http://127.0.0.1:3000ÐèÒªºÍÔÚserver.jsÖÐÆô¶¯Webpack¿ª·¢·þÎñÆ÷µÄµØÖ·Æ¥Åä¡£ÕâÑù£¬´ò°üÉú³ÉµÄÎļþ¾ÍÖªµÀ¸Ã´ÓÄÄÀïÈ¥»ñÈ¡¶¯Ì¬µÄ´úÂë¸üС£ÏÂÒ»²½£¬ÎÒÃÇÐèÒªÈÃWebpackÓÃreact-hot-loaderÈ¥¼ÓÔØReact×é¼þ£¬ÈçÉÏÒ»½ÚËù½éÉÜ£¬Õâͨ¹ý¼ÓÔØÆ÷ÅäÖÃÍê³É£º
loaders: [{ test: /\.js$/, exclude: /node_modules/, loader: 'react-hot!jsx-loader?harmony' }, ¡ ] |
×öÍêÕâЩÅäÖÃÖ®ºó£¬Ê¹ÓÃNode.jsÔËÐÐserver.js£º
¼´¿ÉÆô¶¯¿ª·¢·þÎñÆ÷²¢ÊµÏÖReact×é¼þµÄÈȼÓÔØ¡£ÎªÁË·½±ã£¬ÎÒÃÇÒ²¿ÉÒÔÔÚpackage.jsonÖмÓÈëÒ»½ÚÅäÖãº
"scripts": { "start": "node ./js/server.js" } |
´Ó¶øÍ¨¹ýnpm startÃüÁî¼´¿ÉÆô¶¯¿ª·¢·þÎñÆ÷¡£Ê¾Àý´úÂëÒ²ÉÏ´«ÔÚGithubÉÏ£¬´ó¼Ò¿ÉÒԲο¼¡£
ÕâÑù£¬ReactµÄÈȼÓÔØ¿ª·¢»·¾³¼´ÅäÖÃÍê³É£¬ÈκÎÐÞ¸ÄÖ»ÒªÒÔ±£´æ£¬¾Í»áÔÚÒ³ÃæÉÏÁ¢¿ÌÌåÏÖ³öÀ´¡£ÎÞÂÛÊǶÔÑùʽÐ޸쬻¹ÊǶԽçÃæäÖȾµÄÐ޸ģ¬ÉõÖÁʼþ°ó¶¨´¦Àíº¯ÊýµÄÐ޸쬶¼¿ÉÒÔÁ¢¿ÌÉúЧ£¬²»µÃ²»ËµÊÇÌá¸ß¿ª·¢Ð§ÂʵÄÉñÆ÷¡£
½«Webpack¿ª·¢·þÎñÆ÷¼¯³Éµ½ÒÑÓзþÎñÆ÷¾¡¹ÜWebpack¿ª·¢·þÎñÆ÷¿ÉÒÔÖ±½ÓÓÃÓÚ¿ª·¢£¬µ«Êµ¼ÊÏîÄ¿ÖÐÎÒÃÇ¿ÉÄܱØÐëʹÓÃ×Ô¼ºµÄWeb·þÎñÆ÷¡£Õâ¾ÍÐèÒªÎÒÃÇÄܽ«WebpackµÄ·þÎñ¼¯³Éµ½ÒÑÓзþÎñÆ÷£¬À´Ê¹ÓÃWebpackÌṩµÄÄ£¿é´ò°üºÍ¼ÓÔØ¹¦ÄÜ¡£ÒªÊµÏÖÕâÒ»µãÆäʵ·Ç³£ÈÝÒ×£¬Ö»ÐèÒªÔÚÔØÈë´ò°üÎļþʱָ¶¨ÍêÕûµÄURLµØÖ·£¬ÀýÈ磺
<script src="http://127.0.0.1:3000/assets/bundle.js"></script> |
Õâ¾Í¸æËßµ±Ç°Ò³ÃæÓ¦¸ÃÈ¥ÁíÍâÒ»¸ö·þÎñÆ÷»ñµÃ½Å±¾×ÊÔ´Îļþ£¬ÔÚ֮ǰÎÒÃÇÒѾÔÚÅäÖÃÎļþÖÐÖ¸¶¨ÁË¿ª·¢·þÎñÆ÷µÄµØÖ·£¬Òò´Ë´ò°üºóµÄÎļþÒ²ÖªµÀÓ¦¸Ãͨ¹ýÄĸöµØÖ·È¥½¨Á¢Socket
IOÀ´¶¯Ì¬¼ÓÔØÄ£¿é¡£Õû¸ö×ÊÔ´¼Ü¹¹ÈçÏÂͼËùʾ£º
´ò°ü³É¶à¸ö×ÊÔ´Îļþ½«ÏîÄ¿ÖеÄÄ£¿é´ò°ü³É¶à¸ö×ÊÔ´ÎļþÓÐÁ½¸öÄ¿µÄ£º
½«¶à¸öÒ³ÃæµÄ¹«ÓÃÄ£¿é¶ÀÁ¢´ò°ü£¬´Ó¶ø¿ÉÒÔÀûÓÃä¯ÀÀÆ÷»º´æ»úÖÆÀ´Ìá¸ßÒ³Ãæ¼ÓÔØÐ§ÂÊ£»
¼õÉÙÒ³Ãæ³õ´Î¼ÓÔØÊ±¼ä£¬Ö»Óе±Ä³¹¦Äܱ»Óõ½Ê±£¬²ÅÈ¥¶¯Ì¬µÄ¼ÓÔØ¡£
WebpackÌṩÁ˷dz£Ç¿´óµÄ¹¦ÄÜÈÃÄãÄܹ»Áé»îµÄ¶Ô´ò°ü·½°¸½øÐÐÅäÖá£Ê×ÏÈÀ´¿´ÈçºÎ´´½¨¶à¸öÈë¿ÚÎļþ£º
{ entry: { a: "./a", b: "./b" }, output: { filename: "[name].js" }, plugins: [ new webpack.CommonsChunkPlugin("init.js") ] } |
¿ÉÒÔ¿´µ½£¬ÅäÖÃÎļþÖж¨ÒåÁËÁ½¸ö´ò°ü×ÊÔ´¡°a¡±ºÍ¡°b¡±£¬ÔÚÊä³öÎļþÖÐʹÓ÷½À¨ºÅÀ´»ñµÃÊä³öÎļþÃû¡£¶øÔÚ²å¼þÉèÖÃÖÐʹÓÃÁËCommonsChunkPlugin£¬WebpackÖн«´ò°üºóµÄÎļþ¶¼³ÆÖ®Îª¡°Chunk¡±¡£Õâ¸ö²å¼þ¿ÉÒÔ½«¶à¸ö´ò°üºóµÄ×ÊÔ´ÖеĹ«¹²²¿·Ö´ò°ü³Éµ¥¶ÀµÄÎļþ£¬ÕâÀïÖ¸¶¨¹«¹²ÎļþÊä³öΪ¡°init.js¡±¡£ÕâÑùÎÒÃǾͻñµÃÁËÈý¸ö´ò°üºóµÄÎļþ£¬ÔÚhtmlÒ³ÃæÖпÉÒÔÕâÑùÒýÓãº
<script src="init.js"></script> <script src="a.js"></script> <script src="b.js"></script> |
³ýÁËÔÚÅäÖÃÎļþÖжԴò°üÎļþ½øÐÐÅäÖ㬻¹¿ÉÒÔÔÚ´úÂëÖнøÐж¨Ò壺require.ensure£¬ÀýÈ磺
require.ensure(["module-a", "module-b"], function(require) { var a = require("module-a"); // ... }); |
WebpackÔÚ±àÒëʱ»áɨÃèµ½ÕâÑùµÄ´úÂ룬²¢¶ÔÒÀÀµÄ£¿é½øÐÐ×Ô¶¯´ò°ü£¬ÔËÐйý³ÌÖÐÖ´Ðе½Õâ¶Î´úÂëʱ»á×Ô¶¯ÕÒµ½´ò°üºóµÄÎļþ½øÐа´Ðè¼ÓÔØ¡£
С½á±¾ÎĽáºÏReact½éÉÜÁËWebpackµÄ»ù±¾¹¦ÄܺÍÓ÷¨£¬Ï£ÍûÄÜÈôó¼Ò¶ÔÕâ¸öÐÂÐ˶øÇ¿´óµÄÄ£¿é¹ÜÀí¹¤¾ßÓÐÒ»¸ö×ÜÌåµÄÈÏʶ£¬²¢Äܽ«ÆäÓ¦ÓÃÔÚʵ¼ÊµÄÏîÄ¿¿ª·¢ÖС£±ÊÕßÒ²½«ÆäÓ¦ÓÃÔÚ֮ǰÌṩµÄReactʾÀý×é¼þÏîÄ¿ÖУ¬´ó¼Ò¿ÉÒԲο¼¡£³ýÁËÕâÀï½éÉܵŦÄÜ£¬Webpack»¹ÓÐÐí¶àÇ¿´óµÄÌØÐÔ£¬ÀýÈç²å¼þ»úÖÆ¡¢Ö§³Ö¶¯Ì¬±í´ïʽµÄrequire¡¢´ò°üÎļþµÄÖÇÄÜÖØ×é¡¢ÐÔÄÜÓÅ»¯¡¢´úÂë»ìÏýµÈµÈ¡£ÏÞÓÚÆª·ù²»ÔÙÒ»Ò»½éÉÜ£¬Æä¹Ù·½ÎĵµÒ²·Ç³£ÍêÉÆ£¬ÐèҪʱ¿ÉÒԲο¼¡£
|