如何为以下模块创建模块:Web,按节点*和Web应用程序要求?

时间:2019-05-11 16:24:26

标签: node.js webpack

TLDR;创建可捆绑用于Web的模块,由节点应用程序所需,被捆绑为Web的节点模块所需的最佳方法是什么?

我首先有两个入口点,一个用于节点(index.js),一个用于Web(index-web.js)。这对于Web捆绑非常有效,因为webpack使用index-web.js。它也适用于节点应用程序的require,因为它可以使用index.js。因此,前两项是“检查”。

但是,如果我需要从绑定到Web的节点应用程序中获取模块,该方法将不起作用,因为默认情况下它会选择index.js。也许有一种简单的方法可以解决这个问题?

因此,问题1:当模块npm installnpm link是我的模块时,从属模块是否可以选择Web入口点(index-web.js)甚至是Web捆绑包?

我尝试切换到仅使用index.js并在其中放置条件需求(以(typeof window === 'undefined')为条件),但是:

A)我剩下的是那些我要研究的烦人的“警告:关键依赖项”消息(webpack issue #196)。

B)我必须修改 dependency 模块的webpack.config.js以排除某些现在引用的内建函数(使用externals),因为我在index.js。从长远来看,这是一个交易突破。

1 个答案:

答案 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')
    }