| Index: pkg/dev_compiler/lib/js/legacy/dart_library.js
|
| diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js
|
| index e94086395b284bdf154bc181e953600bffb31ff6..19fa131fe0bb9f5b9cc3f2f825064a74881d366f 100644
|
| --- a/pkg/dev_compiler/lib/js/legacy/dart_library.js
|
| +++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js
|
| @@ -27,6 +27,24 @@ dart_library =
|
| // Longer term, we can easily migrate to an existing JS module system:
|
| // ES6, AMD, RequireJS, ....
|
|
|
| + // Returns a proxy that delegates to the underlying loader.
|
| + // This defers loading of a module until a library is actually used.
|
| + const loadedModule = Symbol('loadedModule');
|
| + dart_library.defer = function(module, name, patch) {
|
| + var revocable = Proxy.revocable(module, {
|
| + get: function(o, p) {
|
| + var mod = o[loadedModule];
|
| + var lib = mod[name];
|
| + // Install unproxied module and library in caller's context.
|
| + patch(mod, lib);
|
| + // Ensure proxy is only used on first access.
|
| + revocable.revoke();
|
| + return lib[p];
|
| + }
|
| + });
|
| + return revocable.proxy;
|
| + };
|
| +
|
| class LibraryLoader {
|
|
|
| constructor(name, defaultValue, imports, loader) {
|
| @@ -65,8 +83,31 @@ dart_library =
|
| let args = this.loadImports();
|
|
|
| // Load the library
|
| - args.unshift(this._library);
|
| - this._loader.apply(null, args);
|
| + let loader = this;
|
| + let library = this._library;
|
| + library[loadedModule] = library;
|
| + args.unshift(library);
|
| +
|
| + if (this._name == 'dart_sdk') {
|
| + // Eagerly load the SDK.
|
| + this._loader.apply(null, args);
|
| + loader._loader = null;
|
| + } else {
|
| + // Load / parse other modules on demand.
|
| + let done = false;
|
| + this._library = new Proxy(args, {
|
| + get: function(o, name) {
|
| + if (done) {
|
| + return library[name];
|
| + }
|
| + done = true;
|
| + loader._loader.apply(null, o);
|
| + loader._loader = null;
|
| + return library[name];
|
| + }
|
| + });
|
| + }
|
| +
|
| this._state = LibraryLoader.READY;
|
| this._library[dartLibraryName] = this._name;
|
| this._library[libraryImports] = this._imports;
|
| @@ -121,14 +162,14 @@ dart_library =
|
| if (libraryName == null) libraryName = moduleName;
|
| let library = import_(moduleName)[libraryName];
|
| let dart_sdk = import_('dart_sdk');
|
| +
|
| if (!_currentIsolate) {
|
| - // Create isolate and run main.
|
| + // Create isolate.
|
| _currentIsolate = true;
|
| - dart_sdk._isolate_helper.startRootIsolate(library.main, []);
|
| - } else {
|
| - // Main isolate is already initialized - just run main.
|
| - library.main();
|
| + dart_sdk._isolate_helper.startRootIsolate(() => {}, []);
|
| }
|
| +
|
| + library.main();
|
| }
|
| dart_library.start = start;
|
|
|
|
|