React Actions Recorder 的模块热替换(HMR)
看到微博上 关于 Webpack HMR然而问题的重点是,Webpack 是跟很强大但文档挺难懂的项目 细节强烈建议读上边两篇文档,到底还是花了很长篇幅解释的
Wiki 上的这个服务端例子,我觉得最能说清 Webpack 是怎么做的 var requestHandler = require("./handler.js"); var server = require("http").createServer(); server.on("request",requestHandler); server.listen(8080); // check if HMR is enabled if (module.hot) { // accept update of dependency module.hot.accept("./handler.js",function() { // replace request handler of server server.removeListener("request",requestHandler); requestHandler = require("./handler.js"); server.on("request",requestHandler); }); } 可以看到代码里指明了
这个 API 说实话我还不会用,现在只知道大概的意思 // addStyleTag(css: string) => HTMLStyleElement var addStyleTag = require("./addStyleTag"); var element = addStyleTag(".rule { attr: name }"); module.exports = null; // check if HMR is enabled if(module.hot) { // accept itself module.hot.accept(); // removeStyleTag(element: HTMLStyleElement) => void var removeStyleTag = require("./removeStyleTag"); // dispose handler module.hot.dispose(function() { // revoke the side effect removeStyleTag(element); }); } 当然,实际尝试处理 此外在 Loader 的一些处理上边的代码会有个不足,就是 不用这样的办法,我在 Amok 的文档上见到一种 window.addEventListener('patch',function(event) { React.render(app); }); 我在现有的 代码
React = require 'react' recorder = require 'actions-recorder' ReactDOM = require 'react-dom' Immutable = require 'immutable' require('volubile-ui/ui/index.less') # 正常引用 schema 和 updater schema = require './schema' updater = require './updater' Page = React.createFactory require './app/page' # 第一次初始化 recorder.setup initial: schema.store updater: updater # 第一次生成 render 函数,以及做绑定 render = (store,core) -> ReactDOM.render Page({store,core}),document.querySelector('.demo') recorder.request render recorder.subscribe render # 开始处理模块热替换,特征代码,很容易认出来吧 if module.hot # 声明两个入口文件 module.hot.accept ['./updater','./schema'],-> # 重新调用新的模块 schema = require './schema' updater = require './updater' # 这次用 hotSetup 传入参数,hotSetup 会强制创建新的 store recorder.hotSetup initial: schema.store updater: updater # 组件也要处理一下,跟上边逻辑有点区别 module.hot.accept ['./app/page'],-> # 重新调用新的组件 Page = React.createFactory require './app/page' # 先解绑旧的 render 函数,同时生成新的 render 函数 # ... 考虑到变量是可以修改的,下面引用的 Page 是新的也许不用写那么多 recorder.unsubscribe render render = (store,core) -> ReactDOM.render Page({store,document.querySelector('.demo') # 新的 render 函数先调用一次更新下界面,然后重新监听 recorder.request render recorder.subscribe render 这样的代码,实现的效果就是, 然后 todo = require './todo' exports.create = todo.create exports.update = todo.update exports.toggle = todo.toggle exports.archive = todo.archive if module.hot module.hot.accept ['./todo'],-> todo = require './todo' exports.create = todo.create exports.update = todo.update exports.toggle = todo.toggle exports.archive = todo.archive 那么用视频演示下: http://www.tudou.com/programs/view/3zCKPo6a1ZU/?phd=99 大致就这样吧,后面的开发当中我再想法子深入一下 感想目前代码热替换比较惊人的,除了 Webpack 还有 Amok 和 Elm,Figwheel 首先热替换带来的界面开发的效率提高是有目共睹的,回想下改 CSS 开发效率不是件小事,后续事情还很多,我文章先结尾了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |