2016-10-04 7 views
1

Ich entwickle eine Javascript-Bibliothek, die Closure-Compiler verwendet, um & typecheck zu kombinieren/zu minimieren. Um zu vermeiden, schmollend globalen Namensraum Ich möchte UMD Muster & closue @export(or goog.exportSymbol('workspace', lkr.workspace)Google Closure-Compiler und UMD-Muster

goog.provide('workspace'); 
goog.require('lkr.workspace'); 
/** 
    * Exposed external access point 
    * @export 
    * @return {component} 
    */ 
workspace = function() { 
    return lkr.workspace.Core; 
} 

Ich habe verwenden, verwendet

eine Ausgabe-Wrapper-Datei, um die UMD-Wrapper
//UMD bundling closure code inside. 
;(function (root, factory) { 
    if (typeof define === 'function' && define.amd) { 
     define([], factory); 
    } else if (typeof module === 'object' && module.exports) { 
     module.exports = factory(); 
    } else { 
     root.workspace = factory(); 
    } 
}(this, function() { 
    %output% 
    return workspace; 
})); 

Ref zu erzeugen: https://medium.com/reflecting-on-bits/how-to-solve-missing-output-error-when-using-closure-compiler-7de6eac29776?swoff=true#.ntq9vav6s

  1. Ist dies der richtige Ansatz für das UMD-Muster in Closure, scheint es interne Unterstützung im Compiler zu geben, UMD zu erkennen, aber ich kann keine Beispiele finden. https://github.com/google/closure-compiler/pull/1048
  2. Ich bekomme immer noch Abstürze scheint Arbeitsbereich kann nicht gefunden werden.

Beispiel

start.js

goog.provide('workspace'); 
/** 
    * Exposed external access point 
    * @export 
    * @return {number} 
    */ 
var workspace = function() { 
    console.log('My workspace') 
    return 0; 
} 

Compilation flags

closure_entry_point: 'workspace', 
compilation_level: ADVANCED_OPTIMIZATION, 
only_closure_dependencies: true, 
generate_exports :true, 
language_in : 'ECMASCRIPT5_STRICT', 
language_out : 'ES5_STRICT', 

Ausgabe mit UMD-Wrapper

(function(root, factory) { 
    if (typeof define === 'function' && define.amd) { 
     define([], factory); 
    } else if (typeof exports === 'object') { 
     module.exports = factory(); 
    } else { 
     root.workspace = factory(); 
    } 
}(this, function() { 
    'use strict'; 
    'use strict'; 
    function a() { 
     console.log("My workspace"); 
     return 0 
    } 
    var b = ["workspace"] 
     , c = this; 
    b[0]in c || !c.execScript || c.execScript("var " + b[0]); 
    for (var d; b.length && (d = b.shift());) 
     b.length || void 0 === a ? c[d] ? c = c[d] : c = c[d] = {} : c[d] = a; 
    return workspace; 
})); 

Fehler:

Uncaught TypeError: Cannot use 'in' operator to search for 'workspace' in undefined 
Uncaught ReferenceError: workspace is not defined 
+0

Welche Compilation Ebene? –

+0

ADVANCED_OPTIMIZATIONS – chifer

+0

Ich habe das Problem mit einem konkreten Beispiel aktualisiert, siehe bitte. – chifer

Antwort

2

Die einzige native Unterstützung für das Muster UMD der Compiler ist mit dem --process_common_js_modules hat. Diese Flagge wird verwendet, um Module zusammen zu bündeln und das Muster zu entfernen - also nicht, was Sie wollen.

Ihre Probleme sind mit Ihrem Ausgabe-Wrapper. Der Compiler versucht, workspace zu exportieren, indem er es als eine Eigenschaft auf dem globalen Objekt this erstellt. Ihr Ausgabe-Wrapper gibt kein this Objekt an. Da Sie sich im strikten Modus befinden, wird es auch nicht automatisch auf das globale this-Objekt erzwungen.

Aktualisieren Sie Ihre Ausgangs Wrapper um so etwas wie:

//UMD bundling closure code inside. 
;(function (root, factory) { 
    if (typeof define === 'function' && define.amd) { 
    define([], factory); 
    } else if (typeof module === 'object' && module.exports) { 
    module.exports = factory(); 
    } else { 
    root.workspace = factory(); 
    } 
}(this, function() { 
    %output% 
    return workspace; 
}.bind(this)); 
+0

Danke, das war's ... – chifer