From b80698df1cd43f71c4674501ff90f39c9496ccb0 Mon Sep 17 00:00:00 2001 From: Christopher Chedeau Date: Thu, 24 Mar 2016 14:10:15 -0700 Subject: [PATCH] Introduce blog Summary:Ported the infrastructure from jest. ![screen shot 2016-03-24 at 9 47 50 am](https://cloud.githubusercontent.com/assets/197597/14024237/85db1132-f1a5-11e5-84be-f525e302c6ca.png) Closes https://github.com/facebook/react-native/pull/6629 Differential Revision: D3094423 Pulled By: vjeux fb-gh-sync-id: a01aec6a55d28484c45bb241d037ca6717bc5e81 shipit-source-id: a01aec6a55d28484c45bb241d037ca6717bc5e81 --- blog/2016-03-24-introducing-hot-reloading.md | 209 ++++++++++++++++++ docs/Newsletter.md | 8 + docs/Videos.md | 6 +- website/.gitignore | 3 +- website/core/BlogPost.js | 45 ++++ website/core/BlogSidebar.js | 42 ++++ website/core/HeaderLinks.js | 2 +- website/core/metadata-blog.js | 14 ++ website/layout/BlogPageLayout.js | 58 +++++ website/layout/BlogPostLayout.js | 39 ++++ website/server/convert.js | 161 ++++++++++---- website/server/server.js | 2 +- .../img/blog/hmr-architecture.png | Bin 0 -> 16358 bytes .../src/react-native/img/blog/hmr-diamond.png | Bin 0 -> 23722 bytes website/src/react-native/img/blog/hmr-log.png | Bin 0 -> 28920 bytes .../src/react-native/img/blog/hmr-proxy.png | Bin 0 -> 8692 bytes .../src/react-native/img/blog/hmr-step.png | Bin 0 -> 21653 bytes 17 files changed, 537 insertions(+), 52 deletions(-) create mode 100644 blog/2016-03-24-introducing-hot-reloading.md create mode 100644 docs/Newsletter.md create mode 100644 website/core/BlogPost.js create mode 100644 website/core/BlogSidebar.js create mode 100644 website/core/metadata-blog.js create mode 100644 website/layout/BlogPageLayout.js create mode 100644 website/layout/BlogPostLayout.js create mode 100644 website/src/react-native/img/blog/hmr-architecture.png create mode 100644 website/src/react-native/img/blog/hmr-diamond.png create mode 100644 website/src/react-native/img/blog/hmr-log.png create mode 100644 website/src/react-native/img/blog/hmr-proxy.png create mode 100644 website/src/react-native/img/blog/hmr-step.png diff --git a/blog/2016-03-24-introducing-hot-reloading.md b/blog/2016-03-24-introducing-hot-reloading.md new file mode 100644 index 000000000..369c616da --- /dev/null +++ b/blog/2016-03-24-introducing-hot-reloading.md @@ -0,0 +1,209 @@ +--- +title: Introducing Hot Reloading +author: Martín Bigio +--- + +React Native goal is to give you the best possible developer experience. A big part of it is the time it takes between you save a file and be able to see the changes. Our goal is to get this feedback loop to be under 1 second, even as your app grows. + +We got close to this ideal via three main features: + +* Use JavaScript as the language doesn't have a long compilation cycle time. +* Implement a tool called Packager that transforms es6/flow/jsx files into normal JavaScript that the VM can understand. It was designed as a server that keeps intermediate state in memory to enable fast incremental changes and uses multiple cores. +* Build a feature called Live Reload that reloads the app on save. + +At this point, the bottleneck for developers is no longer the time it takes to reload the app but losing the state of your app. A common scenario is to work on a feature that is multiple screens away from the launch screen. Every time you reload, you've got to click on the same path again and again to get back to your feature, making the cycle multiple-seconds long. + + +## Hot Reloading + +The idea behind hot reloading is to keep the app running and to inject new versions of the files that you edited at runtime. This way, you don't lose any of your state which is especially useful if you are tweaking the UI. + +A video is worth a thousand words. Check out the difference between Live Reload (current) and Hot Reload (new). + + + +If you look closely, you can notice that it is possible to recover from a red box and you can also start importing modules that were not previously there without having to do a full reload. + +**Word of warning:** because JavaScript is a very stateful language, hot reloading cannot be perfectly implemented. In practice, we found out that the current setup is working well for a large amount of usual use cases and a full reload is always available in case something gets messed up. + +Hot reloading is available as of 0.22, you can enable it: + +* Open the developper menu +* Tap on "Enable Hot Reloading" + + +## Implementation in a nutshell + +Now that we've seen why we want it and how to use it, the fun part begins: how does it actually works. + +Hot Reloading is built on top of a feature [Hot Module Replacement](https://webpack.github.io/docs/hot-module-replacement-with-webpack.html), or HMR. It was first introduced by Webpack and we implemented it inside of React Native Packager. HMR makes the Packager watch for file changes and send HMR updates to a thin HMR runtime included on the app. + +In a nutshell, the HMR update contains the new code of the JS modules that changed. When the runtime receives them, it replaces the old modules' code with the new one: + +![](/react-native/img/blog/hmr-architecture.png) + + +The HMR update contains a bit more than just the module's code we want to change because replacing it, it's not enough for the runtime to pick up the changes. The problem is that the module system may have already cached the *exports* of the module we want to update. For instance, say you have an app composed by these two modules: + +``` +// log.js +function log(message) { + const time = require('./time'); + console.log(`[${time()}] ${message}`); +} + +module.exports = log; +``` + +``` +// time.js +function time() { + return new Date().getTime(); +} + +module.exports = time; +``` + +The module `log`, prints out the provided message including the current date provided by the module `time`. + +When the app is bundled, React Native registers each module on the module system using the `__d` function. For this app, among many `__d` definitions, there will one for `foo`: + +``` +__d('log', function() { + ... // module's code +}); +``` + +This invocation wraps each module's code into an anonymous function which we generally refer to as the factory function. The module system runtime keeps track of each module's factory function, whether it has already been executed, and the result of such execution (exports). When a module is required, the module system either provides the already cached exports or executes the module's factory function for the first time and saves the result. + +So say you start your app and require `log`. At this point, neither `log` nor `time`'s factory functions have been executed so no exports have been cached. Then, the user modifies `time` to return the date in `MM/DD`: + +``` +// time.js +function bar() { + var date = new Date(); + return `${date.getMonth() + 1}/${date.getDate()}`; +} + +module.exports = bar; +``` + +The Packager will send time's new code to the runtime (step 1), and when `log` gets eventually required the exported function gets executed it will do so with `time`'s changes (step 2): + +![](/react-native/img/blog/hmr-step.png) + + +Now say the code of `log` requires `time` as a top level require: + +``` +const time = require('./time'); // top level require + +// log.js +function log(message) { + console.log(`[${time()}] ${message}`); +} + +module.exports = log; +``` + +When `log` is required, the runtime will cache its exports and `time`'s one. (step 1). Then, when `time` is modified, the HMR process cannot simply finish after replacing `time`'s code. If it did, when `log` gets executed, it would do so with a cached copy of `time` (old code). + +For `log` to pick up `time` changes, we'll need to clear its cached exports because one of the modules it depends on was hot swapped (step 3). Finally, when `log` gets required again, its factory function will get executed requiring `time` and getting its new code. + +![](/react-native/img/blog/hmr-log.png) + + +## HMR API + +HMR in React Native extends the module system by introducing the `hot` object. This API is based on [Webpack](https://webpack.github.io/docs/hot-module-replacement.html)'s one. The `hot` object exposes a function called `accept` which allows you to define a callback that will be executed when the module needs to be hot swapped. For instance, if we would change `time`'s code as follows, every time we save time, we'll see “time changed” in the console: + +``` +// time.js +function time() { + ... // new code +} + +module.hot.accept(() => { + console.log('time changed'); +}); + +module.exports = time; +``` + +Note that only in rare cases you would need to use this API manually. Hot Reloading should work out of the box for the most common use cases. + +## HMR Runtime + +As we've seen before, sometimes it's not enough only accepting the HMR update because a module that uses the one being hot swapped may have been already executed and its imports cached. For instance, suppose the dependency tree for the movies app example had a top-level `MovieRouter` that depended on the `MovieSearch` and `MovieScreen` views, which depended on the `log` and `time` modules from the previous examples: + + +![](/react-native/img/blog/hmr-diamond.png) + + +If the user access the movies' search view but not the other one, all the modules but `MovieScreen` would have cached exports. If a change is made to module `time`, the runtime will have to clear the exports of `log` for it to pick up `time`'s changes. The process wouldn't finish there: the runtime will repeat this process recursively up until all the parents have been accepted. So, it'll grab the modules that depend on `log` and try to accept them. For `MovieScreen` it can bail, as it hasn't been required yet. For `MovieSearch`, it will have to clear its exports and process its parents recursively. Finally, it will do the same thing for `MovieRouter` and finish there as no modules depends on it. + +In order to walk the dependency tree, the runtime receives the inverse dependency tree from the Packager on the HMR update. For this example the runtime will receive a JSON object like this one: + +``` +{ + modules: [ + { + name: 'time', + code: /* time's new code */ + } + ], + inverseDependencies: { + MovieRouter: [], + MovieScreen: ['MovieRouter'], + MovieSearch: ['MovieRouter'], + log: ['MovieScreen', 'MovieSearch'], + time: ['log'], + } +} +``` + +## React Components + +React components are a bit harder to get to work with Hot Reloading. The problem is that we can't simply replace the old code with the new one as we'd loose the component's state. For React web applications, [Dan Abramov](https://twitter.com/dan_abramov) implemented a babel [transform](http://gaearon.github.io/react-hot-loader/) that uses Webpack's HMR API to solve this issue. In a nutshell, his solution works by creating a proxy for every single React component on *transform time*. The proxies hold the component's state and delegate the lifecycle methods to the actual components, which are the ones we hot reload: + +![](/react-native/img/blog/hmr-proxy.png) + +Besides creating the proxy component, the transform also defines the `accept` function with a piece of code to force React to re-render the component. This way, we can hot reload rendering code without losing any of the app's state. + +The default [transformer](https://github.com/facebook/react-native/blob/master/packager/transformer.js#L92-L95) that comes with React Native uses the `babel-preset-react-native`, which is [configured](https://github.com/facebook/react-native/blob/master/babel-preset/configs/hmr.js#L24-L31) to use `react-transform` the same way you'd use it on a React web project that uses Webpack. + +## Redux Stores + +To enable Hot Reloading on [Redux](http://redux.js.org/) stores you will just need to use the HMR API similarly to what you'd do on a web project that uses Webpack: + +``` +// configureStore.js +import { createStore, applyMiddleware, compose } from 'redux'; +import thunk from 'redux-thunk'; +import reducer from '../reducers'; + +export default function configureStore(initialState) { + const store = createStore( + reducer, + initialState, + applyMiddleware(thunk), + ); + + if (module.hot) { + module.hot.accept(() => { + const nextRootReducer = require('../reducers/index').default; + store.replaceReducer(nextRootReducer); + }); + } + + return store; +}; +``` + +When you change a reducer, the code to accept that reducer will be sent to the client. Then the client will realize that the reducer doesn't know how to accept itself, so it will look for all the modules that refer it and try to accept them. Eventually, the flow will get to the single store, the `configureStore` module, which will accept the HMR update. + +## Conclusion + +If you are interested in helping making hot reloading better, I encourage you to read [Dan Abramov's post around the future of hot reloading](https://medium.com/@dan_abramov/hot-reloading-in-react-1140438583bf#.jmivpvmz4) and to contribute. For example, Johny Days is going to [make it work with multiple connected clients](https://github.com/facebook/react-native/pull/6179). We're relying on you all to maintain and improve this feature. + +With React Native, we have the opportunity to rethink the way we build apps in order to make it a great developer experience. Hot reloading is only one piece of the puzzle, what other crazy hacks can we do to make it better? diff --git a/docs/Newsletter.md b/docs/Newsletter.md new file mode 100644 index 000000000..800bf5408 --- /dev/null +++ b/docs/Newsletter.md @@ -0,0 +1,8 @@ +--- +id: newsletter +title: Newsletter +layout: docs +category: Community Resources +permalink: http://reactnative.cc/ +next: style +--- diff --git a/docs/Videos.md b/docs/Videos.md index aec0c770f..68537e117 100644 --- a/docs/Videos.md +++ b/docs/Videos.md @@ -2,9 +2,9 @@ id: videos title: Videos layout: docs -category: Quick Start +category: Community Resources permalink: docs/videos.html -next: style +next: newsletter --- ### React.js Conf 2016 @@ -34,7 +34,7 @@ next: style -### React.js Conf 2015 +### React.js Conf 2015 diff --git a/website/.gitignore b/website/.gitignore index 9ece29446..555763f8a 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -1,4 +1,5 @@ src/react-native/docs/** -core/metadata.js +src/react-native/blog/** +core/metadata* *.log /build/ diff --git a/website/core/BlogPost.js b/website/core/BlogPost.js new file mode 100644 index 000000000..575bf8ec3 --- /dev/null +++ b/website/core/BlogPost.js @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BlogPost + */ + +'use strict'; + +var Marked = require('Marked'); +var React = require('React'); + +var BlogPost = React.createClass({ + render: function() { + var post = this.props.post; + var content = this.props.content; + + var match = post.path.match(/([0-9]+)\/([0-9]+)\/([0-9]+)/); + // Because JavaScript sucks at date handling :( + var year = match[1]; + var month = [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July', + 'August', 'September', 'October', 'November', 'December' + ][parseInt(match[2], 10) - 1]; + var day = parseInt(match[3], 10); + + return ( +
+

{post.title}

+

+ {month} {day}, {year} by{' '} + {post.author} +

+
+ {content} +
+ ); + } +}); + +module.exports = BlogPost; diff --git a/website/core/BlogSidebar.js b/website/core/BlogSidebar.js new file mode 100644 index 000000000..eda503103 --- /dev/null +++ b/website/core/BlogSidebar.js @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BlogSidebar + */ + +'use strict'; + +var MetadataBlog = require('MetadataBlog'); +var React = require('React'); + +var BlogSidebar = React.createClass({ + render: function() { + return ( +
+
+

Recent Posts

+
    + {MetadataBlog.files.map(function(post) { + return ( +
  • + + {post.title} + +
  • + ); + }.bind(this))} +
+
+
+ ); + } +}); + +module.exports = BlogSidebar; diff --git a/website/core/HeaderLinks.js b/website/core/HeaderLinks.js index b1921be2a..b5dbffde9 100644 --- a/website/core/HeaderLinks.js +++ b/website/core/HeaderLinks.js @@ -16,8 +16,8 @@ var HeaderLinks = React.createClass({ linksInternal: [ {section: 'docs', href: 'docs/getting-started.html', text: 'Docs'}, {section: 'support', href: 'support.html', text: 'Support'}, - {section: 'newsletter', href: 'http://reactnative.cc', text: 'Newsletter'}, {section: 'showcase', href: 'showcase.html', text: 'Showcase'}, + {section: 'blog', href: 'blog/', text: 'Blog'}, ], linksExternal: [ {section: 'github', href: 'https://github.com/facebook/react-native', text: 'GitHub'}, diff --git a/website/core/metadata-blog.js b/website/core/metadata-blog.js new file mode 100644 index 000000000..5518c0f88 --- /dev/null +++ b/website/core/metadata-blog.js @@ -0,0 +1,14 @@ +/** + * @generated + * @providesModule MetadataBlog + */ +module.exports = { + "files": [ + { + "path": "2016/03/24/introducing-hot-reloading.html", + "content": "\nReact Native goal is to give you the best possible developer experience. A big part of it is the time it takes between you save a file and be able to see the changes. Our goal is to get this feedback loop to be under 1 second, even as your app grows.\n\nWe got close to this ideal via three main features:\n\n* Use JavaScript as the language doesn't have a long compilation cycle time.\n* Implement a tool called Packager that transforms es6/flow/jsx files into normal JavaScript that the VM can understand. It was designed as a server that keeps intermediate state in memory to enable fast incremental changes and uses multiple cores.\n* Build a feature called Live Reload that reloads the app on save.\n\nAt this point, the bottleneck for developers is no longer the time it takes to reload the app but losing the state of your app. A common scenario is to work on a feature that is multiple screens away from the launch screen. Every time you reload, you've got to click on the same path again and again to get back to your feature, making the cycle multiple-seconds long.\n\n\n## Hot Reloading\n\nThe idea behind hot reloading is to keep the app running and to inject new versions of the files that you edited at runtime. This way, you don't lose any of your state which is especially useful if you are tweaking the UI.\n\nA video is worth a thousand words. Check out the difference between Live Reload (current) and Hot Reload (new).\n\n\n\nIf you look closely, you can notice that it is possible to recover from a red box and you can also start importing modules that were not previously there without having to do a full reload.\n\n**Word of warning:** because JavaScript is a very stateful language, hot reloading cannot be perfectly implemented. In practice, we found out that the current setup is working well for a large amount of usual use cases and a full reload is always available in case something gets messed up.\n\nHot reloading is available as of 0.22, you can enable it:\n\n* Open the developper menu\n* Tap on \"Enable Hot Reloading\"\n\n\n## Implementation in a nutshell\n\nNow that we've seen why we want it and how to use it, the fun part begins: how does it actually works.\n\nHot Reloading is built on top of a feature [Hot Module Replacement](https://webpack.github.io/docs/hot-module-replacement-with-webpack.html), or HMR. It was first introduced by Webpack and we implemented it inside of React Native Packager. HMR makes the Packager watch for file changes and send HMR updates to a thin HMR runtime included on the app.\n\nIn a nutshell, the HMR update contains the new code of the JS modules that changed. When the runtime receives them, it replaces the old modules' code with the new one:\n\n![](/react-native/img/blog/hmr-architecture.png)\n\n\nThe HMR update contains a bit more than just the module's code we want to change because replacing it, it's not enough for the runtime to pick up the changes. The problem is that the module system may have already cached the *exports* of the module we want to update. For instance, say you have an app composed by these two modules:\n\n```\n// log.js\nfunction log(message) {\n const time = require('./time');\n console.log(`[${time()}] ${message}`);\n}\n\nmodule.exports = log;\n```\n\n```\n// time.js\nfunction time() {\n return new Date().getTime();\n}\n\nmodule.exports = time;\n```\n\nThe module `log`, prints out the provided message including the current date provided by the module `time`.\n\nWhen the app is bundled, React Native registers each module on the module system using the `__d` function. For this app, among many `__d` definitions, there will one for `foo`:\n\n```\n__d('log', function() {\n ... // module's code\n});\n```\n\nThis invocation wraps each module's code into an anonymous function which we generally refer to as the factory function. The module system runtime keeps track of each module's factory function, whether it has already been executed, and the result of such execution (exports). When a module is required, the module system either provides the already cached exports or executes the module's factory function for the first time and saves the result.\n\nSo say you start your app and require `log`. At this point, neither `log` nor `time`'s factory functions have been executed so no exports have been cached. Then, the user modifies `time` to return the date in `MM/DD`:\n\n```\n// time.js\nfunction bar() {\n var date = new Date();\n return `${date.getMonth() + 1}/${date.getDate()}`;\n}\n\nmodule.exports = bar;\n```\n\nThe Packager will send time's new code to the runtime (step 1), and when `log` gets eventually required the exported function gets executed it will do so with `time`'s changes (step 2):\n\n![](/react-native/img/blog/hmr-step.png)\n\n\nNow say the code of `log` requires `time` as a top level require:\n\n```\nconst time = require('./time'); // top level require\n\n// log.js\nfunction log(message) {\n console.log(`[${time()}] ${message}`);\n}\n\nmodule.exports = log;\n```\n\nWhen `log` is required, the runtime will cache its exports and `time`'s one. (step 1). Then, when `time` is modified, the HMR process cannot simply finish after replacing `time`'s code. If it did, when `log` gets executed, it would do so with a cached copy of `time` (old code).\n\nFor `log` to pick up `time` changes, we'll need to clear its cached exports because one of the modules it depends on was hot swapped (step 3). Finally, when `log` gets required again, its factory function will get executed requiring `time` and getting its new code.\n\n![](/react-native/img/blog/hmr-log.png)\n\n\n## HMR API\n\nHMR in React Native extends the module system by introducing the `hot` object. This API is based on [Webpack](https://webpack.github.io/docs/hot-module-replacement.html)'s one. The `hot` object exposes a function called `accept` which allows you to define a callback that will be executed when the module needs to be hot swapped. For instance, if we would change `time`'s code as follows, every time we save time, we'll see “time changed” in the console:\n\n```\n// time.js\nfunction time() {\n ... // new code\n}\n\nmodule.hot.accept(() => {\n console.log('time changed');\n});\n\nmodule.exports = time;\n```\n\nNote that only in rare cases you would need to use this API manually. Hot Reloading should work out of the box for the most common use cases.\n\n## HMR Runtime\n\nAs we've seen before, sometimes it's not enough only accepting the HMR update because a module that uses the one being hot swapped may have been already executed and its imports cached. For instance, suppose the dependency tree for the movies app example had a top-level `MovieRouter` that depended on the `MovieSearch` and `MovieScreen` views, which depended on the `log` and `time` modules from the previous examples:\n\n\n![](/react-native/img/blog/hmr-diamond.png)\n\n\nIf the user access the movies' search view but not the other one, all the modules but `MovieScreen` would have cached exports. If a change is made to module `time`, the runtime will have to clear the exports of `log` for it to pick up `time`'s changes. The process wouldn't finish there: the runtime will repeat this process recursively up until all the parents have been accepted. So, it'll grab the modules that depend on `log` and try to accept them. For `MovieScreen` it can bail, as it hasn't been required yet. For `MovieSearch`, it will have to clear its exports and process its parents recursively. Finally, it will do the same thing for `MovieRouter` and finish there as no modules depends on it.\n\nIn order to walk the dependency tree, the runtime receives the inverse dependency tree from the Packager on the HMR update. For this example the runtime will receive a JSON object like this one:\n\n```\n{\n modules: [\n {\n name: 'time',\n code: /* time's new code */\n }\n ],\n inverseDependencies: {\n MovieRouter: [],\n MovieScreen: ['MovieRouter'],\n MovieSearch: ['MovieRouter'],\n log: ['MovieScreen', 'MovieSearch'],\n time: ['log'],\n }\n}\n```\n\n## React Components\n\nReact components are a bit harder to get to work with Hot Reloading. The problem is that we can't simply replace the old code with the new one as we'd loose the component's state. For React web applications, [Dan Abramov](https://twitter.com/dan_abramov) implemented a babel [transform](http://gaearon.github.io/react-hot-loader/) that uses Webpack's HMR API to solve this issue. In a nutshell, his solution works by creating a proxy for every single React component on *transform time*. The proxies hold the component's state and delegate the lifecycle methods to the actual components, which are the ones we hot reload:\n\n![](/react-native/img/blog/hmr-proxy.png)\n\nBesides creating the proxy component, the transform also defines the `accept` function with a piece of code to force React to re-render the component. This way, we can hot reload rendering code without losing any of the app's state.\n\nThe default [transformer](https://github.com/facebook/react-native/blob/master/packager/transformer.js#L92-L95) that comes with React Native uses the `babel-preset-react-native`, which is [configured](https://github.com/facebook/react-native/blob/master/babel-preset/configs/hmr.js#L24-L31) to use `react-transform` the same way you'd use it on a React web project that uses Webpack.\n\n## Redux Stores\n\nTo enable Hot Reloading on [Redux](http://redux.js.org/) stores you will just need to use the HMR API similarly to what you'd do on a web project that uses Webpack:\n\n```\n// configureStore.js\nimport { createStore, applyMiddleware, compose } from 'redux';\nimport thunk from 'redux-thunk';\nimport reducer from '../reducers';\n\nexport default function configureStore(initialState) {\n const store = createStore(\n reducer,\n initialState,\n applyMiddleware(thunk),\n );\n\n if (module.hot) {\n module.hot.accept(() => {\n const nextRootReducer = require('../reducers/index').default;\n store.replaceReducer(nextRootReducer);\n });\n }\n\n return store;\n};\n```\n\nWhen you change a reducer, the code to accept that reducer will be sent to the client. Then the client will realize that the reducer doesn't know how to accept itself, so it will look for all the modules that refer it and try to accept them. Eventually, the flow will get to the single store, the `configureStore` module, which will accept the HMR update.\n\n## Conclusion\n\nIf you are interested in helping making hot reloading better, I encourage you to read [Dan Abramov's post around the future of hot reloading](https://medium.com/@dan_abramov/hot-reloading-in-react-1140438583bf#.jmivpvmz4) and to contribute. For example, Johny Days is going to [make it work with multiple connected clients](https://github.com/facebook/react-native/pull/6179). We're relying on you all to maintain and improve this feature.\n\nWith React Native, we have the opportunity to rethink the way we build apps in order to make it a great developer experience. Hot reloading is only one piece of the puzzle, what other crazy hacks can we do to make it better?\n", + "title": "Introducing Hot Reloading", + "author": "Martín Bigio" + } + ] +}; \ No newline at end of file diff --git a/website/layout/BlogPageLayout.js b/website/layout/BlogPageLayout.js new file mode 100644 index 000000000..b8c02a86a --- /dev/null +++ b/website/layout/BlogPageLayout.js @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BlogPageLayout + */ + +'use strict'; + +var BlogPost = require('BlogPost'); +var BlogSidebar = require('BlogSidebar'); +var MetadataBlog = require('MetadataBlog'); +var React = require('React'); +var Site = require('Site'); + +var BlogPageLayout = React.createClass({ + getPageURL: function(page) { + var url = '/jest/blog/'; + if (page > 0) { + url += 'page' + (page + 1) + '/'; + } + return url + '#content'; + }, + + render: function() { + var perPage = this.props.metadata.perPage; + var page = this.props.metadata.page; + return ( + +
+ +
+ {MetadataBlog.files + .slice(page * perPage, (page + 1) * perPage) + .map((post) => { + return + }) + } +
+ {page > 0 && + ← Prev} + {MetadataBlog.files.length > (page + 1) * perPage && + Next →} +
+
+
+
+ ); + } +}); + +module.exports = BlogPageLayout; diff --git a/website/layout/BlogPostLayout.js b/website/layout/BlogPostLayout.js new file mode 100644 index 000000000..c6b6377a6 --- /dev/null +++ b/website/layout/BlogPostLayout.js @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BlogPostLayout + */ + +'use strict'; + +var BlogPost = require('BlogPost'); +var BlogSidebar = require('BlogSidebar'); +var Marked = require('Marked'); +var MetadataBlog = require('MetadataBlog'); +var React = require('React'); +var Site = require('Site'); + +var BlogPostLayout = React.createClass({ + render: function() { + return ( + +
+ +
+ +
+
+
+ ); + } +}); + +module.exports = BlogPostLayout; diff --git a/website/server/convert.js b/website/server/convert.js index c1096758c..60239aabd 100644 --- a/website/server/convert.js +++ b/website/server/convert.js @@ -7,6 +7,8 @@ * of patent rights can be found in the PATENTS file in the same directory. */ +'use strict'; + var fs = require('fs') var glob = require('glob'); var mkdirp = require('mkdirp'); @@ -29,6 +31,14 @@ function splitHeader(content) { }; } +function rmFile(file) { + try { + fs.unlinkSync(file); + } catch(e) { + /* seriously, unlink throws when the file doesn't exist :( */ + } +} + function backtickify(str) { var escaped = '`' + str.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/{/g, '\\{') + '`'; // Replace require( with require\( so node-haste doesn't replace example @@ -36,39 +46,68 @@ function backtickify(str) { return escaped.replace(/require\(/g, 'require\\('); } -function execute() { - var MD_DIR = '../docs/'; +function writeFileAndCreateFolder(file, content) { + mkdirp.sync(file.replace(new RegExp('/[^/]*$'), '')); + fs.writeFileSync(file, content); +} - var files = glob.sync('src/react-native/docs/*.*'); - files.forEach(function(file) { - try { - fs.unlinkSync(file); - } catch(e) { - /* seriously, unlink throws when the file doesn't exist :( */ - } - }); +// Extract markdown metadata header +function extractMetadata(content) { + var metadata = {}; + var both = splitHeader(content); + var lines = both.header.split('\n'); + for (var i = 0; i < lines.length - 1; ++i) { + var keyvalue = lines[i].split(':'); + var key = keyvalue[0].trim(); + var value = keyvalue.slice(1).join(':').trim(); + // Handle the case where you have "Community #10" + try { value = JSON.parse(value); } catch(e) { } + metadata[key] = value; + } + return {metadata: metadata, rawContent: both.content}; +} + +function buildFile(layout, metadata, rawContent) { + return [ + '/**', + ' * @generated', + ' */', + 'var React = require("React");', + 'var Layout = require("' + layout + '");', + rawContent && 'var content = ' + backtickify(rawContent) + ';', + 'var Post = React.createClass({', + rawContent && ' statics: { content: content },', + ' render: function() {', + ' return (', + ' ', + rawContent && ' {content}', + ' ', + ' );', + ' }', + '});', + 'module.exports = Post;' + ].filter(e => e).join('\n'); +} + +function execute() { + var DOCS_MD_DIR = '../docs/'; + var BLOG_MD_DIR = '../blog/'; + + glob.sync('src/react-native/docs/*.*').forEach(rmFile); + glob.sync('src/react-native/blog/*.*').forEach(rmFile); var metadatas = { files: [], }; function handleMarkdown(content, filename) { - var metadata = {}; - - // Extract markdown metadata header - var both = splitHeader(content); - if (!both.header) { + if (content.slice(0, 3) !== '---') { return; } - var lines = both.header.split('\n'); - for (var i = 0; i < lines.length - 1; ++i) { - var keyvalue = lines[i].split(':'); - var key = keyvalue[0].trim(); - var value = keyvalue.slice(1).join(':').trim(); - // Handle the case where you have "Community #10" - try { value = JSON.parse(value); } catch(e) { } - metadata[key] = value; - } + + const res = extractMetadata(content); + const metadata = res.metadata; + const rawContent = res.rawContent; if (metadata.sidebar !== false) { metadatas.files.push(metadata); @@ -83,35 +122,17 @@ function execute() { // Create a dummy .js version that just calls the associated layout var layout = metadata.layout[0].toUpperCase() + metadata.layout.substr(1) + 'Layout'; - var content = ( - '/**\n' + - ' * @generated\n' + - ' * @jsx React.DOM\n' + - ' */\n' + - 'var React = require("React");\n' + - 'var Layout = require("' + layout + '");\n' + - 'var content = ' + backtickify(both.content) + '\n' + - 'var Post = React.createClass({\n' + - ' statics: {\n' + - ' content: content\n' + - ' },\n' + - ' render: function() {\n' + - ' return {content};\n' + - ' }\n' + - '});\n' + - 'module.exports = Post;\n' + writeFileAndCreateFolder( + 'src/react-native/' + metadata.permalink.replace(/\.html$/, '.js'), + buildFile(layout, metadata, rawContent) ); - - var targetFile = 'src/react-native/' + metadata.permalink.replace(/\.html$/, '.js'); - mkdirp.sync(targetFile.replace(new RegExp('/[^/]*$'), '')); - fs.writeFileSync(targetFile, content); } extractDocs().forEach(function(content) { handleMarkdown(content, null); }); - var files = glob.sync(MD_DIR + '**/*.*'); + var files = glob.sync(DOCS_MD_DIR + '**/*.*'); files.forEach(function(file) { var extension = path.extname(file); if (extension === '.md' || extension === '.markdown') { @@ -144,6 +165,54 @@ function execute() { ' */\n' + 'module.exports = ' + JSON.stringify(metadatas, null, 2) + ';' ); + + + files = glob.sync(BLOG_MD_DIR + '**/*.*'); + const metadatasBlog = { + files: [], + }; + + files.sort().reverse().forEach(file => { + // Transform + // 2015-08-13-blog-post-name-0.5.md + // into + // 2015/08/13/blog-post-name-0-5.html + var filePath = path.basename(file) + .replace('-', '/') + .replace('-', '/') + .replace('-', '/') + // react-middleware is broken with files that contains multiple . like react-0.14.js + .replace(/\./g, '-') + .replace(/\-md$/, '.html'); + + var res = extractMetadata(fs.readFileSync(file, {encoding: 'utf8'})); + var rawContent = res.rawContent; + var metadata = Object.assign({path: filePath, content: rawContent}, res.metadata); + + metadatasBlog.files.push(metadata); + + writeFileAndCreateFolder( + 'src/react-native/blog/' + filePath.replace(/\.html$/, '.js'), + buildFile('BlogPostLayout', metadata, rawContent) + ); + }); + + var perPage = 5; + for (var page = 0; page < Math.ceil(metadatasBlog.files.length / perPage); ++page) { + writeFileAndCreateFolder( + 'src/react-native/blog' + (page > 0 ? '/page' + (page + 1) : '') + '/index.js', + buildFile('BlogPageLayout', { page: page, perPage: perPage }) + ); + } + + fs.writeFileSync( + 'core/metadata-blog.js', + '/**\n' + + ' * @generated\n' + + ' * @providesModule MetadataBlog\n' + + ' */\n' + + 'module.exports = ' + JSON.stringify(metadatasBlog, null, 2) + ';' + ); } if (argv.convert) { diff --git a/website/server/server.js b/website/server/server.js index 69dd30a8b..79e7fcede 100644 --- a/website/server/server.js +++ b/website/server/server.js @@ -45,7 +45,7 @@ var app = connect() .use(function(req, res, next) { // convert all the md files on every request. This is not optimal // but fast enough that we don't really need to care right now. - if (!server.noconvert && req.url.match(/\.html$/)) { + if (!server.noconvert && req.url.match(/\.html|\/$/)) { convert(); } next(); diff --git a/website/src/react-native/img/blog/hmr-architecture.png b/website/src/react-native/img/blog/hmr-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2b19d78c82e6d7e18d1a3badf0ff51e26748e935 GIT binary patch literal 16358 zcmb`uXIN8P*ESm4w$P%W6d@SgiYP^pUKOy?+#-l{2uQD?2Z%}uNC}95v>?)?Hv@z! zQi8M~NRbk12$2$csL8j`{XFk?&X03l?{%H{BeJsAEMty)jC(kadv3|U-QO?OKcFO~Bvtf_ zl6+w>p>6a2H_JsHZo5bNQF?~@K_iQ&G$MZ_#6&7S=rnXpuq_MbmAK0D?xuo41S}OQ zks@MU8g$MJ)$Y^6|M|7$Y?HI_l=wo-!z-Q62B?+|QMZ-%fBUo&XS|~qTya#+x{tr= zcm1<2zoE@E>@8EN3SS7Jy;*L%0rd+HoHe#D|d^5(nPXm z=6q0a&05%!aSE-w$~Qm}srh^swDOshueki!Is4{74{4*uLCJrxDSymiJ93YL>mzQA z5vBX(lQ4}VSA!vs2r7$H0_Mfr5Uq8uPg6>0#I>qDgPtwg?0D@?#a8hoJb&&bBTVK>NVK=s zIcq64`u7nYJ{@vqd@miBaD89c9WQrZ;oVLsX>1wOUYAN3`TGb)p0gF^ zvja147?{4D4)ihUo9R=i8I1gH}s>a1?XW_;)1($LV+__J-Yo4YI{tRVb zdSZ*zu@pdwbv=vntSu*dCyP}M;LXmp>xSY z{OpKv@Q+S+5p`3h0wtU@07a62>HFMf%Evk9c^5^Em))~3&P0wn;J3zvJu{}Z4?cKl z*CzF_;J@})G0%d1YxRq>U^LMJ5GYw~_6a`~ceV!I98Wb$Vy=(6%zf-x9l^csfBBQKZHXxw{Jh4rGSr_4*=Z7jGe^Q@<>{BYE_o? z-nIE7;17yy9`+({)n=Ry$NwVCUuI)a!z9q;Cm*8Fsf%yshX$)FOewV8*1>k*QX6gg z5ra4{VTMcDMofJ(eOz_^PGz1ki_Xwf<>j)jjj~i)?$8)>8sfu=VP^O0l%-Wqh2RGu zAMp#ik5iUsutqg?&WiQUI?eDhAxaa6x=v1`4UefzN)BL1i@fdBZ5J^q9|Z;fi5*E5 z!Txes`oOIpIc^0bNT1f=-Cm5`RV^FY237* z4uDrhJRvr^SsuqIJVQ8Jv|wrt5zd`qO5U~lU*(m(iBm_($N%#W#P{KLiL=phkgOm` z_SEZu6OLqavm>tH<9la@dzu=KPF^~-aKGOrl^sMr{<62`6(0zg(&6Xj=7&MZ;l&SH zDjSb(sepi6c#i{5RKiP3{vS;RduCB&dQQKDAHD4glLhtsJKTl)EG&nA+(`+Xk4Ln+ zYX5(>ki`H0YN4>gAw#bs@7l$p)GC;ew5hAH?mJGmu7NJL#aqMDLjil0u%A8_mxnED z+r)>qSb9#&3Z9BR6!q;7ryGx}@-Q>Y4n0awfwI0eoMG@UqB z3I8H@WE7W#-$f~#U`=M;Gsy~0rkc0>LX;LRIuvoNN<`#G_KOcRr`zFoiMAo zkoE}5M4E}}tj{jv`v%qOEEhU=2!A!JB5zTffFB|jbcAfs)OV{KuU}*k({uQaO&U0v zRz4#=NT&OzP$klG_GG&W(bHvKQ1|lfv2m7kBhJJoj3u|`4^=B%q?cr!N+7z~Nm)$C z<-T8_S+c2}ay{emuCs!DCrqMVtbs8eN^{wO#m?}Ea(!vAOm8|I)G1XfW-)Sef45;L zSS|(Ac-|13Ad~N2bsa9$GWMXPG2yk=&r~Vt8v*a>$ZTkrNa(;^ZYKp^%yDGiW4Dkb znT~$4!o+f9;Zd?zYI@w%H=eJ%7txccBh1agbhCZz6F;YlDM9~w*R90 znJzbFo%7U21AjEU)mt=?mMs~zzuzrjyR6Y)_dcPy{&Qh;4w>AyQIbojjwhyTRc7_@a-oKvO4*e%0olYkP7{ z;h#D$fso8*3PW5r9-DPi4Zc3=-jHa&KENRW>s2(`8#BWC3Z*^FaQx^Kuy2ZgLlA0q zDwGR|p_@J+B&KmKJwj`7t_L*u1d1zF#wgzi?NDo7SLk2&#hGeMRqQLv=)U)A0##~( z1)3`D@a3zllIr(ro8!6-*Woil?e#_o7gljy!dZc;>_%EPgX}I|=*8af_G|B}-h8J8 zl7c5wY=s4O$7u&g?z54?B_4IOE8mi{E}Gct^-s5A_Aa}y;p3E~R4g)6W*G>dEF5|} zm)uU-*q<7q$)&trHIye;hr&c-xTcShkKZC(Ws3dhXQ7me412OdR+5-%Z$)VPe#0os zmGm&n$%t+>{;Z*5$>Sq|YF2^!+9<+OW#J7Y85gR3qut-Zm z$y^6&eX^>3oPh=++d^4q3oI~0F8qN}A>I$`qNzhfFr7^jDwXFj&W1cx>-znpqG$Mq zT)X%%OA2%lr^2M)dwTr^eFc>i#F5U``CD}^S3kS3JW;76^WPc8UYFy>@Qz%s+W1s8 z8K$DId`gG$vSzS2xQBL-c(o5__u|;njnM5sAt1D!_k9PsG8+t+GXWVt5*!K{d8kO# z*>>iKN}vYs3xW8w1nFEWFCu(#iK;_ol0{4=4Z31bcbgj5n)k{y_g(GL5lwID?q{Zd zJ?mpsZGZ*fMNW&UWb@tPp=Nu$+_DCI&;lV^`1+wPGjZUq2RD4XMOq(No+*8|mIRHwK<0e4Xy&c)F{1o9VT(8WU z=q4ZXqfB(duI4?to=+JVGJJpRa>kz6r%mgd11oYF-7pP`LhAJfwSDhmiw3n6{EI#q z?)l>Qh)q`xHMWt^6~h<7JLKB5VyXH_7iCZjc<7)J{#PE(* zLIkRE8TcV#=9}tm)U!r5KNQqPF_6YSwXn!FwwDzFscM~guiVDYRiq$K&v{gz1jgx9 z?2f;&nKnBm02f!iGvd$BQUH@-iUkr3{_E~U@bul5?vcBy4JB}k;7Y((qj3&mp%Ew{ zb1iS5@mCu)!#saiehiaxC&k>seVgy*@LSG#nc%SGz7Vb<^qI(_Q;7-denZs+OJIRC!J8mFQtxtV( zdncAnp+4+yFAD9+B`ICdH=?$X{GcL3<7zb}b?pbD&MIliaGji?E)H}zYGBVsjg4w@ zeG9!-=J$NQ+-0!a^ZnppsWNRVVb5l#K8-!pYL2u2m5o^nnUGDURr%6YZJniMV~O6` z-K;WZiW5bW1H{w^f*<|Oh)Wv=2bUT$yCokX`W-qVsQW){YK0q{GY-TmpEu|@-$xC# zki}42d`+6UL%d#PS|=0V1Wc*dJdkZXGUxCPwOxHq9$g_fQA))KM~mz75o_yx#{HKJ zdW(%U(+4_FG)=Mg<6@3}^=V%92xLjLQHJQSP0?i@;m682av<68#Uc*b3l5xt=qCn3 z$ZEf*b<1w@RZ-_T%h3@x*^hl+9g)^2;?oo^c5b1zx@F;y>o_qD-mBUv;3TANr-)4$l^X{WHCTpTa5{8eIhmp)^v*f& zfXkI};;(QEzUdja`LRf!yvl=6%Zrq!Mtptf%V>uM`#hgQlkm}w9>`n(4rP~yJc1{d zZOr_r96{?}Ec%88|7>S=Z%5k2B+$^IK%e(;cTPE=29W;dlaQK)!AZ?mCiRc{k9Br*_v!h1Bh(OU& zLe@lh{retbufN&yC6@KpmTM4rRn{iP;VeHVc_WCz+xYaxjaCN;Di;~tbL2YuNF8=- z|B+iy1BQ;Qp7LDkiL>e3=yd<26~=6bP%$uuja}R7_kymumr-4orntU~s1KI>6P+6% z%a*Ojb~nA0s|EfC?e_Ka}VrcW{bR2nMpn%aUh^qlnFu)3ise0Dg; z>@xOr>{9fJ8Hzxe(b5Cof69JX%cD%q!%{UT+#KVaQ!ZNXVVq@M&>;gOZ$mtm{W+5H zX-ePKUK-l32Q|g7SP44VMDR;32XBc)yijFyKUdq;eip&+91Tn-TS;lzrariRcYW{c zFZ8t5-k7_%O9jPn!Q%QV&%8bg?0ZFokh58dh+Fm+6Hq5!3;ggYMXZvV1O7?5wa)f8 z9y8;UPNQD5SVFcS&XUiPgE_aGGcI|1*%## zeE3P6lH#<#NL~+a_wPT5Vm%_xc#W)WzB?H*4RZU~8DiUDn|e-w8=9%uf(P!=%{cJM z*%|iDA%MA^7FK<}FMSl??-awz?Vxjal5FAMi5ms(%XvOVZmGg*FeUW_0$>X9XEM`b zgP9xx{NATHc2WbcrIjR$-b0*z?5j}3sP@a0wLuRJ1{9~I^8tnw$=Uhv-b;+8J{RDV zfd<>7uQRz3=aoC zYLG_^0t1#yV*OE7qY1mpTrB6%Kxwec<<}7;T;@}?qAx17hL@QXITABigXdlpss7#U z_)cNa7X!v|ja1Er33hd|;B!r*PiWi)1z;lHB#qDtQ0>{QoJ*S|iL)3-ObRlo1RY}N z(qjm@PvxLSk%Qt?XOq8SpKnGKAK3jQTu_l%%nu1VX@T`B)(vy45p;KO>v6X4NJ7Sp zOMd|;5eRO`TEkHtK)MP4Y(iWFe_b9ZzT+hm+c_n@GxxiB|-*NZ85n3 z*oMSWeb{!7X2ovS?+p@;PHWOOeuxhhS}74ee; z>Mp<++#|hsN+H6mc=-Z>Y=+mCb_}N3XRKY*N%bz`oY zf$zUsH$vU77DkJWEMbP7InST8$M29&$L=VC#RTU1b|#+~ELCS4h55$>{^(TVGiB?R zl2n~F@5=V|eRq_E<9G)d5FOOca@y296I9i|fJXp6VVqo|vbIO%-~=j{X{x#*<3>gR z`wGzLeI8MD#8R54&Ak7DMsbm1T8{S(6Tx`sT42o!Sss0aO*d8o=RIhg@-_uC=c~Yp z;T7D`A5n3?k-vX=zuQBTo2>vQ!mqPVyY$&b=!&{BZmBppSHYlz^aKUuqry+mLWM7= zT(4w`)uO2{pDIu~HiYDu_o#EJ5nLO$R3=CptI>D_7WO8L<&}-865U?-1BF(YHGI^; z0(+v%V}$NlzP+hoWAS?j|r*w1m~t;S>@Fs%-uA# zYmchd(wptI9`DnFdJl-9|FFf@zw?4hct_sUQ*b8XM?%{D@bW`_<-WY~GHEU~pJXAJ z#b7HlgQcVjMAhE$>v$gm2q`>OSgq!cOKjQ%9S8-h3|7!i*)8yP%OQL&!!!0|$?vR1i z*Z4P7#OLkrR|x%ipO?K@R~yzos#%F;n}l_#=)Y6>g3)Y}1R{7^2dTFnp6foc^oS0% z*q2kC?G7b$OT8tW6If8`O0|tsD$ZKhBR(6&wtVBZPKSRrw^1(n;{US#`ChzpaiywG zPSnT154GGtmvQ6_!JTriF-r#2h1;^E?iGoA;USsI43j|cIo&aO@;X78@q<;NG9 zSq=U+{nv`!iu`?~-VT~F^quh$MT=Ym^ZRZGdEpahOjNCO;|4n|un4-T>MT~^NBXbT z*B=uj-fS%Ue~nz=h5HUJ&COrk>q&77L)&Wj)Uc;2 zv@%9R+6%D!JH`D$c4k|>hw}4zSC(;yFvZbkY=8>X-8-dFqJQd^du}>s z|3as`grZTwJ!pAEh-C;Vs!sW;#m_e736;kq=k$@dVsC}?+P_p*BBAb6++ti98m4{i zS=42$nMCF1)3LBtT9FuP)Jb|WhpI2_a9-f&HM*`|pj4q5{%WR&j+L)tH@<(&(n2Q@ zaFz>>TKKe+8G9cFHzVHot>?5#FVLQ=&3^A~__^2sQJZ}W4hJfIR6FkncsGoG)~!J! ztPuI4uBYy4@Yld-+9r%*EbpRtN@wC@pG%lA#5K&=FBF_KkwV2S{y=<&e|`Bv**gnf zZg6Cs<>F*esh^6Kk`+X>52ZLahB=0dC;ZY*B?DB~*?~_~taN8a&L$M!6J(Sev z_AVD=pR>~X+*23J*SmuUUKG`DRnET-#a0sQEu$@giV>@s{aCMZZJvy2U$T>5eg9p9 zimKljlnDd-W;K&}&k68V$>7E_XnUR9bRhY~p;h+NPU{dw2XyfAtNyVHDU@tE_uQEP z?M_P>GXcOf2i?90J8q%V|Awf{M*2`5zpic%`sF&A19BgS+Z7 zynj7WmN}+Gi-bzh)_(l(s^vYtW7yobTL*QoeD77y9x0)&joL~hznjQ3y)jC;6zlB> zeQRMIhVFq%WX;&?mgFCVwy#PS<&*`SZA3!k8_v z5@gqzY8-Nc%-ccaH>Ksd-44ZAoUQC=bL#_$(W-^5^SL1r^|?y`8N>k@Ah`45 zM$yRUljj9Gseu_54eRASS{1BbI}l&P2qoV4YtbU=)2}T&)T|(JmBi#3-?ngJgpX+i zn0s8f=d_#Yy6dqUSW>wXUo90i(3HMD+^Cv0Bi(a4MMxbYTnuZ5hqkZrxJ}8SX*gZH z`&i$4D^5rzU1^mU>Yj6|7p*JH=Mk3rs8c%qq)XO%ck_yejZ)9)WBZd4cGjAn!(XP? zNn)g(za~tRb@=RkkY44Ttp?m)gkZti3N)ug+0}B>w8qO?aF;};OvS5KxI2Tj(Gziy ziJvzoa9*1piKJ(tQ#UNIzC-aV8%jADTb)`}L)BbOCz>OMJPNOM%PiJv;cJR0Wtk?? zI{iuzrs&+ECF)9YGYh^!8&DeqHEP;@Vzhe``@H3TmKs-Hz_&Bm`3YVWg%k%5@E`O3 zoP;+`Y%X;smws=>)G(gw1zu5|$js`{yaB@ZXXR-%!IOBEhf}LJ zECT$fl@n8d3|&TV@>2S!4V2!4GXb|azuMoogI8*e%BYbE1#2l8aP&^k>1tE%zNOJ< z>zR-!^CmAX+i{um3X|b9i8h4bOu(Y<<&A^j2hwrmJWt+1sPgTwmNq7}8j+D=wY;+99N_&VE|F1|V(A~qoCP)t%Q514q!U+mc9 z-c9d3MgK5WofEkxK6FC7=XB5MH}Kc+qc4Ll4L|$h#kzGKbn?#OhQv!Lw;llyuo>`s z)5AQ?cJAciMh2Io_wwZHBdP4bFJJC}OG^N&EZzXIzV1aATsZQ3tKucoU%wkrp6}rU z_DMh>u2PW;M-F#9ZkI@|9|In|1pET%%J8p-a<*sxXaB_jV^9T*qc?te%uV~tS_{y_ zX;z?xPIl04hJrWH=;0R3Uz*;_FTvsPqo7Gkuk$xD)ThO72w(j`lEBgC}P-XQt*X?S2x#K4DK+OrzOO|h7{$@VO zwu17fH)NieJNhvL8)_h9E+dRi^^^Ea7WC;@z@#8o3rF8Gv0`CRWf16g*w|C(TGqfZ z5J*u>%|FsKEOKGPeU(urX@)9<0Hc7GJKNZ9w)u&Fw*MP;tLwgA64nnBaro%VSmxO8 zL`gAmO`>Mg+wX^?FD+(Xh1!~r9|gT+n$h~K2#Xs)>EX=c$0=o(GxRQo2b}mb9HbDD zynQXCja|?8aeR31FLgnB5%{o1t&eqI-Gxfw_U8Yhpkw$D&v1?Qs;U0lV+d>)c#w{=hG4`~vs_pcaxJ#JyLY z8Sl-vh(`03KMLJF37qg4c4b}_AG-s~xqc&Kz)>pn8|h<9a=UnedKh4G&b9;_F-x%` zUH$(Kc(att;a#FV$wyB#yV0g7nfxM*4Fm!UpaOl{K-|<<{$tr=1s(r2BeQpy@gu04 zgY7u~^Mv8No}Fn1yFT#1mpRs0x8d+iCqP6s;4FIkN)$K)^D=`q_Ghgg4s2Nexy?d3 znn~$$h4T@Rxte$je&u8o7uU@D7;^taZohvE;)+cnfY(1pd|v3}|1=(mQEvXg9>`-$ zGXNdH(8*>7`5jnk!V+`QToH5VpGD@~CE-Lqhf=v*e3o7HL=CS1W4XjV4ck`RiR#V2 zGWw6Am+ z7gNTVTSCHfhV9Klx3z=m@-5+fzl5dUsoD7<-r(m7A$!1qq3WBE9ul|Oc+@n*?OHUv z6&_?DRtD#rQD+7EIrLiNDpC?^E{rDGHiAcGcp|Mh9L|cdn44~$m;rhL9rOAsV2}vr zZk~B$D`iywPSt90`-RKAi*2+Q-$K_jlA&IY5nuyQGrvG4j^mPxzO}cXaA+f6fac}D z+PwHEV_N;No6M_#MS*EM3U2+V8J=+%^(?FqQNp(w0-kO2w7}?|tUTvcGOgqoTAd29i$$hn^z>e)9Zl+8zc-=1%G*wd_BtGNv7D^v4f54-2M1qy=oCAMi zzs;g%lShf3#7(j=FjKI=5X`rY)zh-1+FLgqCMT*qLl()hi_B)=!M>6Q0hgFxd;$aQ zHd=+DH&6;Ds3aR{Lx=8ngjs5Nk0k`ZoOSyfgVcNy5lY$(w<_cJYD~`U;kU^ zAL}r$mIdB{DSwt9`1VTN>or{NvwR!(0!)4tds25>k=KxR2a*Ti1^UM&z8he~x5pp8 z5|e%yg$*m?UP#I>%mNRiWuwXm-Es(*-uww1E|Vl&(REtH2TrO;MZRP@i&AtCAfaaMyUIE0{MxaGY12GWX)<9fv_DP8jcXT`!aIcCvJz{&gIu* z@E;HasLpDhL99;fa2$vEL;@f*)gx@3z1L~jsX;mT9u1^Rz<$84^>_C(Z`o7}u1a{v zuv6m~Jqz1`k|Ao&CwcJI1|vY|>AzhMN~yQ?ZaeF-hUl|cNuJ$Z0NY5M_|C-(D=99! zcT3tW3L8Uva*fnlVg#7`dFb}A&z;M~aqIyN^uRMQ_y~OT38l|x{`ibl0y$}8*DqWu zjID1X5yAYrOlaXGlPVi|UsnWH zm%dth7ufE1R1e)Yn0O3H`Os$i6rD5q>EvTzC86ctEp0u+)=Rf#fT49?^$e?6Jq4tn zFEt_U!)JTO^HU!o`L(Pa^z`%Hv+xwn3sk4;wS{jzcU}Px-%9{cFKF9hSTxM!Q0&%~ zAyyK%prmaB6rbKh3K@Et+zvA1MnZoU`K$p(BV(XU8*nxSdxBELaOMJw%DLfZKwlxN zw!(zrjGoN=#X>;%>gBn(HVc}&;x!Ea_HQ_U3C0z7-ikiUoszcv=!isvjP#xQB-Ocf z`J|&lKm%X6reOhUzRWQdl!^WfJ%lU~zn8Kc9!YXO^9fM|1k9J;Psb7pOsIur6jGG( zF`+bo{D43PRbV-GL#dFZjy0e=R(|)f>)a#!r$9jP?L&}vk4Fu^>LD7219*rVl-$RqsvgWi~N)29$CwlzCn}b{C3du$1{*7NtByIi$Rp1}_xSN@mGC^~d9mi4iCqE5AsFwgbYD z1vmMK3{N)exMO-a$M}C&YDJ7N%u|J{a*3inaMnS$PSXLBH;Kd9I9ID#F{983;m-f$ahL@*r_AUd_8tG#}@Y2PZk+!tX2fb zKIX$}vxE7H%tfqTA7w>nzi-g;IIeONe?zGGd#Y!3P}>t*DH9eJsQZ1}0nIa_v;xn=pORsUm*w*2yQhEmZLLh5Z9*P>DSw}!41SeZvw0O3n@_JJ?~mv3Cq zu>~C6U@MX-DDVFT0OGH1rP$2#9l7}uc2dBfr(z2M9t-?O_3uFu5NJaUu7Bs)!i7JS z=|2qHs{T)$gaB+F^nrgloI?Oe^$|1W}JrI zb7gG?rt-nPe>n~B`(a8)qb77MDBrOH@Vl4)%wpP`xC%P>pOIAbNujO47;nqq3)a#L z$|pW@J^bwgf7$0;XUmtc_$Tsjt;QpuOSV1ow)O>w6@#k<^B>5HZ}foqL7+>A#Hg2z zcK8Kiey<$|e9b52OaK#?v^nvIRR;Y@w9UKXhtNBW380N;rNgh4*P73)bFN3|JbhfEPmbN7|kVi^jF&rE$u=;TL% z4Sokv+YK8;2VcJd24m>gtscGp1O5VnLV_|61dTqz*{~Ag zg73vycP1F|?+xRZ8#ekhkdUC&mX;R&hSj!<+EtR*(?(^MEc zghm=g2e~^}P}1P1GH9uPXPqtIe8<71VP}r;taA8Mhh^JUY}sGy_`pRx{oBUIMx*}@DUq=_!_U~> z{6#e@Ojt$AO=t8Sy6H`O=vqABG=hWg>H#P7&Ij$>am?qYa&mADrCk z;i$RFn|a9d4qk$Sf=Fsn6;a-_C|blz44_p?nXWps3D;!hXfy2K--+elNxMGDXiVRq6-3q>0*3+XzWt^Xp+D4lF_!M`YiP>{XNN;G ze>yByUkm+aKYoDi(H3$* zpW`?Ev2RuX1~B?FWOZYBcsPKjz={l)YUkhWMbZCe9@>uk{cC^7Du9D2Gx}G~2G={M zE=EZxDD3Iv5BLR!ZJj@iV_$BDv?rSSQFJDdj03f!!?y3t=p-|`!<{9duxC!Q_~o{? zie_x1)6admmsz(tXvDaEm^%minh&1}q7f0)mtg5J(r_6JmA~oh(yp3ySbUkcw|prp zxLy^waUZ!s^=Ir&aJGjQ?$fCZIx^AzQpq!G3*b&eT_Aom4?KU+5SCupu?9?|aXTq} zC#i9>=_LQBq_Ig-?Zm-yQ+9T?nJ*Ta))buYgBqE=PP?3frdoy}Jx%E>DqdT^MH4mNwZ2kNw-ow_j4PJgmw#;jhfXCw* zo1-p`0ZyZpPK`VLDhK^GXnqyCN24G8FZ9kZzN3^qu{;l;{Q8VZYv?z1d(gV zy?wF@gE%%e=1ufp@22W?k|v&Yl2qz|5I1qqeqY(W!O--6{+hF1Wr#lebkt{Uv*X>* zfxr+K+U|8#_x77R6!Y`f8>N+%=?*18(s0qc^9un4Q(6I@zj15Cfgv4QSTzy2$ELEL zMDQmA@q5w51(;}`0<~`aqROVO$|f7^l7i35WJ#Org-!$zyVp0*Ic#I3wxzVhkox;$ z+dFQ`)B7zuZ`L_G6GV)h1AYNZMFw)weTGS4Y*7Ot=-1u>{{RgqEiUd>?6>cN(kJAt z())((zHgi=?C+K@0f_gDP+-q&lOx5kCo2Z4bfUOkk4s^<3>~oO60i>hsam}qR9swK z<39%s?}EmXXGb>B`DBLH`Fqs4wY5$$#&hN@tt)@kc@bJCpJ@vw3@cXc)=eM|HissV zGf^^u>+I>7+#N&6m5QCh(1 zN4@0>>1R7h`I@8j8uvdF3%n|*r5V)JUz4Pf6rEcGFy@yE?^ zUQzEHhMAUybN*Hh{1|g=m1@BS_i~GiVf~7~c~quVy&9l7v2|W8!U-){0xt+jB~qm| zy&e2SL%*$ZXp2eKIg?+i&L(U$kV0uuxn$8(v3zztz&fZ}O+d?mO?fM)hK@sp2AOA3 z1H0>*@(`Ks>@&XjQq?NZEZ5yS4sgwz|1r8*SfPwv6!tA1169`!9za}yhZzUO}bhXLBZ`vL)~?D8T3%f91WtwK!TGUjv}0T~(pFLo}cHo>Yc+?27 zukKezJihVB$L~}Op9S{9irbl2T3W_7stcG_6a_1;E}CVRK)a!h($}(LEq5Ck?IS0o z2NYYF&h;VqvuJI%eXnZuqqzWVJvb{{*uR-22b5l?cnxwZRsP89rT;jYprZWJr=*gMHCrQy4i}aE{Yj*=}J930>&qFRz zb0&S{L`v8x)a~J*{H~JkHvFGDGC9FdPy9}C#w~0&t?;GQRa3a}yVb@_op!sbS-wCa z%-Naj;7r0w&!n}YkYd?S*xvN($))Gizo(nMNw10_Dh#do z`kJ=cm!##_zYx+we%%_1M*!UHcG%+elei@(O#1bs!<8E&aV#aH@fd{60mH{uN-x0p z-Hp2jb$u(wmAThx4g|A;6W{A8tJ@jWN=x2TbxPOY!IeprbBKst&Cgt}ls2f8JfLdt7n%45I4`>VrG z&%kZ^7{Kw?A1R+8T2w;va(G?*QCR(sT`@%w;J7vpB?@Vf5}EG01l3~jPt085VTrS4 z?QrHC=hrx`J8YaK;Y}<5h}12y70{&bA^I3DIlZz&bL+o=qeTY{)!kZQI0YAh1>;Jf zpW5&X*u3%O0}g?KWT1*RyV-)T2=CT|ElrGvKE4oST{o1fULx!~t_sC%4744G=ENC@)M}{ zmaCW98k0X%b3uhJlVLQ`HlBuyLUr-4+{>ExoI?l7pbH7A1^TO|$;2X#Go2X<(-SuR zv<7{q%GK4eJRN_!RWiZx{+Un(`}A5FB~yOWSu2q*XJU2w|D+|UTbQG>+yzcngL#L% z@>44OY~xi+m!h%+*Ay+y--6HT95$^yiE<((af$6Pou&+FuPLE6_bzhNmk5Uy>?L)} zG+=lK24LAzZJ?5Vb!@?-RNKJhPhvgHy&u?sT}^rH!4c5Q2;l9Ym!x57TwiyF%2*HC zBF}WDGtzdz)}*MT0m^bUQ#5oRCiK$eO!Kq7Yk-ZvoHFIY@5v_uD_vWm_Y?ZKxFD(b z7l`6#JD>@zl8CiiV|bSC8sM-S5^ z4-4+#??oouI#c4I?Kgy;wjt5EH%qbCVfx649JPWR+T$}(-u==X4zFQ0_itS|3j#$} zhG?xR!9PW6-5{U_>))aC-7kk^G-nK~Mu2~uL;dp;V%Yse2iRpfGc7LJmP`cnJl$dv z5ZWAh#0`3KZ*rhqstw{5gpAupum*5$YFQ*-Gw`16twD3vz2Q)H3ZjLlbr||jVNsM+ zcv;n`58F(0Z%w0QAY(Z0*DH=MGJEf%e`_Bjp`AZDQZ3oL4G`Sa)d(q9Ag|wBzH=sd zNOxF1@%3;SN5@u z`b7r_`L%ZV$oD^M0GWmbdcl+K-Nc_9lf@wetTr9z9QGhG@9sN68b@EqKWnxx zqPXwwU&daljhXZA%V$5te~9?Mx{KqbKdK%;l3oT18vry91PZb~)ZIXSITRTX=(w8y z%R>l?Mgp(w9e!CH{1K)A9uL~J_qxZ?G)}ls!{>xrP!Ds!PHI`NjE^m#gF5%#pSB!r~{92as0bJ~V|1rP3 a$2fAc@vX3rh<3x_;}7p@s~4-9zy3cu4=fk} literal 0 HcmV?d00001 diff --git a/website/src/react-native/img/blog/hmr-diamond.png b/website/src/react-native/img/blog/hmr-diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..bb70c8805dd5d48a0c16d3a82ee5a1b18d99c0b5 GIT binary patch literal 23722 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 Ce5wcl literal 0 HcmV?d00001 diff --git a/website/src/react-native/img/blog/hmr-log.png b/website/src/react-native/img/blog/hmr-log.png new file mode 100644 index 0000000000000000000000000000000000000000..af6b5ef886a5519903fadc8c328e65af82eed020 GIT binary patch literal 28920 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 literal 0 HcmV?d00001 diff --git a/website/src/react-native/img/blog/hmr-proxy.png b/website/src/react-native/img/blog/hmr-proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..86b74f858a4efbf27c8bf6028bde2bbef40477c4 GIT binary patch literal 8692 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