TLDR;创建可捆绑用于Web的模块,由节点应用程序所需,和被捆绑为Web的节点模块所需的最佳方法是什么?
我首先有两个入口点,一个用于节点(index.js),一个用于Web(index-web.js)。这对于Web捆绑非常有效,因为webpack使用index-web.js。它也适用于节点应用程序的require,因为它可以使用index.js。因此,前两项是“检查”。
但是,如果我需要从绑定到Web的节点应用程序中获取模块,该方法将不起作用,因为默认情况下它会选择index.js。也许有一种简单的方法可以解决这个问题?
因此,问题1:当模块npm install
或npm link
是我的模块时,从属模块是否可以选择Web入口点(index-web.js)甚至是Web捆绑包?
我尝试切换到仅使用index.js并在其中放置条件需求(以(typeof window === 'undefined')
为条件),但是:
A)我剩下的是那些我要研究的烦人的“警告:关键依赖项”消息(webpack issue #196)。
B)我必须修改 dependency 模块的webpack.config.js以排除某些现在引用的内建函数(使用externals
),因为我在index.js。从长远来看,这是一个交易突破。
答案 0 :(得分:0)
我发现一个很好的解决方案是结合使用npm node-detect软件包和webpack DefinePlugin。这样可以确保webpack仅打包Web所需的模块,并消除有关“关键依赖项:依赖项的请求是表达式”的警告。
因此在同构模块中(依赖和依赖):
npm install --save detect-node
或
yarn add detect-node
在两个webpack.config.js中:
const webpack = require('webpack')
// ...
module.exports = {
// ...
plugins: [
new webpack.DefinePlugin({
IS_BROWSER: true
})
]
}
在您的代码中:
const isNode = require(detect-node)
if (isNode) {
if (!IS_BROWSER) {
// Ignored by webpack, handled by node
safeJs.safeApi = require('./bootstrap')
}
} else {
// Ignored by node, handled by webpack
window.safeJs = safeJs
safeJs.safeApi = require('./bootstrap-web')
}