Webpack对JavaScript模块的条件导入

时间:2018-03-16 07:56:28

标签: javascript webpack

我有一个基于Webpack的JavaScript框架。在那里,我想通过Webpack配置中的自定义条件导入(或不导入)任意模块(具有默认导出的自定义函数的JavaScript文件):

// in webpack.customSettings.js
module.exports = {
  const customJsFilePath = 'path/to/custom/js/file';
  // alternatively, if no import is desired:
  // const customJsFilePath = null;
};

// in webpack.config.js
const settings = require('./webpack.customSettings.js');
// ...
new webpack.DefinePlugin({
  'process.env': {
    PATH: JSON.stringify(settings.customJsFilePath || ''),
  },
});

这确定了在Webpack构建过程中是否需要以及需要​​哪个自定义模块。因此,像下面这样的动态导入似乎是不必要的,并且效率不高,因为路径已经在运行时修复,我不想在运行时动态加载额外的文件(块):

// somewhere in my main index.js
if (process.env.PATH) {
  import(`${process.env.PATH}/index.js`).then((module) => {
    const myFunc = module.default;
    // ...
  });
}

我希望Webpack在我的捆绑包中包含直接的自定义文件。这样的事情:

// somewhere in my main index.js
const myFunc = awesomeGlobal.customFunc;
if (myFunc) {
  // ...
}

我知道以下不适用:

// in my main index.js
import customFunc from `${process.env.PATH}/index.js`;

但我该怎么办?也许是Webpack中的东西?

1 个答案:

答案 0 :(得分:1)

好的,我自己想出了解决方案。我使用Webpack ProvidePlugin有条件地提供模块:

// in webpack.customSettings.js
module.exports = {
  const customJsFilePath = 'path/to/custom/js/file';
  // alternatively, if no import is desired:
  // const customJsFilePath = null;
};

// in webpack.config.js
const settings = require('./webpack.customSettings.js');
// ...
new webpack.ProvidePlugin((() => {
  const addModules = {};

  if (settings.customJsFilePath) {
    addModules['window.myFunc'] = [settings.customJsFilePath, 'default'];
  }

  return addModules;
})()),

// in my main index.js
if (window.myFunc) {
  window.myFunc();
}