{"id":13518278,"url":"https://github.com/gajus/isomorphic-webpack","last_synced_at":"2025-04-09T10:07:41.605Z","repository":{"id":57278133,"uuid":"67798148","full_name":"gajus/isomorphic-webpack","owner":"gajus","description":"Abstracts universal consumption of application code base using webpack.","archived":false,"fork":false,"pushed_at":"2017-08-22T07:09:24.000Z","size":120,"stargazers_count":291,"open_issues_count":20,"forks_count":16,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-02T05:09:35.565Z","etag":null,"topics":["isomorphic","universal","webpack"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gajus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-09T12:44:35.000Z","updated_at":"2024-01-04T16:07:26.000Z","dependencies_parsed_at":"2022-09-18T14:32:01.606Z","dependency_job_id":null,"html_url":"https://github.com/gajus/isomorphic-webpack","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gajus%2Fisomorphic-webpack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gajus%2Fisomorphic-webpack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gajus%2Fisomorphic-webpack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gajus%2Fisomorphic-webpack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gajus","download_url":"https://codeload.github.com/gajus/isomorphic-webpack/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248018060,"owners_count":21034048,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["isomorphic","universal","webpack"],"created_at":"2024-08-01T05:01:43.135Z","updated_at":"2025-04-09T10:07:41.577Z","avatar_url":"https://github.com/gajus.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"\u003ca name=\"isomorphic-webpack\"\u003e\u003c/a\u003e\n# isomorphic-webpack\n\n[![Travis build status](http://img.shields.io/travis/gajus/isomorphic-webpack/master.svg?style=flat-square)](https://travis-ci.org/gajus/isomorphic-webpack)\n[![Coveralls](https://img.shields.io/coveralls/gajus/isomorphic-webpack.svg?style=flat-square)](https://coveralls.io/github/gajus/isomorphic-webpack)\n[![NPM version](http://img.shields.io/npm/v/isomorphic-webpack.svg?style=flat-square)](https://www.npmjs.org/package/isomorphic-webpack)\n[![Canonical Code Style](https://img.shields.io/badge/code%20style-canonical-blue.svg?style=flat-square)](https://github.com/gajus/canonical)\n[![Twitter Follow](https://img.shields.io/twitter/follow/kuizinas.svg?style=social\u0026label=Follow)](https://twitter.com/kuizinas)\n\n\u003cimg src='https://cdn.rawgit.com/gajus/isomorphic-webpack/master/.README/isomorphic-webpack.svg' height='200' alt='isomorphic-webpack' /\u003e\n\n`isomorphic-webpack` is a program that runs server-side and enables rendering of the same code base client- and server-side.\n\nPut it another way, it is a service for rendering webpack applications server-side. All that can be rendered client-side (e.g. React, Angular, etc. applications) will be processed server-side and served as static HTML.\n\nTry it!\n\n```bash\ngit clone git@github.com:gajus/isomorphic-webpack-demo.git\ncd ./isomorphic-webpack-demo\nnpm install\nexport DEBUG=express:application,isomorphic-webpack\nnpm start\n```\n\nThis will start the server on http://127.0.0.1:8000/.\n\n```bash\n$ curl http://127.0.0.1:8000/\n\n\u003c!doctype html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\u003c/head\u003e\n  \u003cbody\u003e\n    \u003cdiv id='app'\u003e\n      \u003cdiv class=\"app-___style___greetings\" data-reactroot=\"\" data-reactid=\"1\" data-react-checksum=\"72097819\"\u003eHello, World!\u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003cscript src='/static/app.js'\u003e\u003c/script\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n\n\u003ca name=\"isomorphic-webpack-goals\"\u003e\u003c/a\u003e\n## Goals\n\n* Only one running node process. ✅\n* Does not require a separate webpack configuration. ✅\n* [Enables use of all webpack loaders](#isomorphic-webpack-faq-how-to-use-webpack-loader-loader). ✅\n* [Server-side hot reloading of modules](#how-does-the-hot-reloading-work). ✅\n* [Stack trace support](https://github.com/gajus/isomorphic-webpack/issues/4). ✅\n* [Prevent serving stale data](#how-to-delay-request-handling-while-compilation-is-in-progress). ✅\n\n---\n\n\u003ca name=\"isomorphic-webpack-table-of-contents\"\u003e\u003c/a\u003e\n## Table of contents\n\n* [Goals](#isomorphic-webpack-goals)\n* [Table of contents](#isomorphic-webpack-table-of-contents)\n* [Setup](#isomorphic-webpack-setup)\n    * [High-level abstraction](#isomorphic-webpack-setup-high-level-abstraction)\n        * [API](#isomorphic-webpack-setup-high-level-abstraction-api)\n        * [Isomorphic webpack configuration](#isomorphic-webpack-setup-high-level-abstraction-isomorphic-webpack-configuration)\n* [Handling errors](#isomorphic-webpack-handling-errors)\n* [Reading list](#isomorphic-webpack-reading-list)\n* [FAQ](#isomorphic-webpack-faq)\n    * [How to get started?](#isomorphic-webpack-faq-how-to-get-started)\n    * [How does `isomorphic-webpack` work?](#isomorphic-webpack-faq-how-does-isomorphic-webpack-work)\n    * [How to use webpack `*-loader` loader?](#isomorphic-webpack-faq-how-to-use-webpack-loader-loader)\n    * [How does the hot-reloading work?](#isomorphic-webpack-faq-how-does-the-hot-reloading-work)\n    * [How to differentiate between Node.js and browser environment?](#isomorphic-webpack-faq-how-to-differentiate-between-node-js-and-browser-environment)\n    * [How to enable logging?](#isomorphic-webpack-faq-how-to-enable-logging)\n    * [How to subscribe to compiler events?](#isomorphic-webpack-faq-how-to-subscribe-to-compiler-events)\n    * [How to delay route initialisation until the first successful compilation?](#isomorphic-webpack-faq-how-to-delay-route-initialisation-until-the-first-successful-compilation)\n    * [How to delay request handling while compilation is in progress?](#isomorphic-webpack-faq-how-to-delay-request-handling-while-compilation-is-in-progress)\n    * [What makes `isomorphic-webpack` different from `webpack-isomorphic-tools`, `universal-webpack`, ...?](#isomorphic-webpack-faq-what-makes-isomorphic-webpack-different-from-webpack-isomorphic-tools-universal-webpack)\n    * [I thought we agreed to use the term \"universal\"?](#isomorphic-webpack-faq-i-thought-we-agreed-to-use-the-term-universal)\n\n\n\u003ca name=\"isomorphic-webpack-setup\"\u003e\u003c/a\u003e\n## Setup\n\n\u003ca name=\"isomorphic-webpack-setup-high-level-abstraction\"\u003e\u003c/a\u003e\n### High-level abstraction\n\n```js\nimport {\n\tcreateIsomorphicWebpack\n} from 'isomorphic-webpack';\nimport webpackConfiguration from './webpack.configuration';\n\ncreateIsomorphicWebpack(webpackConfiguration);\n\n```\n\n\u003ca name=\"isomorphic-webpack-setup-high-level-abstraction-api\"\u003e\u003c/a\u003e\n#### API\n\n```js\n/**\n * @see https://webpack.js.org/configuration/\n */\ntype WebpackConfigurationType = Object;\n\n/**\n * @see https://github.com/gajus/gitdown#isomorphic-webpack-setup-high-level-abstraction-isomorphic-webpack-configuration\n */\ntype UserIsomorphicWebpackConfigurationType = {\n  useCompilationPromise?: boolean\n};\n\ntype IsomorphicWebpackType = {|\n  /**\n   * @see https://webpack.github.io/docs/node.js-api.html#compiler\n   */\n  +compiler: Compiler,\n  +createCompilationPromise: Function,\n  +evalBundleCode: Function,\n  +formatErrorStack: Function\n|};\n\ncreateIsomorphicWebpack(webpackConfiguration: WebpackConfigurationType, isomorphicWebpackConfiguration: UserIsomorphicWebpackConfigurationType): IsomorphicWebpackType;\n\n```\n\n\u003ca name=\"isomorphic-webpack-setup-high-level-abstraction-isomorphic-webpack-configuration\"\u003e\u003c/a\u003e\n#### Isomorphic webpack configuration\n\n```json\n{\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"nodeExternalsWhitelist\": {\n      \"description\": \"An array of paths to whitelist in the webpack `external` configuration. The default behaviour is to externalise all modules present in the `node_modules/` directory.\",\n      \"items\": {\n        \"oneOf\": [\n          {\n            \"type\": \"string\"\n          },\n          {\n            \"instanceof\": \"RegExp\"\n          }\n        ]\n      },\n      \"type\": \"array\"\n    },\n    \"useCompilationPromise\": {\n      \"description\": \"Toggles compilation observer. Enable this feature to use `createCompilationPromise`.\",\n      \"type\": \"boolean\"\n    }\n  },\n  \"type\": \"object\"\n}\n\n```\n\nIf you have a requirement for a configuration, [raise an issue](https://github.com/gajus/isomorphic-webpack/issues/new?title=configuration%20request:\u0026body=configuration%20name:%0aconfiguration%20use%20case:%0adefault%20value:) describing your use case.\n\n\u003ca name=\"isomorphic-webpack-handling-errors\"\u003e\u003c/a\u003e\n## Handling errors\n\nWhen a runtime error originates in a bundle, the stack trace refers to the code executed in the bundle ([#4](https://github.com/gajus/isomorphic-webpack/issues/4)).\n\nUse [`formatErrorStack`](#api) to replace references to the VM code with the references resolved using the sourcemap, e.g.\n\n```js\nconst {\n  formatErrorStack\n} = createIsomorphicWebpack(webpackConfiguration);\n\napp.get('*', isomorphicMiddleware);\n\napp.use((err, req, res, next) =\u003e {\n  console.error(formatErrorStack(err.stack));\n});\n```\n\n```diff\nReferenceError: props is not defined\n-   at TopicIndexContainer (evalmachine.\u003canonymous\u003e:485:15)\n+   at TopicIndexContainer (/src/client/containers/TopicIndexContainer/index.js:14:14)\n    at WrappedComponent (/node_modules/react-css-modules/dist/wrapStatelessFunction.js:55:38)\n    at /node_modules/react-dom/lib/ReactCompositeComponent.js:306:16\n    at measureLifeCyclePerf (/node_modules/react-dom/lib/ReactCompositeComponent.js:75:12)\n    at ReactCompositeComponentWrapper._constructComponentWithoutOwner (/node_modules/react-dom/lib/ReactCompositeComponent.js:305:14)\n    at ReactCompositeComponentWrapper._constructComponent (/node_modules/react-dom/lib/ReactCompositeComponent.js:280:21)\n    at ReactCompositeComponentWrapper.mountComponent (/node_modules/react-dom/lib/ReactCompositeComponent.js:188:21)\n    at Object.mountComponent (/node_modules/react-dom/lib/ReactReconciler.js:46:35)\n    at /node_modules/react-dom/lib/ReactServerRendering.js:45:36\n    at ReactServerRenderingTransaction.perform (/node_modules/react-dom/lib/Transaction.js:140:20)\n```\n\nNote: References to a generated code that cannot be resolved in a source map are ignored ([#5](https://github.com/gajus/isomorphic-webpack/issues/5)).\n\n\n\u003ca name=\"isomorphic-webpack-reading-list\"\u003e\u003c/a\u003e\n## Reading list\n\n* [Developing isomorphic applications using webpack](https://medium.com/@gajus/developing-isomorphic-applications-using-webpack-eca814a418ad#.17l1qc77j). Introduction to `isomorphic-webpack`, how to use webpack loaders and dependencies that depend on the browser environment.\n* [isomorphic-webpack - Universal module consumption using webpack - Interview with Gajus Kuizinas](http://survivejs.com/blog/isomorphic-webpack-interview/).\n\n\u003ca name=\"isomorphic-webpack-faq\"\u003e\u003c/a\u003e\n## FAQ\n\n\u003ca name=\"isomorphic-webpack-faq-how-to-get-started\"\u003e\u003c/a\u003e\n### How to get started?\n\nThe easiest way to start is to analyse the demo application.\n\nTo start the server:\n\n```bash\ngit clone git@github.com:gajus/isomorphic-webpack-demo.git\ncd ./isomorphic-webpack-demo\nnpm install\nexport DEBUG=express:application,isomorphic-webpack\nnpm start\n```\n\nThis will start the server on http://127.0.0.1:8000/.\n\n```bash\nopen http://127.0.0.1:8000/\n```\n\n\u003ca name=\"isomorphic-webpack-faq-how-does-isomorphic-webpack-work\"\u003e\u003c/a\u003e\n### How does \u003ccode\u003eisomorphic-webpack\u003c/code\u003e work?\n\nRefer to the [Low-level abstraction](#isomorphic-webpack-setup-low-level-abstraction) documentation.\n\n\u003ca name=\"isomorphic-webpack-faq-how-to-use-webpack-loader-loader\"\u003e\u003c/a\u003e\n### How to use webpack \u003ccode\u003e*-loader\u003c/code\u003e loader?\n\n\u003e Loaders allow you to preprocess files as you require() or \"load\" them. [..] Loaders can transform files from a different language like, CoffeeScript to JavaScript, or inline images as data URLs.\n\n– https://webpack.github.io/docs/loaders.html\n\n`isomorphic-webpack` is simulating the browser environment to evaluate loaders that are designed to run in a browser, e.g. [`style-loader`](https://github.com/webpack/style-loader). Therefore, all webpack loaders work out of the box with `isomorphic-webpack`.\n\nIf you have found a loader that does not work, [report an issue](https://github.com/gajus/isomorphic-webpack/issues/new?title=[bug]%20loader%20X%20does%20work\u0026body=The%20following%20X%20loader%20configuration%20Y%20is%20producing%20the%20following%20error%20Z.).\n\n\u003ca name=\"isomorphic-webpack-faq-how-does-the-hot-reloading-work\"\u003e\u003c/a\u003e\n### How does the hot-reloading work?\n\nI have been asked a question:\n\n\u003e I have setup https://github.com/gajus/isomorphic-webpack-demo and\n\u003e navigated to http://127.0.0.1:8000/. It printed 'Hello, World!'.\n\u003e\n\u003e Then I have changed `./src/app/index.js` to say `Hello, HRM!`.\n\u003e I was expecting the message 'Hello, World!' to change to 'Hello, HMR!'\n\u003e in the already open browser window. However, it didn't.\n\u003e\n\u003e The message changed to 'Hello, HRM!' only after I have refreshed the browser window.\n\u003e\n\u003e How is this hot-reloading?\n\nI have used the term \"hot-reloading\" to describe a process where the webpack\nbundle is rebuilt every time a file in the project changes. The change will be\nvisible on the next HTTP request.\n\nIt is \"hot-reloading\" in a sense that you do not need to restart the HTTP\nserver every time you make a change to the application.\n\nThere is no logic that would force-refresh the page on completion of the compilation.\nThere are several ways to achieve this, e.g. using a custom script that queries the backend.\nHowever, this does logic does not belong in `isomorphic-webpack`.\n\nThe purpose of the server-side rendering is to generate HTML response to a HTTP request.\n`isomorphic-webpack` does perform hot-reloading that satisfies this use case.\n\nThe primary purpose of hot module reloading (HRM) is to enable better\ndeveloper experience. Given that it is a development feature, it is safe to assume\nthat the developer is in control over the development environment.\nTherefore, to achieve HMR you need to implement the logic in your frontend application\nand configure webpack as described in the [Hot module replacement with webpack](https://github.com/webpack/docs/wiki/hot-module-replacement-with-webpack) guide.\n\n\u003ca name=\"isomorphic-webpack-faq-how-to-differentiate-between-node-js-and-browser-environment\"\u003e\u003c/a\u003e\n### How to differentiate between Node.js and browser environment?\n\nCheck for presence of `ISOMORPHIC_WEBPACK` variable.\n\nPresence of `ISOMORPHIC_WEBPACK` indicates that code is executed using Node.js.\n\n```js\nif (typeof ISOMORPHIC_WEBPACK === 'undefined') {\n\t// Browser\n} else {\n\t// Node.js\n}\n```\n\n\u003ca name=\"isomorphic-webpack-faq-how-to-enable-logging\"\u003e\u003c/a\u003e\n### How to enable logging?\n\n`isomorphic-webpack` is using [`debug`](https://www.npmjs.com/package/debug) to log messages.\n\nTo enable logging, export `DEBUG` environment variable:\n\n```sh\nexport DEBUG=isomorphic-webpack:*\n```\n\n\u003ca name=\"isomorphic-webpack-faq-how-to-subscribe-to-compiler-events\"\u003e\u003c/a\u003e\n### How to subscribe to compiler events?\n\nUsing `createIsomorphicWebpack` result has a `compiler` property. `compiler` is an instance of a webpack [`Compiler`](https://webpack.github.io/docs/node.js-api.html#compiler). Use it to subscribe to all compiler events.\n\n\u003ca name=\"isomorphic-webpack-faq-how-to-delay-route-initialisation-until-the-first-successful-compilation\"\u003e\u003c/a\u003e\n### How to delay route initialisation until the first successful compilation?\n\nSee also:\n\n* [How to delay request handling while compilation is in progress?](#isomorphic-webpack-faq-how-to-delay-request-handling-while-compilation-is-in-progress)\n\nAttempting to render a route server-side before the compiler has completed at least one compilation will produce an error, e.g.\n\n```diff\n+SyntaxError: /src/app/style.css: Unexpected token (1:0)\n+\u003e 1 | .greetings {\n+    | ^\n+  2 |   font-weight: bold;\n+  3 | }\n+  4 |\n    at Parser.pp$5.raise (/node_modules/babylon/lib/index.js:4246:13)\n    at Parser.pp.unexpected (/node_modules/babylon/lib/index.js:1627:8)\n    at Parser.pp$3.parseExprAtom (/node_modules/babylon/lib/index.js:3586:12)\n    at Parser.parseExprAtom (/node_modules/babylon/lib/index.js:6402:22)\n    at Parser.pp$3.parseExprSubscripts (/node_modules/babylon/lib/index.js:3331:19)\n    at Parser.pp$3.parseMaybeUnary (/node_modules/babylon/lib/index.js:3311:19)\n    at Parser.pp$3.parseExprOps (/node_modules/babylon/lib/index.js:3241:19)\n    at Parser.pp$3.parseMaybeConditional (/node_modules/babylon/lib/index.js:3218:19)\n    at Parser.pp$3.parseMaybeAssign (/node_modules/babylon/lib/index.js:3181:19)\n    at Parser.parseMaybeAssign (/node_modules/babylon/lib/index.js:5694:20)\n```\n\nThe error will vary depending on what loaders your application code depends on.\n\nTherefore, it is desirable to delay the first server-side render until the compiler has completed at least one compilation.\n\n```js\nconst {\n  compiler\n} = createIsomorphicWebpack(webpackConfiguration);\n\nlet routesAreInitialized;\n\ncompiler.plugin('done', () =\u003e {\n  if (routesAreInitialized) {\n    return;\n  }\n\n  routesAreInitialized = true;\n\n  app.get('/', isomorphicMiddleware);\n});\n\n```\n\nThis pattern is demonstrated in the [isomorphic-webpack-demo](https://github.com/gajus/isomorphic-webpack-demo/blob/master/src/bin/server.js#L29-L43).\n\n\u003ca name=\"isomorphic-webpack-faq-how-to-delay-request-handling-while-compilation-is-in-progress\"\u003e\u003c/a\u003e\n### How to delay request handling while compilation is in progress?\n\nSee also:\n\n* [How to delay route initialisation until the first successful compilation?](#isomorphic-webpack-faq-how-to-delay-route-initialisation-until-the-first-successful-compilation)\n\n\u003e WARNING!\n\u003e\n\u003e Do not use this in production. This implementation has a large overhead.\n\nIt might be desirable to stall HTTP request handling until whatever in-progress compilation has completed.\nThis ensures that during the development you do not receive a stale response.\n\nTo achieve this:\n\n* Enable compilation observer using `useCompilationPromise` configuration.\n* Use `createCompilationPromise` to create a promise that resolves when a current compilation completes.\n* Use the resulting promise to create a middleware that queues all HTTP requests until the promise is resolved.\n\n\u003e Note:\n\u003e\n\u003e You must enable this feature using `useCompilationPromise` configuration.\n\u003e\n\u003e If you use `createCompilationPromise` without configuring `useCompilationPromise`,\n\u003e you will get an error:\n\u003e\n\u003e \"createCompilationPromise\" feature has not been enabled.\n\nExample usage:\n\n```js\nconst {\n  createCompilationPromise\n} = createIsomorphicWebpack(webpackConfiguration, {\n  useCompilationPromise: true\n});\n\napp.use(async (req, res, next) =\u003e {\n  await createCompilationPromise();\n\n  next();\n});\n\napp.get('/', isomorphicMiddleware);\n\n```\n\n\u003ca name=\"isomorphic-webpack-faq-what-makes-isomorphic-webpack-different-from-webpack-isomorphic-tools-universal-webpack\"\u003e\u003c/a\u003e\n### What makes \u003ccode\u003eisomorphic-webpack\u003c/code\u003e different from \u003ccode\u003ewebpack-isomorphic-tools\u003c/code\u003e, \u003ccode\u003euniversal-webpack\u003c/code\u003e, ...?\n\n|Feature|`isomorphic-webpack`|[`webpack-isomorphic-tools`](https://github.com/halt-hammerzeit/webpack-isomorphic-tools)|[`universal-webpack`](https://github.com/halt-hammerzeit/universal-webpack)|\n|---|---|---|---|\n|Only one running node process.|✅|❌|❌|\n|Does not require a separate webpack configuration.|✅|❌|❌|\n|Enables use of all webpack loaders.|✅|❌|❌|\n|Server-side hot reloading of modules.|✅|✅|✅|\n|Supports stack trace.|✅|❌|❌|\n|Prevents serving stale data.|✅|❌|❌|\n|Does not override Node.js `require()`.|✅|❌|✅|\n|Uses webpack [`target: \"node\"`](https://webpack.github.io/docs/configuration.html#target).|✅|❌|✅|\n|Provides [low-level API](./.README/LOW-LEVEL_ABSTRACTION.md).|✅|❌|❌|\n\nFrom a subjective perspective, `isomorphic-webpack` is a lot easier to setup than any of the existing alternatives.\n\n\u003e I apologise in advance if I have misrepresented either of the frameworks.\n\u003e\n\u003e Contact me to correct an error in the above comparison table, if you'd like to\n\u003e add another comparison criteria, or to add another framework.\n\n\u003ca name=\"isomorphic-webpack-faq-i-thought-we-agreed-to-use-the-term-universal\"\u003e\u003c/a\u003e\n### I thought we agreed to use the term \u0026quot;universal\u0026quot;?\n\n\u003e TL;DR: **Isomorphism** is the functional aspect of seamlessly switching between client- and server-side rendering without losing state. **Universal** is a term used to emphasize the fact that a particular piece of JavaScript code is able to run in multiple environments.\n\n– https://medium.com/@ghengeveld/isomorphism-vs-universal-javascript-4b47fb481beb#.h7fikpuyk\n\n`isomorphic-webpack` is a program that runs server-side and enables rendering of the same code base client- and server-side.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgajus%2Fisomorphic-webpack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgajus%2Fisomorphic-webpack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgajus%2Fisomorphic-webpack/lists"}