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
- 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
- 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
Welche Compilation Ebene? –
ADVANCED_OPTIMIZATIONS – chifer
Ich habe das Problem mit einem konkreten Beispiel aktualisiert, siehe bitte. – chifer