typescript - Kan JavaScript utföra den n:te+1 raden kod utan att vänta på den n:te raden om det inte finns några asynkrona operationer i vissa fall?
Hur jag tvivlade på det efter 5 års erfarenhet av JavaScript
Alltför sällsynt fall: Jag behöver bygga något JavaScript med Webpack (källa: TypeScript) för ... PUG-förbehandlare! Mitt bibliotek (MixinArgumentValidator) är för komplicerat för att skriva det i JavaScript, och använder också några bibliotek. I projektsstrukturen nedan genererar OutputFileGenerator.ts MixinArgumentsValidator.pug.
MixinArgumentsValidator.pug innehåller bara --symbolen (i Pug betyder det rå JavaScript som måste köras under förbehandling) och minifierad JavaScript-kod från MixinArgumentsValidator.js:
Ur teorins synvinkel, om man inkluderar MixinArgumentsValidator.pug i en annan pug-fil, måste den globala variabeln MixinArgumentsValidator vara tillgänglig. Det är den, men... först från den andra pug-kompileringen.
Experiment
Jag lämnade exakt 2 pug-filer (startpunkter) i mitt projekt. Jag lade också till följande konsolloggar i MixinArgumentsValidator.pug:
Vid första genomgången är MixinArgumentsValidator odefinierad, men vid andra genomgången är den tillgänglig:
Jag hittade inga Timeouts, Intervals eller Promises i den kompilerade koden. MixinArgumentsValidator-körningen är helt synkron:
Om du vill kolla Webpacks kod för asynkront element, har jag lagt till en länk till en förskönad version av MixinArgumentsValidator.js.
Webpack-inställningar
I ovanstående experiment är webpacks output-inställningar:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd"
}
Jag försökte också:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd",
library: "MixinArgumentsValidator"
}
För dessa inställningar är MixinArgumentsValidator ett objekt, inte en funktion, men det är också synligt från det andra passet.
Tack för att du läste dessa frågor.
Pugs översta nivå this
Mitt bibliotek finns i mopsens top-nivåkontext från första genomgången, och top-nivåkontexten förändras nästan inte från den andra genomgången (bara input_char: '>' har lagts till från den andra genomgången).
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: '>'
}
Svar #1
Vet fortfarande inte orsaken, men det säkraste sättet att uppnå önskad effekt är:
- Kapsla in importerna för att minska föroreningen av det globala namnområdet:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd",
library: "MixinArgumentsValidatorExports"
}
- Eftersom exporter finns i den globala rymden från första passet, är det möjligt att extrahera dem:
include HikariPug-Kernel/MixinArgumentsValidator/MixinArgumentsValidator
-
const MixinArgumentsValidator = this.MixinArgumentsValidatorExports.MixinArgumentsValidator;
const ObjectDataValidatorTypes = this.MixinArgumentsValidatorExports.ObjectDataValidatorTypes;
Eller kortare:
const { MixinArgumentsValidator, ObjectDataValidatorTypes } = this.MixinArgumentsValidatorExports;
Vad händer om man kompilerar utan library: "MixinArgumentsValidatorExports"?
Användningen blir enklare, men den globala rymdsmutsen kommer att öka.
const { MixinArgumentsValidator, ObjectDataValidatorTypes } = this;





