【问题标题】:Webpack bundling module which I want to be loaded dynamically to entry point我想动态加载到入口点的 Webpack 捆绑模块
【发布时间】:2020-11-18 09:53:17
【问题描述】:

下面的代码似乎使用了dynamic import

(function executeApplication(): void {

  const loadDataButton: HTMLElement | null = document.getElementById("LoadDataButton");
  if (loadDataButton !== null) {
    loadDataButton.addEventListener("click", (): void => {
      (async function handler(): Promise<void> {
        console.log("Checkpoint 1");
        const loadedValue: string = await loadDataOnDemand();
        console.log(loadedValue);
      })().catch((): void => { /* */ });
    });
  }
})();


async function loadDataOnDemand(): Promise<string> {

  console.log("Checkpoint 2");
  const MODULE: { default: string; DYNAMICALLY_LOADED_CONST_FROM_TS_MODULE: string; } =
      await import("./DynamicLoadingTesting/TypeScriptModuleForDynamicLoading");
  console.log("Checkpoint 3");
  console.log(MODULE);


  return MODULE.DYNAMICALLY_LOADED_CONST_FROM_TS_MODULE;
}

但实际上 TypeScriptModuleForDynamicLoading.ts 已绑定到入口点:

FrontendLogicPreProcessingTesting:
  asset FrontendLogicPreProcessingTesting.js 11.2 KiB [emitted] (name: FrontendLogicPreProcessingTesting)
  ./FrontendLogicPreProcessingTesting.ts 2.28 KiB [built] [code generated]
  ./DynamicLoadingTesting/TypeScriptModuleForDynamicLoading.ts 419 bytes [built] [code generated]
  FrontendLogicPreProcessingTesting (webpack 5.4.0) compiled successfully in 710 ms

没有 webpack 错误,并且在浏览器中的输出似乎是正确的:

我的 Webpack 配置:

{
  name: 'FrontendLogicPreProcessingTesting',
  context: 'D:\\IntelliJ IDEA\\XXXXX\\ProjectBuildingCommonTest\\00-Source\\FrontendLogicPreProcessingTesting'
,
  target: 'web',
  entry: {
    FrontendLogicPreProcessingTesting: 'D:/IntelliJ IDEA/XXXXX/ProjectBuildingCommonTest/00-Source/FrontendLogic
PreProcessingTesting/FrontendLogicPreProcessingTesting.ts'
  },
  output: {
    path: 'D:\\IntelliJ IDEA\\XXXXX\\ProjectBuildingCommonTest\\01-DevelopmentBuild\\FrontendLogicPreProcessin
gTesting',
    publicPath: './',
    filename: '[name].js',
    chunkFilename: 'loading_on_demand/partial__[id].js'
  },
  mode: 'development',
  watch: true,
  devtool: 'eval-cheap-source-map',
  module: {
    rules: [
      [Object], [Object],
      [Object], [Object],
      [Object], [Object],
      [Object], [Object],
      [Object]
    ]
  },
  resolve: {
    extensions: [ '.mjs', '.js', '.ts' ],
    alias: { vue: 'vue/dist/vue.common.js' }
  },
  plugins: [
    DefinePlugin { definitions: [Object] },
    ForkTsCheckerWebpackPlugin { options: [Object] },
  ],
  optimization: { minimize: false, emitOnErrors: true }
}

我使用 webpack 5.x.x.,但在使用 4.x.x. 时遇到了同样的问题。

我的 TypeScript 配置:

{
  "compilerOptions": {

    "target": "es2017",
    "strict": true,

    "module": "CommonJS",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "allowJs": false,

    "experimentalDecorators": true,

    "baseUrl": "./",
    "paths": {

    },

    "noUnusedParameters": true,
    "noImplicitReturns": true
  }
}

动态加载的哪些条件没有满足?

【问题讨论】:

  • 等待答复。
  • 你能检查一下当loadDataOnDemand被调用时,浏览器devtools网络标签中确实没有额外请求一个JS块吗?
  • @Jackyef,屏幕截图上的所有控制台输出在单击按钮之前不会出现。因此loadDataOnDemand 在点击按钮上调用。
  • 我并没有质疑loadDataOnDemand 是否被调用。我想知道在调用loadDataOnDemand 时浏览器是否发送了对JS 块的请求。你能确认一下吗?
  • 这很有帮助,谢谢!我注意到您在 tsconfig 中使用了module: "CommonJS",这将导致 tsc 将所有动态导入更改为要求。尝试将其更改为module: "esnext"

标签: javascript webpack module


【解决方案1】:

您当前在tsconfig.json 中使用module: "CommonJS",这将导致所有动态import() 在Webpack 实际看到它们之前转换为require() 调用。为了让 Webpack 能够生成新的块,Webpack 必须看到动态的 import() 调用。

设置module: "esnext" 将使得动态import() 不会转换为require(),因此Webpack 可以正确处理它们。

【讨论】:

  • 感谢您的回答!答应我的奖励^_~
【解决方案2】:

webpackMode: lazymagic comment 可能会有所帮助。

它应该为DynamicLoadingTesting/TypeScriptModuleForDynamicLoading.js生成一个单独的块。

async function loadDataOnDemand(): Promise<string> {

  console.log("Checkpoint 2");
  const MODULE: { default: string; DYNAMICALLY_LOADED_CONST_FROM_TS_MODULE: string; } =
      await import(
       /* webpackMode: "lazy" */
       "./DynamicLoadingTesting/TypeScriptModuleForDynamicLoading"
);
  console.log("Checkpoint 3");
  console.log(MODULE);


  return MODULE.DYNAMICALLY_LOADED_CONST_FROM_TS_MODULE;
}

【讨论】:

  • 感谢您的回答。对不起,没有任何改变...
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2018-06-05
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多