如果在某些情况下没有异步操作,JavaScript可以执行n + 1行代码而无需等待n行吗?

问题描述 投票:2回答:1

[我有5年的JavaScript经验后对此表示怀疑

罕见的情况:我需要通过Webpack为... PUG预处理器构建一些JavaScript!我的库(MixinArgumentValidator)太复杂,无法用JavaScript编写,并且还使用了一些库。在下面的项目结构中,OutputFileGenerator.ts生成MixinArgumentsValidator.pug

enter image description here

[MixinArgumentsValidator.pug仅包含-符号(在Pug中,这意味着必须在预处理期间执行的原始JavaScript)和来自MixinArgumentsValidator.js的精简JavaScript代码:

enter image description here

从理论上讲,如果在其他哈巴狗文件中包含MixinArgumentsValidator.pug,则全局变量MixinArgumentsValidator必须可用。是这样,但是……来自第二次哈巴狗汇编。

实验

我在项目中只剩下2个哈巴狗文件(入口点)。另外,我在控制台日志下方添加了MixinArgumentsValidator.pug

enter image description here

在第一遍中,MixinArgumentsValidator是未定义的,但是在第二遍中,它是可用的:

enter image description here

我在编译后的代码中找不到任何超时,间隔或承诺。 MixinArgumentsValidator执行完全同步:

enter image description here

如果您要检查Webpack的异步元素代码,我将链接添加到beautified versionMixinArgumentsValidator.js

Webpack设置

在上述实验中,webpack的output设置为:

output: {
  path: __dirname,
  filename: "[name].js",
  libraryTarget: "umd"
}

我也尝试过:

output: {
  path: __dirname,
  filename: "[name].js",
  libraryTarget: "umd",
  library: "MixinArgumentsValidator"
}

对于此设置,MixinArgumentsValidator是对象,不是功能,但从第二遍起也可以看到。

enter image description here

感谢阅读此问题。

哈巴狗的最高级别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: '>'
}
javascript typescript webpack pug
1个回答
0
投票

仍然不知道原因,但是获得预期效果的最安全方法是:

  1. 封装进口以减少全球空间污染:
output: {
 path: __dirname,
 filename: "[name].js",
 libraryTarget: "umd",
 library: "MixinArgumentsValidatorExports"
}
  1. 由于出口从一开始就存在于全球空间中,因此可以提取它们:
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;
© www.soinside.com 2019 - 2024. All rights reserved.