systemjs-hot-reloader-ex
Advanced tools
+20
| The MIT License (MIT) | ||
| Copyright (c) 2016 Artem Butusov | ||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | ||
| this software and associated documentation files (the "Software"), to deal in | ||
| the Software without restriction, including without limitation the rights to | ||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||
| the Software, and to permit persons to whom the Software is furnished to do so, | ||
| subject to the following conditions: | ||
| The above copyright notice and this permission notice shall be included in all | ||
| copies or substantial portions of the Software. | ||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||
| FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -27,9 +27,14 @@ 'use strict'; | ||
| this.loader = opts.loader || SystemJS || System; | ||
| this.logLevel = opts.loader === undefined ? 2 : opts.logLevel; | ||
| this.logger = this.createLogger('HMR'); | ||
| if (!this.loader) { | ||
| throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS'); | ||
| } | ||
| if (this.loader.hotReloaderOptions) { | ||
| Object.assign(opts, this.loader.hotReloaderOptions); | ||
| } | ||
| this.logLevel = opts.logLevel === undefined ? 2 : opts.logLevel; | ||
| this.logger = this.createLogger('HMR'); | ||
| } | ||
@@ -36,0 +41,0 @@ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/SystemHotReloader.js"],"names":["SystemHotReloader","options","opts","loader","SystemJS","System","logLevel","undefined","logger","createLogger","Error","prefix","debug","message","console","info","error","warn","path","name1","normalizeSync","get","name2","name3","Object","keys","_loader","modules","find","name","startsWith","resolvePath","reloadModule","Promise","resolve","baseURL","substr","length","replace","moduleName","startTime","window","performance","now","cleanName","moduleChain","getReloadChain","moduleBackups","then","forEach","getModuleBackup","promise","reloadModuleInstance","exports","__reload","push","__unload","suffix","join","time","timeSecRound","Math","floor","catch","realError","originalErr","stack","backup","unload","reload","fixModuleDeps","restoreModuleBackup","deleteModule","importModule","moduleRecords","moduleRecord","dependencies","depModuleRecord","index","newDepModuleRecord","setters","impRecord","importers","record","import","impModuleRecord","delete","data","set","cache","distance","reduce","result","impDistance","getModuleDistanceToRoot","min","records","farNode","map","item","meta","nextModules","slice","splice","indexOf","nextResult","concat"],"mappings":"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","file":"SystemHotReloader.js","sourcesContent":["import 'core-js/shim';\n\nexport default class SystemHotReloader {\n /**\n * Constructor.\n *\n * @param {Object} options\n * @prop {Object} loader SystemJS instance, default to SystemJS || System\n * @prop {Number} logLevel 0 - none, 1 - error, 2 - info (default), 3 - debug\n */\n constructor(options) {\n const opts = options || {};\n\n this.loader = opts.loader || SystemJS || System;\n this.logLevel = opts.loader === undefined ? 2 : opts.logLevel;\n\n this.logger = this.createLogger('HMR');\n\n if (!this.loader) {\n throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS');\n }\n }\n\n /**\n * Create logger.\n */\n createLogger(prefix) {\n return {\n debug: (message) => {\n if (this.logLevel >= 3 && console && console.debug) {\n console.debug(`[${prefix}] ${message}`);\n }\n },\n info: (message) => {\n if (this.logLevel >= 2 && console && console.info) {\n console.info(`[${prefix}] ${message}`);\n }\n },\n error: (message) => {\n if (this.logLevel >= 1 && console && console.warn) {\n console.warn(`[${prefix}] ${message}`);\n }\n },\n };\n }\n\n /**\n * Resolve module file path to module name.\n */\n resolvePath(path) {\n // try obvious resolve filename.ext => filename.ext\n const name1 = this.loader.normalizeSync(path);\n if (this.loader.get(name1)) {\n return name1;\n }\n\n // try less obvious resolve filename.ext => filename.ext!\n const name2 = this.loader.normalizeSync(`${path}!`);\n if (this.loader.get(name2)) {\n return name2;\n }\n\n // try to find by filename path in all registered modules, slow :-(\n const name3 = Object.keys(this.loader._loader.modules).find((name) => {\n return name.startsWith(`${name1}!`);\n });\n if (name3) {\n return name3;\n }\n\n return undefined;\n }\n\n /**\n * Reload module by file path.\n */\n reloadPath(path) {\n this.logger.debug(`Reloading file: ${path}`);\n\n const name = this.resolvePath(path);\n\n if (name) {\n return this.reloadModule(name);\n }\n\n // we did not find module :-(\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n /**\n * Clean full module name from useless base url prefix and loader related suffix.\n */\n cleanName(name) {\n // remove base url prefix\n if (name.startsWith(this.loader.baseURL)) {\n name = `./${name.substr(this.loader.baseURL.length)}`;\n }\n\n // remove loader related garbage\n return name.replace(/!.*$/, '');\n }\n\n /**\n * Reload module by full module name.\n */\n reloadModule(moduleName) {\n const startTime = window.performance.now();\n\n this.logger.info(`Reloading module ${this.cleanName(moduleName)}`);\n\n if (!this.loader.get(moduleName)) {\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n const moduleChain = this.getReloadChain([moduleName]);\n const moduleBackups = {};\n\n return Promise.resolve()\n .then(() => {\n this.logger.debug('Reload chain:');\n moduleChain.forEach((name) => {\n this.logger.debug(` - ${this.cleanName(name)}`);\n });\n })\n .then(() => {\n this.logger.debug('Saving backup');\n moduleChain.forEach((name) => {\n moduleBackups[name] = this.getModuleBackup(name);\n });\n })\n .then(() => {\n let promise = Promise.resolve();\n moduleChain.forEach((name) => {\n promise = promise.then(() => this.reloadModuleInstance(name, moduleChain));\n });\n return promise;\n })\n .then(() => {\n if (moduleChain.length) {\n this.logger.info('Updated modules:');\n moduleChain.forEach((name) => {\n const exports = this.loader.get(name);\n const options = [];\n if (exports && exports.__reload) {\n options.push('__reload()');\n } else if (exports && exports.__unload) {\n options.push('__unload()');\n }\n const suffix = options.length ? `{ ${options.join(', ')} }` : '';\n this.logger.info(` - ${this.cleanName(name)} ${suffix}`);\n });\n } else {\n this.logger.info('Nothing to update');\n }\n\n const time = (window.performance.now() - startTime) / 1000;\n const timeSecRound = Math.floor(time * 100) / 100;\n this.logger.info(`Reload took ${timeSecRound} sec`);\n })\n .catch((error) => {\n if (error) {\n const realError = error.originalErr || error;\n this.logger.error(realError.stack || realError);\n }\n\n this.logger.error('An error occured during reloading. Reverting...');\n\n let promise = Promise.resolve();\n\n moduleChain.forEach((name) => {\n promise = promise.then(() => {\n return this.reloadModuleInstance(name, moduleChain, moduleBackups[name]);\n });\n });\n\n promise = promise.then(() => {\n this.logger.info('Application state was restored');\n });\n\n return promise;\n })\n .catch((error) => {\n if (error) {\n this.logger.error(error.stack || error);\n }\n this.logger.error('An unrecoverable error occured during reverting');\n });\n }\n\n /**\n * Reload module instance with option to reload from backup.\n */\n reloadModuleInstance(name, moduleChain, backup) {\n const exports = backup ? backup.exports : this.loader.get(name);\n\n const unload = exports ? exports.__unload : undefined;\n const reload = exports ? exports.__reload : undefined;\n\n if (reload) {\n return Promise.resolve()\n .then(() => this.fixModuleDeps(name))\n .then(() => reload(moduleChain));\n }\n\n return Promise.resolve()\n .then(() => (unload ? unload(moduleChain) : undefined))\n .then(() => (backup ? this.restoreModuleBackup(backup) : this.deleteModule(name)))\n .then(() => this.importModule(name));\n }\n\n /**\n * Fix module dependencies before hooked reload.\n */\n fixModuleDeps(name) {\n const moduleRecords = this.loader._loader.moduleRecords;\n\n const moduleRecord = moduleRecords[name];\n\n moduleRecord.dependencies\n .forEach((depModuleRecord, index) => {\n if (!depModuleRecord) {\n return;\n }\n\n const newDepModuleRecord = moduleRecords[depModuleRecord.name];\n\n if (!newDepModuleRecord) {\n return;\n }\n\n if (newDepModuleRecord !== depModuleRecord) {\n this.logger.debug(`Fixing dependency ${this.cleanName(depModuleRecord.name)} for module ${this.cleanName(moduleRecord.name)}`);\n\n moduleRecord.setters[index](newDepModuleRecord.exports);\n\n if (moduleRecord.dependencies[index] !== newDepModuleRecord.exports) {\n moduleRecord.dependencies[index] = newDepModuleRecord;\n }\n\n const impRecord = newDepModuleRecord.importers\n .find(record => record && record.name === moduleRecord);\n if (!impRecord) {\n newDepModuleRecord.importers.push(moduleRecord);\n }\n }\n });\n }\n\n /**\n * Import module.\n */\n importModule(name) {\n this.logger.debug(`Importing module ${this.cleanName(name)}`);\n return this.loader.import(name);\n }\n\n /**\n * Delete module and fix importers for dependencies.\n */\n deleteModule(name) {\n const moduleRecord = this.loader._loader.moduleRecords[name];\n\n if (moduleRecord) {\n moduleRecord.dependencies\n .forEach((depModuleRecord) => {\n if (!depModuleRecord) {\n return;\n }\n depModuleRecord.importers\n .forEach((impModuleRecord, index) => {\n if (impModuleRecord && moduleRecord.name === impModuleRecord.name) {\n this.logger.debug(`Removing importer ${this.cleanName(impModuleRecord.name)} from module ${this.cleanName(depModuleRecord.name)}`);\n depModuleRecord.importers[index] = null;\n }\n });\n });\n }\n\n this.logger.debug(`Removing module ${this.cleanName(name)}`);\n this.loader.delete(name);\n }\n\n /**\n * Get module backup which could be used to restore module state.\n */\n getModuleBackup(name) {\n const exports = this.loader.get(name);\n const record = this.loader._loader.moduleRecords[name];\n return { name, record, exports };\n }\n\n /**\n * Restore module from backup.\n */\n restoreModuleBackup(data) {\n this.loader.set(data.name, data.exports);\n this.loader._loader.moduleRecords[data.name] = data.record;\n }\n\n /**\n * Get shortest distance to the root module (root modules have no importers).\n */\n getModuleDistanceToRoot(name, record, cache) {\n let distance;\n if (cache[name] !== undefined) {\n return cache[name];\n }\n if (!record || !record.importers.length) {\n distance = 0;\n } else {\n distance = record.importers.reduce((result, impRecord) => {\n const impDistance = 1 + this.getModuleDistanceToRoot(impRecord.name, impRecord, cache);\n return result === null ? impDistance : Math.min(result, impDistance);\n }, null);\n }\n cache[name] = distance;\n return distance;\n }\n\n /**\n * Reduce dependency tree and return modules in the order they should be reloaded.\n */\n getReloadChain(modules, cache) {\n if (modules.length === 0) {\n return modules;\n }\n\n const records = this.loader._loader.moduleRecords;\n\n if (!cache) {\n cache = {};\n }\n\n const farNode = modules.reduce((result, name, index) => {\n const record = records[name] ? records[name] : undefined;\n const distance = this.getModuleDistanceToRoot(name, record, cache);\n const importers = !record ? [] : record.importers.map(item => item.name);\n const reload = record && record.exports && record.exports.__reload;\n const meta = { distance, index, name, importers, reload };\n if (result === undefined) {\n return meta;\n }\n return result.distance >= distance ? result : meta;\n }, undefined);\n\n const nextModules = modules.slice(0);\n nextModules.splice(farNode.index, 1);\n if (!farNode.reload) {\n farNode.importers.forEach((name) => {\n if (nextModules.indexOf(name) === -1) {\n nextModules.push(name);\n }\n });\n }\n\n const nextResult = this.getReloadChain(nextModules, cache);\n\n const result = [farNode.name].concat(nextResult);\n\n return result;\n }\n}\n"]} | ||
| {"version":3,"sources":["../src/SystemHotReloader.js"],"names":["SystemHotReloader","options","opts","loader","SystemJS","System","Error","hotReloaderOptions","Object","assign","logLevel","undefined","logger","createLogger","prefix","debug","message","console","info","error","warn","path","name1","normalizeSync","get","name2","name3","keys","_loader","modules","find","name","startsWith","resolvePath","reloadModule","Promise","resolve","baseURL","substr","length","replace","moduleName","startTime","window","performance","now","cleanName","moduleChain","getReloadChain","moduleBackups","then","forEach","getModuleBackup","promise","reloadModuleInstance","exports","__reload","push","__unload","suffix","join","time","timeSecRound","Math","floor","catch","realError","originalErr","stack","backup","unload","reload","fixModuleDeps","restoreModuleBackup","deleteModule","importModule","moduleRecords","moduleRecord","dependencies","depModuleRecord","index","newDepModuleRecord","setters","impRecord","importers","record","import","impModuleRecord","delete","data","set","cache","distance","reduce","result","impDistance","getModuleDistanceToRoot","min","records","farNode","map","item","meta","nextModules","slice","splice","indexOf","nextResult","concat"],"mappings":"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","file":"SystemHotReloader.js","sourcesContent":["import 'core-js/shim';\n\nexport default class SystemHotReloader {\n /**\n * Constructor.\n *\n * @param {Object} options\n * @prop {Object} loader SystemJS instance, default to SystemJS || System\n * @prop {Number} logLevel 0 - none, 1 - error, 2 - info (default), 3 - debug\n */\n constructor(options) {\n const opts = options || {};\n\n this.loader = opts.loader || SystemJS || System;\n\n if (!this.loader) {\n throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS');\n }\n\n if (this.loader.hotReloaderOptions) {\n Object.assign(opts, this.loader.hotReloaderOptions);\n }\n\n this.logLevel = opts.logLevel === undefined ? 2 : opts.logLevel;\n\n this.logger = this.createLogger('HMR');\n }\n\n /**\n * Create logger.\n */\n createLogger(prefix) {\n return {\n debug: (message) => {\n if (this.logLevel >= 3 && console && console.debug) {\n console.debug(`[${prefix}] ${message}`);\n }\n },\n info: (message) => {\n if (this.logLevel >= 2 && console && console.info) {\n console.info(`[${prefix}] ${message}`);\n }\n },\n error: (message) => {\n if (this.logLevel >= 1 && console && console.warn) {\n console.warn(`[${prefix}] ${message}`);\n }\n },\n };\n }\n\n /**\n * Resolve module file path to module name.\n */\n resolvePath(path) {\n // try obvious resolve filename.ext => filename.ext\n const name1 = this.loader.normalizeSync(path);\n if (this.loader.get(name1)) {\n return name1;\n }\n\n // try less obvious resolve filename.ext => filename.ext!\n const name2 = this.loader.normalizeSync(`${path}!`);\n if (this.loader.get(name2)) {\n return name2;\n }\n\n // try to find by filename path in all registered modules, slow :-(\n const name3 = Object.keys(this.loader._loader.modules).find((name) => {\n return name.startsWith(`${name1}!`);\n });\n if (name3) {\n return name3;\n }\n\n return undefined;\n }\n\n /**\n * Reload module by file path.\n */\n reloadPath(path) {\n this.logger.debug(`Reloading file: ${path}`);\n\n const name = this.resolvePath(path);\n\n if (name) {\n return this.reloadModule(name);\n }\n\n // we did not find module :-(\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n /**\n * Clean full module name from useless base url prefix and loader related suffix.\n */\n cleanName(name) {\n // remove base url prefix\n if (name.startsWith(this.loader.baseURL)) {\n name = `./${name.substr(this.loader.baseURL.length)}`;\n }\n\n // remove loader related garbage\n return name.replace(/!.*$/, '');\n }\n\n /**\n * Reload module by full module name.\n */\n reloadModule(moduleName) {\n const startTime = window.performance.now();\n\n this.logger.info(`Reloading module ${this.cleanName(moduleName)}`);\n\n if (!this.loader.get(moduleName)) {\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n const moduleChain = this.getReloadChain([moduleName]);\n const moduleBackups = {};\n\n return Promise.resolve()\n .then(() => {\n this.logger.debug('Reload chain:');\n moduleChain.forEach((name) => {\n this.logger.debug(` - ${this.cleanName(name)}`);\n });\n })\n .then(() => {\n this.logger.debug('Saving backup');\n moduleChain.forEach((name) => {\n moduleBackups[name] = this.getModuleBackup(name);\n });\n })\n .then(() => {\n let promise = Promise.resolve();\n moduleChain.forEach((name) => {\n promise = promise.then(() => this.reloadModuleInstance(name, moduleChain));\n });\n return promise;\n })\n .then(() => {\n if (moduleChain.length) {\n this.logger.info('Updated modules:');\n moduleChain.forEach((name) => {\n const exports = this.loader.get(name);\n const options = [];\n if (exports && exports.__reload) {\n options.push('__reload()');\n } else if (exports && exports.__unload) {\n options.push('__unload()');\n }\n const suffix = options.length ? `{ ${options.join(', ')} }` : '';\n this.logger.info(` - ${this.cleanName(name)} ${suffix}`);\n });\n } else {\n this.logger.info('Nothing to update');\n }\n\n const time = (window.performance.now() - startTime) / 1000;\n const timeSecRound = Math.floor(time * 100) / 100;\n this.logger.info(`Reload took ${timeSecRound} sec`);\n })\n .catch((error) => {\n if (error) {\n const realError = error.originalErr || error;\n this.logger.error(realError.stack || realError);\n }\n\n this.logger.error('An error occured during reloading. Reverting...');\n\n let promise = Promise.resolve();\n\n moduleChain.forEach((name) => {\n promise = promise.then(() => {\n return this.reloadModuleInstance(name, moduleChain, moduleBackups[name]);\n });\n });\n\n promise = promise.then(() => {\n this.logger.info('Application state was restored');\n });\n\n return promise;\n })\n .catch((error) => {\n if (error) {\n this.logger.error(error.stack || error);\n }\n this.logger.error('An unrecoverable error occured during reverting');\n });\n }\n\n /**\n * Reload module instance with option to reload from backup.\n */\n reloadModuleInstance(name, moduleChain, backup) {\n const exports = backup ? backup.exports : this.loader.get(name);\n\n const unload = exports ? exports.__unload : undefined;\n const reload = exports ? exports.__reload : undefined;\n\n if (reload) {\n return Promise.resolve()\n .then(() => this.fixModuleDeps(name))\n .then(() => reload(moduleChain));\n }\n\n return Promise.resolve()\n .then(() => (unload ? unload(moduleChain) : undefined))\n .then(() => (backup ? this.restoreModuleBackup(backup) : this.deleteModule(name)))\n .then(() => this.importModule(name));\n }\n\n /**\n * Fix module dependencies before hooked reload.\n */\n fixModuleDeps(name) {\n const moduleRecords = this.loader._loader.moduleRecords;\n\n const moduleRecord = moduleRecords[name];\n\n moduleRecord.dependencies\n .forEach((depModuleRecord, index) => {\n if (!depModuleRecord) {\n return;\n }\n\n const newDepModuleRecord = moduleRecords[depModuleRecord.name];\n\n if (!newDepModuleRecord) {\n return;\n }\n\n if (newDepModuleRecord !== depModuleRecord) {\n this.logger.debug(`Fixing dependency ${this.cleanName(depModuleRecord.name)} for module ${this.cleanName(moduleRecord.name)}`);\n\n moduleRecord.setters[index](newDepModuleRecord.exports);\n\n if (moduleRecord.dependencies[index] !== newDepModuleRecord.exports) {\n moduleRecord.dependencies[index] = newDepModuleRecord;\n }\n\n const impRecord = newDepModuleRecord.importers\n .find(record => record && record.name === moduleRecord);\n if (!impRecord) {\n newDepModuleRecord.importers.push(moduleRecord);\n }\n }\n });\n }\n\n /**\n * Import module.\n */\n importModule(name) {\n this.logger.debug(`Importing module ${this.cleanName(name)}`);\n return this.loader.import(name);\n }\n\n /**\n * Delete module and fix importers for dependencies.\n */\n deleteModule(name) {\n const moduleRecord = this.loader._loader.moduleRecords[name];\n\n if (moduleRecord) {\n moduleRecord.dependencies\n .forEach((depModuleRecord) => {\n if (!depModuleRecord) {\n return;\n }\n depModuleRecord.importers\n .forEach((impModuleRecord, index) => {\n if (impModuleRecord && moduleRecord.name === impModuleRecord.name) {\n this.logger.debug(`Removing importer ${this.cleanName(impModuleRecord.name)} from module ${this.cleanName(depModuleRecord.name)}`);\n depModuleRecord.importers[index] = null;\n }\n });\n });\n }\n\n this.logger.debug(`Removing module ${this.cleanName(name)}`);\n this.loader.delete(name);\n }\n\n /**\n * Get module backup which could be used to restore module state.\n */\n getModuleBackup(name) {\n const exports = this.loader.get(name);\n const record = this.loader._loader.moduleRecords[name];\n return { name, record, exports };\n }\n\n /**\n * Restore module from backup.\n */\n restoreModuleBackup(data) {\n this.loader.set(data.name, data.exports);\n this.loader._loader.moduleRecords[data.name] = data.record;\n }\n\n /**\n * Get shortest distance to the root module (root modules have no importers).\n */\n getModuleDistanceToRoot(name, record, cache) {\n let distance;\n if (cache[name] !== undefined) {\n return cache[name];\n }\n if (!record || !record.importers.length) {\n distance = 0;\n } else {\n distance = record.importers.reduce((result, impRecord) => {\n const impDistance = 1 + this.getModuleDistanceToRoot(impRecord.name, impRecord, cache);\n return result === null ? impDistance : Math.min(result, impDistance);\n }, null);\n }\n cache[name] = distance;\n return distance;\n }\n\n /**\n * Reduce dependency tree and return modules in the order they should be reloaded.\n */\n getReloadChain(modules, cache) {\n if (modules.length === 0) {\n return modules;\n }\n\n const records = this.loader._loader.moduleRecords;\n\n if (!cache) {\n cache = {};\n }\n\n const farNode = modules.reduce((result, name, index) => {\n const record = records[name] ? records[name] : undefined;\n const distance = this.getModuleDistanceToRoot(name, record, cache);\n const importers = !record ? [] : record.importers.map(item => item.name);\n const reload = record && record.exports && record.exports.__reload;\n const meta = { distance, index, name, importers, reload };\n if (result === undefined) {\n return meta;\n }\n return result.distance >= distance ? result : meta;\n }, undefined);\n\n const nextModules = modules.slice(0);\n nextModules.splice(farNode.index, 1);\n if (!farNode.reload) {\n farNode.importers.forEach((name) => {\n if (nextModules.indexOf(name) === -1) {\n nextModules.push(name);\n }\n });\n }\n\n const nextResult = this.getReloadChain(nextModules, cache);\n\n const result = [farNode.name].concat(nextResult);\n\n return result;\n }\n}\n"]} |
+1
-1
| { | ||
| "name": "systemjs-hot-reloader-ex", | ||
| "version": "2.0.0", | ||
| "version": "2.0.1", | ||
| "description": "SystemJS / JSPM hot reloader with support of CSS, SCSS, SASS, LESS, Stylus, React and JavaScript", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
+35
-12
@@ -63,2 +63,12 @@ # SystemJS Hot Reloader # | ||
| or via `jspm.config.js`: | ||
| ```javascript | ||
| SystemJS.config({ | ||
| hotReloaderOptions: { | ||
| logLevel: 3 | ||
| } | ||
| }); | ||
| ``` | ||
| ### JavaScript Hot Reloader ### | ||
@@ -85,2 +95,7 @@ | ||
| Avoid using of loaders via `!` because in that case there is no 100% way to | ||
| convert file name into module name so reloader will have to iterate over all | ||
| registered modules to find correct module name. It is recommended to define | ||
| loader via `meta` SystemJS config section for files based on their extension. | ||
| The fastest reload is guaranteed when css filename could be 1:1 resolved to | ||
@@ -92,8 +107,6 @@ module name. It works when you have css loading workflow like below: | ||
| meta: { | ||
| "*.css": { | ||
| "loader": "plugin-css" | ||
| }, | ||
| "*.scss": { | ||
| "loader": "plugin-sass" | ||
| } | ||
| "*.css": { "loader": "plugin-css" }, | ||
| "*.scss": { "loader": "plugin-sass" }, | ||
| "*.sass": { "loader": "plugin-sass" }, | ||
| "*.less": { "loader": "plugin-less" } | ||
| }, | ||
@@ -124,2 +137,6 @@ }); | ||
| If you keep state in store model object or in `mobx` and your application will be | ||
| able to restore state from it, then you don't need this part, just keep you store | ||
| instance in separate module. | ||
| React, babel plugin, babel preset are required (obviously): | ||
@@ -143,8 +160,11 @@ | ||
| * `react-hot-loader/babel` required to wrap `import()` | ||
| * `react-hot-loader/lib/patch.dev.js` will patch React | ||
| * `react-hot-loader/babel` babel plugin is required to wrap `import()` | ||
| * `react-hot-loader/lib/patch.dev.js` is required, will patch React on the fly | ||
| * `react-hot-loader/lib/AppContainer.dev.js` will restore state on reload | ||
| * `__reload()` hook required to rerender application instead of module reload | ||
| * `__reload()` hook required to rerender application instead of full module reload | ||
| * different application entry points for development and production | ||
| Please note, that **react-hot-loader/babel** should be **FIRST** plugin in list | ||
| of Babel plugins. | ||
| File: `jspm.config.js`: | ||
@@ -157,2 +177,5 @@ | ||
| }, | ||
| meta: { | ||
| "*.jsx": { loader: "plugin-babel" } | ||
| }, | ||
| transpiler: "plugin-babel", | ||
@@ -172,3 +195,3 @@ babelOptions: { | ||
| "app": { | ||
| "main": "index" | ||
| "main": "index.jsx" | ||
| } | ||
@@ -179,3 +202,3 @@ } | ||
| "app": { | ||
| "main": "index.dist", | ||
| "main": "index.dist.jsx", | ||
| "defaultExtension": "jsx" | ||
@@ -246,3 +269,3 @@ } | ||
| <body> | ||
| <div id="app-root"></div> | ||
| <div id="root"></div> | ||
| <script src="app.js"></script> | ||
@@ -249,0 +272,0 @@ </body> |
@@ -15,9 +15,14 @@ import 'core-js/shim'; | ||
| this.loader = opts.loader || SystemJS || System; | ||
| this.logLevel = opts.loader === undefined ? 2 : opts.logLevel; | ||
| this.logger = this.createLogger('HMR'); | ||
| if (!this.loader) { | ||
| throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS'); | ||
| } | ||
| if (this.loader.hotReloaderOptions) { | ||
| Object.assign(opts, this.loader.hotReloaderOptions); | ||
| } | ||
| this.logLevel = opts.logLevel === undefined ? 2 : opts.logLevel; | ||
| this.logger = this.createLogger('HMR'); | ||
| } | ||
@@ -24,0 +29,0 @@ |
-20
| The MIT License (MIT) | ||
| Copyright (c) 2016 Artem Butusov | ||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | ||
| this software and associated documentation files (the "Software"), to deal in | ||
| the Software without restriction, including without limitation the rights to | ||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||
| the Software, and to permit persons to whom the Software is furnished to do so, | ||
| subject to the following conditions: | ||
| The above copyright notice and this permission notice shall be included in all | ||
| copies or substantial portions of the Software. | ||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||
| FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
55829
2.49%681
0.89%266
9.47%