【问题标题】:How to create a module for: web, require by node *and* require by web app?如何创建一个模块:web、node *和* web app需要?
【发布时间】:2019-09-29 05:23:48
【问题描述】:

TLDR;创建一个可以为 web 捆绑的模块的最佳方法是什么?节点应用程序需要,为 web 捆绑的节点模块需要?

我一开始有两个入口点,一个用于节点 (index.js),一个用于 web (index-web.js)。这适用于 web 捆绑,因为 webpack 使用 index-web.js。它也适用于节点应用程序的需求,因为它选择了 index.js。所以前两项“检查”。

但是,如果我需要我的模块来自为 web 捆绑的节点应用程序,它就不起作用,因为它默认选择 index.js。也许有一个简单的方法来处理它?

所以 Q1:当依赖模块 npm installs 或 npm links 我的模块时,有没有办法让依赖模块获取 web 入口点 (index-web.js) 甚至 web 包?

我已经尝试切换到只使用 index.js 并在其中放置条件要求(以(typeof window === 'undefined') 为条件)哪种可行,但是:

A) 我留下了那些令人讨厌的“警告:严重依赖”消息,我将要调查 (webpack issue #196)。

B) 我必须修改 dependency 模块的 webpack.config.js 以排除现在引用的某些内置函数(使用 externals),因为我在索引中使用条件要求。 js。从长远来看,这会破坏交易。

【问题讨论】:

  • 我不确定这是什么意思,为 web 捆绑的节点应用程序需要。它可以是 Node 或 web(浏览器)。
  • 抱歉,我的意思是为 web 捆绑的节点模块需要。

标签: node.js webpack


【解决方案1】:

我发现一个很好的解决方案是结合使用 npm node-detect 包和 webpack DefinePlugin。这确保了 webpack 只打包 web 所需的模块,并消除了 webpack 关于“关键依赖:依赖的请求是一个表达式”的警告。

所以在你的同构模块中(依赖依赖):

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

【讨论】:

  • 这东西是怎么工作的? if (!IS_BROWSER) 将等于 if (!true) 所以任何 js minifier 都会完全删除这段代码。
  • 那是正确的,如果它被节点使用而不是为浏览器缩小,则代码保留。这就是想法。我已经意识到它并不是一个真正的完整解决方案,因为您可能无法(或不想)在依赖模块/应用程序中设置 IS_BROWSER。我通过在 package.json 中设置一个替代入口点(即“浏览器”,在正常入口点“主”旁边)为我的用例找到了一个解决方案。但这不会涵盖所有情况,我认为目前没有通用的解决方案。
猜你喜欢
  • 2021-03-18
  • 2020-08-19
  • 2021-11-05
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多