罕见的情况:我需要通过Webpack为... PUG预处理器构建一些JavaScript!我的库(MixinArgumentValidator
)太复杂,无法用JavaScript编写,并且还使用了一些库。在下面的项目结构中,OutputFileGenerator.ts
生成MixinArgumentsValidator.pug
。
[MixinArgumentsValidator.pug
仅包含-
符号(在Pug中,这意味着必须在预处理期间执行的原始JavaScript)和来自MixinArgumentsValidator.js
的精简JavaScript代码:
从理论上讲,如果在其他哈巴狗文件中包含MixinArgumentsValidator.pug
,则全局变量MixinArgumentsValidator
必须可用。是这样,但是……来自第二次哈巴狗汇编。
实验
我在项目中只剩下2个哈巴狗文件(入口点)。另外,我在控制台日志下方添加了MixinArgumentsValidator.pug
:
在第一遍中,MixinArgumentsValidator
是未定义的,但是在第二遍中,它是可用的:
我在编译后的代码中找不到任何超时,间隔或承诺。 MixinArgumentsValidator
执行完全同步:
如果您要检查Webpack的异步元素代码,我将链接添加到beautified version的MixinArgumentsValidator.js
。
Webpack设置
在上述实验中,webpack的output
设置为:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd"
}
我也尝试过:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd",
library: "MixinArgumentsValidator"
}
对于此设置,MixinArgumentsValidator
是对象,不是功能,但从第二遍起也可以看到。
感谢阅读此问题。
哈巴狗的最高级别this
我的库从第一遍开始就存在于哈巴狗的顶级上下文中,并且从第二遍通过以来,顶级上下文几乎没有变化(只是从第二遍添加了input_char: '>'
。
Object [global] {
global: [Circular],
clearInterval: [Function: clearInterval],
clearTimeout: [Function: clearTimeout],
setInterval: [Function: setInterval],
setTimeout: [Function: setTimeout] { [Symbol(util.promisify.custom)]: [Function] },
queueMicrotask: [Function: queueMicrotask],
clearImmediate: [Function: clearImmediate],
setImmediate: [Function: setImmediate] {
[Symbol(util.promisify.custom)]: [Function]
},
'__core-js_shared__': {
versions: [ [Object] ],
wks: {
toStringTag: Symbol(Symbol.toStringTag),
_hidden: Symbol(Symbol._hidden),
toPrimitive: Symbol(Symbol.toPrimitive),
hasInstance: Symbol(Symbol.hasInstance),
isConcatSpreadable: Symbol(Symbol.isConcatSpreadable),
iterator: Symbol(Symbol.iterator),
match: Symbol(Symbol.match),
replace: Symbol(Symbol.replace),
search: Symbol(Symbol.search),
species: Symbol(Symbol.species),
split: Symbol(Symbol.split),
unscopables: Symbol(Symbol.unscopables),
asyncIterator: Symbol(Symbol.asyncIterator),
observable: Symbol(Symbol.observable)
},
keys: { IE_PROTO: 'Symbol(IE_PROTO)_2.wy4w0dx9di' },
'symbol-registry': {},
symbols: {},
'op-symbols': {}
},
indent_handlebars: false,
MixinArgumentsValidator: Object [Module] {
MixinArgumentsValidator: [Getter],
ObjectDataValidatorTypes: [Getter]
},
input_char: '>'
}
仍然不知道原因,但是获得预期效果的最安全方法是:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd",
library: "MixinArgumentsValidatorExports"
}
include HikariPug-Kernel/MixinArgumentsValidator/MixinArgumentsValidator
-
const MixinArgumentsValidator = this.MixinArgumentsValidatorExports.MixinArgumentsValidator;
const ObjectDataValidatorTypes = this.MixinArgumentsValidatorExports.ObjectDataValidatorTypes;
或更短:
const { MixinArgumentsValidator, ObjectDataValidatorTypes } = this.MixinArgumentsValidatorExports;
library: "MixinArgumentsValidatorExports"
怎么编译?用法变得更容易,但全球空间污染将增加。
const { MixinArgumentsValidator, ObjectDataValidatorTypes } = this;