- Added support for incremental builds
- Fixed a security issue where
process.envvariables could be exported and distributed by accident. - Remove update-notifier. It was never that reliable and was presenting problems with multi-threading.
- Official browser plugin support
- Added the
Routerbrowser plugin hook - Added the
react-static-plugin-react-routerplugin and guide
- Various css-loader issues have been fixed in plugins for more stability with the latest features
- Silently deprecated both
config.renderToHtmlandconfig.renderToElementin favor of using the plugin API. Hope this doesn't annoy anyone too much. Better to do it now that later!
- Reduced the size of npm installation by removing the
archivesdirectory from the npm tarball
- Fixed an issue where helpers were not included in external node_modules imported through babel
- Added Guides to documentation. All example except for the three main templates (located in
packages/react-static/templateswill be converted over to guides eventually. - Examples have been deprecated and are no longer available as templates for
react-static create. They have been moved toarchives/old-examples.
- Fixed styled components example for V6 (#889)
- Removed old website code
- Fixed examples to import Link from external router modules
- The CLI now uses
minimistinstead ofcommander. Along with this change, there is now only a single binary for all of react-static. This should cut down on inconsistencies betweennpmandyarnand how they treat multi-binary projects.
- A
pagesdirectory is now available. Any files in this directory will automatically become unique routes with no configuration necessary. react,react-dom,react-routerandreact-hot-loaderdependencies are now optional as project dependencies and will resolve using react-static's versions if needed.- Plugin system. Hook and the like capable of altering and adding features to a project non-invasively.
- Created
react-static-plugin-emotion - Created
react-static-plugin-styled-components - Updated eslint and prettier and configured both to run on the pre-commit git hook
config.maxThreadsnow lets you specify how many maximum threads to use to export your html files.config.disablePreloadlets you disabled automatic preloading for debugging worst case scenarios.
- Upgraded to Webpack 4 - Make sure your webpack modifications are compliant with its new API
- The
config.webpackoption has been removed in favor of using the new plugin system. This should encourage the creation of plugins and also provide a single way of doing things with webpack. - Upgraded to Babel 7 - Make sure your babel plugins are compliant with this version.
react-hot-loader'shot(module)(Component)syntax has been changed to now use the<AppContainer>approach. This is much easier than using thehot(module)(Component)in every module you create.- Removed the
is404property from the 404 route. To designate a 404 route, you can now place a404.jsfile in your pages directory or create a route where thepath === '404' static.config.jswill now be imported and run multiple times depending on how many threads your build environment supports. If this is a problem, you can use theprocess.env.REACT_STATIC_SLAVE === 'true'condition to detect if the instance is a threaded export slave or not.config.renderToHtmlhas been deprecated in favor of using thebeforeRenderToElementhook.config.usePreactis no longer an option in thestatic.config.jsfile. Use thereact-static-plugin-preactplugin.- A new loader for external JS files is now used after the normal
jsLoadercalledjsLoaderExternal. It is responsible for handling all javascript files that are not located in your projects source. - The Routes (and
react-static-routes) import has been replaced by simply doingimport { Routes } from 'react-static'. Under the hood, this uses a webpack alias to point to the generateddist/react-static-routes.jsfile, and thus won't confuse linters or IDEs like codesandbox :). - Passing an object as the config to react-static is no longer supported. You must pass a location of the root of the project.
- All
renderandcomponentprops are now deprecated in favor of usingchild-as-a-functionrendering. Anywhere you are using these props must be migrated to use a child as a function. - The
Loadingcomponent has been removed. If you wish to show loading states in your app, you can use theLoadingprops for any components that support them. This is in preparation for React...Suspense! - React-Static no longer ships with any routing-related functionality. It functions independently of your routing paradigm. Thus, it no longer exports anything from
react-router. - The
PrefetchWhenSeencomponent has been deprecated in favor of only using thePrefetchcomponent - The
Prefetchcomponent is now smart likePrefetchWhenSeenwas. - The client-side
Redirectcomponent has been deprecated. Redirects should be done in thestatic.config.js. If the user needs to do any redirects for dynamic/runtime routes, they can use their favorite router's redirect solution. Routerhas been deprecated and replaced by theRootcomponent. TheRootcomponent implements theHashScrollercomponent, anErrorBoundaryand a very simple and non-invasive route context using@reach/router(the recommended router). The base router is customizable or replaceable if the user wishes to use a different router.- The
Rootcomponent renders adivunder the hood (from reach/router). This may affect layouts during migration. config.disableRouteInfoWarninghas been depracated. Do not useRouteInfoon non-static pages!- Shared route data is no longer calculated automatically for performance reasons. This was previously done on every key of every prop sent to a route, which was very expensive for little benefit.
- Shared route data is still supported via the
createSharedDatautility and thesharedDataproperty on a route. See the docs for information on usage.
- React-Hot-Loader should now work out of the box for all projects. If it doesn't, please report it immediately!
- Much better performance when building routes for large sites via general performance improvements and also multi-threading HTML exporting
- Fixed an issue where XML sitemaps contained invalid characters
- Refactored many files to be more easily testable
- Removed
jsescuntil we can find a better way to handle utf-8 encoding for routeInfo - Removed a stray console.log
- Updates examples sites & various documentation typos
- Log errors during build configuration step to aid in build debugging.
- Moved away from Slack to Spectrum for support and community.
- Fixed a regression that prevented cache busting on routeInfo.js files
- static/index.js logic is now broken up into smaller pieces.
- Added various tests for parts of static/index.js
- Upgraded snapshots for testing
- Removed deprecated react-hot-loader/patch from webpack dev entry, but kept the
react-hot-loaderentry to ensure it is required before React. - Updated tests to work with regressions
- Add tests for building a sitemap
- Add tests for building the config
- Improved Gentics Mesh example
- Fix an issue with routeInfo not loading on 404 pages
- String comparisons are used for env variables now
- Ignore tests when created a build
- Fix examples that use the css loader to work correctly
- Don't replace hrefs if route prefixing is disabled
- New sites in the built-with list
- An automated was added to test all examples build integrity
- Upgraded some dependencies
- Fix inifinite loading issue introduced with 5.9.0
- The
<Loading>component and theonLoadingmethod now return a more detailed loading state.0for not loading,1for "soft" loading (when navigation is happening) and2for "hard" loading (when asynchronous assets are being requested).
- Switch from
babel-preset-latesttobabel-preset-env. - Remove unnecessary
babel-preset-stage-3since it's included already withbabel-preset-stage-0.
- Expose the react-static babel settings as a
babel-preset.jsfile for more complex babel setups..babelrcuses this preset for backwards compatibility.
- Upgraded
swimmerto hide log messages. - Document-level rendering now uses
renderToStaticMarkupinstead ofrenderToString. This ensures there is no code comments or meta markup in the
- Upgrade Documentation example and expose some undocumented utilities to the outside world.
- Remove console.log from
documentationexample
- Added a
config.disableDuplicateRoutesWarningoption.
- Improved
getPathandgetRoutePathmethods, and added some simple tests for them.
- Added the
paginationexample. - Added a
makePageRoutesutility function on thereact-static/nodeimport to help with generating page routes from an array of items.
- Added a
config.disableRouteInfoWarningconfiguration option to silence missing route information in development
- Missing routeInfo.json requests do not throw in production now.
- Fixed an error where router
paths would not match as expected during static export. It now uses the same format (leading slash at root patsh) as react-router does by default during development.
- New Error handler component and accompanying tests. Thanks @jasonlafferty!
- Improved prefetch lifecycles and page responsiveness for slow networks.
- Added hidden feature to rebuild routes and routeData automatically when the config is edited during development.
- Added hidden feature to rebuild routes and routeData during development.
- Fixed yet another issue in the dev server that could result in a 404 on first load.
- Fixed gitignore files from not being generated
- Fixed an issue in the dev server that would result in a 404 on first load.
- Upgrade eslint rules to latest versions
- Fix
gitignoreissues
.gitignorefiles can now have thedotprefix in examples. Automatic changes resulting in a.npmignorename swap are handled byreact-static createreact-static build --debugflag now uses thedevelopmentflag so as to not hide react warnings, errors and disable react minification- Changed default
distfolder during development totmp/dev-server - No more losing internal state in components during hash navigation
- Dev server now serves
publicdirectly through webpack, allowing immediate feedback to changes in its files.
--configCLI argument accepts a path again.- Netlify CMS example now uses
npminstead ofyarnas the default Netlify script - Documentation Updates
- CLI now uses
pretty-error! - CLI route export errors now display the route that errored.
- TypeScript example now excludes node_modules in
tsconfig.json - MaterialUI updated to use latest beta
- In the
typescriptexample,ts-loaderis fixed for webpack 3 less-antdesignhas been updated to run and work properly.
- Added
config.extractCssChunksoption. Set totruefor automatic style-splitting and importing usingExtractCssChunksinstead ofExtractTextPlugin. - Added
config.inlineCssoption. Set totrueto inline all styles into the resulting HTML document instead of usinglinktags.
- Server-side rendering of UTF-8 characters no longer behaves erratically.
- Resulting HTML for a route no longer includes double instances of route data.
- Auto hash scrolling is no more responsive and handles more edge cases.
- Fetching route info for non-existent routes now has better logging.
- Fixed a bug where an imported
woff2file extension would crash babel.
- Fixed a missing export of
propsByHash. - Added
update-notifierso people can keep up with all these updates!
- Moved
gitdocsto dev dependencies - Added
shrink-to-fitto defaultDocumentmeta.
- Production code-split components that error will now log the correct error to the console.
- Added
routeInfoto theconfig.Documentcomponent.
- The
react-hot-loader/babelis no longer used in production. Who's the dummy who did that?! (...me, haha) compact: falseis now the default in.babelrc. Only a select few care about those compaction messages anyway.- Various
__dirnamereferences are now fixed with the correct number of../'s
- Fixed a rare issue where hash links may not be scrolled to if navigation is fast enough (imagine that ;)
- Added a
config.paths.rootoption that is also rare.
- Fixed a rare issue (in Gitdocs mostly) where a RouteData would not load even though routeInfo.allProps was synchronously accessible.
.comor any other suffix is no longer clipped fromsiteRoot.- Absolute URL rewriting now takes into account
basePathand alsosrc=''attributes - 404 component more reliably supports
RouteDataand is generally more stable. - An
is404prop is now available viaRouteData/withRouteDataif and when rendered on a 404 page, regardless if it is the /404 route itself or any other route that results in a 404. - Fixed some hot-reloading side effects that were introduced with the new project architecture.
- Lost some weight on the node packaging. The docs and many other large files are now excluded from distribution.
- Improved the node API support with much more stability.
- Added a
keyprop to the rendered route inreact-static-routes.jsto avoid stale or mixed state for routes that happen to share the same top-level component. - Removed complexity from the user by making the
<Routes>component'sgetComponentForPathrender prop more robust. (Check documentation if you use custom rendering for yourreact-static-routes)
- Added a
Redirectcomponent androute.redirectoption to routes.
src='/'paths are now also rewritten with siteRoot and basePath
- Added Node API to React-Static via importing
react-static/node - Added the ability to use a custom
static.config.jsvia the CLI - Added
config.basePathoption for hosting and running react-static sites from a sub-route - Added
config.stagingSiteRoot,config.stagingBasePath,config.devBasePath. Used for overriding the above options in specific environments - Added the ability to create projects using a local template location.
- Entire repo has been reorganized and split for easier maintenance and project grokking ability.
- Template information and route data hashes are now automatically generated and collocated in a
routeInfo.jsfor each route, instead of in a single location (give them massive sites some support, baby!) - Fixed
config.siteRootto be more reliable, but must no longer contain a sub route (it will be stripped) - React Router now uses
config.basePathfor itsbasenameprop - History instances now use
config.basePathfor thebasenameoption - Moved the codegen for
react-static-routesto its own file - Added
maximum-scale=1to the default document component's viewport meta - More reliable handling of path slashes throughout the codebase
- Added react
keyprops to head scripts, links and preloads
- Scrolling to a hash is now more accurate, especially if the page reflows during mid scroll.
- Added documentation website that is built with
gitdocs. Still a few kinks to work out. - Updated build-with site list
- All
.gitignorefiles are now uniform to not include the.until copied during creation - Fixed an import typo with the
sassexample - Added a basic error logging handler for universally-code-split components
- Various upkeep items on the Netlify-CMS example
- CLI now uses
commander - Disabled code-splitting in dev mode. This fixes a majority of problems with react-hot-loader without requiring users to make a ton of changes to their exports.
- CLI now supports using a
.gitaddress to clone for the template.
- Fixed
componentstyle render props from not passing children
Router.scrollToHashOffsetprop allows for setting an offset for hash scrolling now :)- Added
netlify-cmsexample.
- Squashed some bugs
- Removed the various
extract-hocrelated babel plugins in favor of the newreact-hot-loaderversion 4.
- Added
--stagingCLI argument toreact-static buildthat does not perform build-time optimizations like siteRoot replacement on links assets, etc. If you are testing your site locally, you will likely want to use this option to allow your production site to be navigable on localhost.
- Automatic Route Splitting. From here on out as long a project is using the automatic component-based static routing, all route templates will be automatically deduped and split into separate modules. These modules are statically-rendered into every page that uses them, are preloaded asynchronously with React-Static built-in prefetching utiliies, and are also loaded on demand if needed as the client navigates through your site. Carry on!
- Automatic prefetching of templates and assets. Any eligible
Linkcomponent to a code/data-split destination will automatically queue a prefetch for the appropriate assets. - Render prop versions of
withRouteDataandwithSiteDataare now available asRouteDataandSiteData. These support inline access to their respective props, instead of having to set up an HOC. They also support all three major render prop syntaxes, so render those props however you want!. See the README for more information. - Added a new
Loadingrender prop component and a companionwithLoadingHOC component to easily display React-Static's loading state (that probably won't happen much, but still... ;). - Added a new
Loading/withLoadingrender prop / HOC component pair. You can render this component to gain access to theloadingprop, which was previously only accessible via theRouter.subscribecallback. - Path changes now automatically scroll to the top of the page. Duration defaults to
0ms, but can be modifed via thescrollToTopDurationprop on theRoutercomponent. - Hash routing changes now automatically scroll to the element (or top of the page if the hash is removed but the path stays the same). Duration defaults to
800ms, but can be modifed via thescrollToHashDurationprop on theRoutercomponent.
- In some previous scenarios the window's
location.searchwould be taken into account when matching a path. That is now not the case. You could never previously rely on URL parameters for static paths, but now we're letting you know :) - The
getRoutePropsandgetSiteDataHOC's have both been renamed towithRouteDataandwithSiteData. Using the old methods will result in a deprecation notice and a broken app. Luckily this is an easy find and replace :) Router.subscribehas been deprecated. Though, if you still need programmatic access to a loading event, you can use the newonLoadingsubscriber that functions the same way.
- In your components:
- Replace all instances of
getRoutePropswithwithRouteData - Replace all instances of
getSitePropswithwithSiteData - Replace all instances of
Router.subscribewithonLoading, and importonLoading.
- Replace all instances of
- In your
static.config.js:- Replace all instances of
getPropswithgetData - Replace
getSitePropswithgetSiteData - If you are using a custom
Documentbe sure to replace thesitePropsprop withsiteData.
- Replace all instances of
- Note: To take advantage of auto-code-splitting, you cannot use custom routing for your static routes. I suggest migrating to the automatic routing strategy asap.
getRoutePropswas fixed to always have access to the router props, thus supportinggetRoutePropsas nested components instead of top-level page components.
- Node version was rolled back to
<=6.10.0, to allow some existing users continued usage.
- Preact can now be used in production by setting
preact: truein yourstatic.config.js! Remember to useReactDOM.renderinstead ofhydratein production too :) - Added the
preactexample.
getRoutePropsnow functions as it should when it's wrapped component receives new props without remounting. (Thanks @EmilTholin!)- Node
>=7.5.0<=6.10.0is now stated as required, instead of implied. - When building for
nodestage, themainis now preferred in package imports, instead ofmodule - Better module resolution locations, which allows overriding react-static module versions by installing them locally.
- Added Firebase Authentication example (Thanks @deden!)
- Better error logging for unhandled promise rejections
- Handle Routes with spaces (Thanks @etimberg!)
- Add shouldPrefetch() method to avoid setting loading state (Thanks @chrisbrown-io!)
- Pass DOM props through in links (Thanks @denis-sokolov!)
- Pass additional CLI arguments through to getSiteData() (Thanks @etimberg!)
- Common props returned by
getRouteProps(props that===one another) now promoted to shared props and only requested once per session. Learn more in the docs: Automatic Data and Prop Splitting. Depending on your site, this may significantly decrease site bandwidth and increase both initial page load speed and subsequent page load performance.
<Routes>now accepts a render prop for custom rendering of automatic routes.- Added
animated-routesexample.
LinkandNavLinknow properly render hash links and external links. (Thanks @denis-sokolov!)sassexample now uses a proper webpack loader configuration for style extraction. (Thanks @talves!)
LinkandNavLinknow properly render hash links and external links. (Thanks @denis-sokolov!)sassexample now uses a proper webpack loader configuration for style extraction. (Thanks @talves!)
- Added
sassexample. (Thanks @2metres!) - Added
glamorous-tailwindexample. (Thanks @deden!) - The
REACT_STATIC_ENVenvironment variable is now used internally (and set deterministically via usage of thestartandbuildcommands) instead ofNODE_ENV. This means you can finally set your ownNODE_ENVvariables and use tools likecross-env. Yay!
- Fixed some misleading phrasing where a route component path could be assumed to be compatible with a class, function, or react component, when in fact it is the path to that. (Thanks @Jonarod!)
config.path.srcis now taken into account when constructing theconfig.path.entrypath. (Thanks @crubier!)- Added
manta.lifeto list of sites built with React Static. (Thanks @hql287!) - Updated the
graphql-requestexample to usereact-markdowninstead ofdangerouslySetInnterHTML. (Thanks @hmeissner!)
- Added
graphql-requestexample. (Thanks @ChrisNLott!)
- Use ReactDOM.render instead of ReactDOM.hydrate in dev (Thanks @EmilTholin!)
- Cordova example's
resdirectory is no longer included in the npm distribution making releases and installations much faster.
- Fixed a bug where windows users could not serve or build a project. (Thanks @karland!)
- Fixed a bug where some directories or files weren't being included in npm distributions
- Fixed a bug where component names with numbers would not render propertly. (Thanks @muloka!)
config.paths.devDistcan now be set to specify a different scratch output directory when in development mode.
react-static-routesimports are now relative, thus avoiding absolute path madness... hopefully? :)
- Added Probot to the github repo! Hooray!
- Better yarn/npm colors in cli. @cgmx
- Router now uses
componentDidCatchto gracefully display runtime errors for you.
react-static-routesnow uses dynamic template imports. @EmilTholin- Helmet meta tags are more reliably extracted. @EmilTholin
- Config server is no longer served separately, but piggybacks on webpack dev server. @rileylnapier
- Added
config.paths, which can now be used to customizedistfolder location and other file locations used by react-static - Added
onStarthook. Fires after the first successful dev build when runningreact-static start - Added
onBuildhook. Fires after a successful production build when runningreact-static build - Added
config.devServer, which can be used to customize the configuration for the webpack-dev-server used in development. (Thanks @rywils21!) - Added TypeScript typings for React-Static core exports (Thanks @D1no!)
- Allow customization of dev server PORT and HOST via those environment variables. (Thanks @rywils21!)
config.getRoutesis no longer required and will default to exporting a single root path.- Webpack configurations can now be exported and used externally. (Thanks @crubier!)
<Root>component now supports atypeprop that can be:browser,hash, ormemory, which defines which type ofhistoryobject to create and use internally. Useful for non-web environments or situations where your app will be accessed in a filesystem or nested domain as opposed to a web server.- Added Redux example (Thanks @crubier!)
- Added Apollo GraphQL example (Thanks @crubier!)
- Added Redux + Apollo example (Thanks @crubier!)
- Added Typscript example (Thanks @D1no!)
- The
Document's<title>tag can now be used as a fallback to any<title>tag produced via the<Head>component. (Thanks @EmilTholin!) - Fixed a bug where not defining a 404 component resulted in an error during production build. (Thanks @mplis!)
- Fixed a bug where the webpack dev server would rebuild the app multiple times in a row when started up for the first time. (Thanks @cgmx!)
- The
webpackfunction instatic.config.jshas a new function signature.- Each function is now not required to return a new config object. If a falsey value is returned, the transformation will be ignored, and the next transformation will carry on as normal. Even so, avoid mutating the config object at all costs ;)
- A new argument is now available in the
argsparameter calleddefaultLoaders:
These loaders are here for convenience. Please read the documentation for more information.webpack: ( config, { defaultLoaders: { jsLoader, cssLoader, fileLoader } } ) => {...}
- A dynamic code-splitting example and typescript example are now available! Huzzah!
- Webpack files are now hashed for better cache invalidation. It's about time right?!
- Your
index.jsfile must now export your app in NON-JSX form, eg.export default App, not<App />. With this change, builds can be faster, leaner, and have more control over the build pipeline. - The optional
Htmlcomponent instatic.config.jswas renamed toDocument. - The
preRenderMetaandpostRenderMetahooks instatic.config.jshave been deprecated in favor of the newrenderToHtmlhook. This is a very important change, so please check the readme if you are using these hooks! - The new
renderToHtmlhook now uses a mutable meta object. This object is passed as a prop to the baseDocumentcomponent asrenderMetanow, instead of the previousstaticMeta.
- New
PrefetchWhenSeencomponent allows for prefetching when component becomes visible in the viewport.
- Exporting is now up to 2x faster after switching from a dual pass to a single pass render strategy.
- Fixed a very elusive and angering bug where imported node_modules were not being shared between the node context and the node webpack build of the app used for exporting.
- The
webpackfunction instatic.config.jshas a new function signature.- The new value can be an array of functions or a single function.
- Each function passed will receive the previous resulting (or built-in) webpack config, and expect a modified or new config to be returned. See Webpack Config and Plugins
Now that the webpack callback accepts an array of transformer functions, the concept of plugins has been introduced. These transformer functions are applied in order from top to bottom and have total control over the webpack config. For more information see Webpack Config and Plugins
webpack: [
withCssLoader,
withFileLoader
]
All route exporting is now done via a node bundle that is packaged with webpack. This should dramatically increase reliability in customization and cross-platform usability.