From 153989bcd30f24e6b3cb639f508d014311d5c16f Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Thu, 21 Jan 2016 14:10:49 -0800 Subject: [PATCH] `require` implementation for unbundles: Systrace and guard Summary: public Adds two feature to the require implementation for unbundled code: - Ports Systrace from `require.js` - Prevents already loaded modules from being overwritten by repeated calls to `nativeRequire` with the same ID Reviewed By: martinbigio Differential Revision: D2850345 fb-gh-sync-id: 122e2d5d4a64b2e868d4cf6e5079810f59b1db18 --- .../Resolver/polyfills/require-unbundle.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/react-packager/src/Resolver/polyfills/require-unbundle.js b/react-packager/src/Resolver/polyfills/require-unbundle.js index df75ae14..87e85601 100644 --- a/react-packager/src/Resolver/polyfills/require-unbundle.js +++ b/react-packager/src/Resolver/polyfills/require-unbundle.js @@ -10,6 +10,11 @@ const loadModule = ErrorUtils ? guardedLoadModule : loadModuleImplementation; function define(moduleId, factory) { + if (moduleId in modules) { + // prevent repeated calls to `global.nativeRequire` to overwrite modules + // that are already loaded + return; + } modules[moduleId] = { factory, hasError: false, @@ -44,11 +49,26 @@ function loadModuleImplementation(moduleId, module) { throw moduleThrewError(moduleId); } + // `require` calls int the require polyfill itself are not analyzed and + // replaced so that they use numeric module IDs. + // The systrace module will expose itself on the require function so that + // it can be used here. + // TODO(davidaurelio) Scan polyfills for dependencies, too (t9759686) + const {Systrace} = require; + const exports = module.exports = {}; const {factory} = module; try { + if (__DEV__) { + Systrace.beginEvent('JS_require_' + moduleId); + } + const moduleObject = {exports}; factory(global, require, moduleObject, exports); + + if (__DEV__) { + Systrace.endEvent(); + } return (module.exports = moduleObject.exports); } catch (e) { module.hasError = true; @@ -68,3 +88,7 @@ function unknownModuleError(id) { function moduleThrewError(id) { return Error('Requiring module "' + id + '", which threw an exception.'); } + +if (__DEV__) { + require.Systrace = { beginEvent: () => {}, endEvent: () => {} }; +}