使用webpack output.target选项创建ES6模块“等效”

时间:2019-05-23 08:00:52

标签: javascript webpack babeljs node-modules es6-modules

首先,道歉!我很难在标题中总结这个问题,所以请随时进行修改。

问题

假设我有两个公开默认功能的ES6文件

// file_1.js
export default function(){ /* do the thing */ }

// file_2.js
export default function(){ /* do the other thing */ }

现在,我通过以下输出配置使用webpack(带babel loader)将file_1捆绑到模块中

// webpack config 1.
{
   ...
   entry : '/path/to/file_1.js'
   output : {
      path: '/where/it/goes/',
      filename : 'main.js',
      library: 'my_component',
      libraryTarget: 'var'
   }
}

我还有一个最小的package.json,因此可以将其导入为npm模块{ name: 'file_1', main: 'main.js' }

现在,当我想以统一的方式将file_1和模块file_2的代码捆绑在一起时,挑战就来了。

// master_entry.js

const components = {
    file_1 : require('file_1'),
    file_2 : require('/path/to/file_2')
}

如果我将以上内容捆绑在一起,然后查看components的结果形式,那么

console.log(components.file_1)
// outputs
Module {__esModule: true, Symbol(Symbol.toStringTag): "Module" }
console.log(components.file_2)
// outputs
Module {default: f, __esModule: true, Symbol(Symbol.toStringTag): "Module" }

file_2(因此没有预先捆绑)的功能因此,我有可用的默认功能-这就是我想要的。捆绑file_1时如何实现同一目的?

我尝试使用webpack的output选项,例如librarylibraryTargetlibraryExport。但是我有点迷茫,现在在文档上花了很长的时间-因此需要帮助!

谢谢。

为清楚起见

file_1.js -webpack->软件包file_1(入口点file_1.jsmaster_entry -webpack-> main.js

也就是说,webpack首先在file_1.js上运行,随后又结合了导入file_1软件包和file_2.js的运行。

1 个答案:

答案 0 :(得分:0)

我想我有一个解决方案;)

// file_1.js
export default function file1(){ console.log('file_1') }

// file_2.js
export default function file2(){ console.log('file_2') }

webpack.config.js应该看起来像这样

entry: {
  file1: './sources/js/file_1.js',
  file2: './sources/js/file_2.js',
},
output: {
  path: path.resolve(__dirname, 'dist'),
  filename: './[name].js',
  library: '[name]',
  libraryExport: 'default',
  libraryTarget: 'umd', // you can use libraries everywhere, e.g requirejs, node 
  umdNamedDefine: true,
},

从现在开始您可以访问:

<script>
  new file1(); // console.log show file_2
  new file2(); // console.log show file_2
</script>

您现在还可以将选项传递给函数。看看我的solution