Webpack在编写同构JavaScript和在打包时替换npm包为浏览器全局变量方面对我们非常有帮助。
因此,如果我想在Node.js上使用node-fetch npm包但在打包时排除它并仅使用本地浏览器fetch全局变量,我只需要在我的webpack.config.js中提及它:
{
externals: {
'node-fetch': 'fetch',
'urlutils': 'URL',
'webcrypto': 'crypto', // etc
}
}
然后我的CommonJS需要
const fetch = require('node-fetch')
将被转译为 const fetch = window.fetch
(或者是其他的内容)。到此为止一切都很好。这里有一个问题:当我需要引用一个导出模块的子模块/单个属性时该怎么办?
例如,假设我想以同构方式使用WhatWG URL标准。我可以使用
urlutils
npm
模块,它module.exports
整个URL类,因此我的引用看起来像:const URL = require('urlutils')
然后我可以在我的externals
部分列出urlutils
,没有问题。但是当我想使用一个更近期(并且更受支持的)npm
包,比如whatwg-url
时,我不知道如何Webpack它,因为我的requires看起来像:
const { URL } = require('whatwg-url')
// or, if you don't like destructuring assignment
const URL = require('whatwg-url').URL
我该如何告诉Webpack将require('whatwg-url').URL
替换为浏览器全局对象URL
?
URL
是一个函数,它存在于一个庞大的文件中,Webpack将不得不去查找那个文件并跟踪所有所需的URL
函数相关的代码。Webpack是一个文件打包器,无法根据请求的属性拆分和合并依赖项。 - Oskar