使用browserify-shim来修复依赖项的依赖项

7

我正在尝试重构一个使用Browserify的库,通过使用browserify-shim将某些模块从捆绑包中剔除。具体来说,该库使用require("codemirror"),但我想提供一个捆绑包,不包括CodeMirror,而是使用CDN提供的CodeMirror。

因此,我在我的package.json中配置了browserify-shim,如下所示:

  "browserify-shim": {
    "jquery": "global:jQuery",
    "codemirror": "global:CodeMirror"
  }

目前为止一切顺利。 require('jquery') 和 require('codemirror') 已经从 browserified 捆绑包中消失,并被预期的代码片段所取代,以从 window 对象中获取 jQuery 和 CodeMirror。

该库还需要一些 CodeMirror 插件,例如 require('codemirror/addon/hint/show-hint.js')。这很好。我想将该插件捆绑在一起。然而,在此插件内部有一个 UMD 包装器,其中包括 require("../../lib/codemirror")。由于这个原因(我认为),Browserify 正在捆绑位于 /node_modules/codemirror/lib/codemirror.js 的 CodeMirror。我希望使用 codemirror 假定中定义的 window.CodeMirror 来解决这个问题,但无法弄清楚。已经尝试了许多变化,包括以下内容:

  "browserify-shim": {
    "jquery": "global:jQuery",
    "codemirror": "global:CodeMirror",
    "../../lib/codemirror": "global:CodeMirror",
    "codemirror/addon/hint/show-hint.js": { 
      "exports":null,
      "depends":["../../lib/codemirror:CodeMirror"]
    }
  }

这个问题与 require("../../lib/codemirror") 有关,但我确信我漏掉了什么。

我是从 Gulp 脚本中运行的,但我认为这不应该有任何区别。Browserify 版本 3.38.1。Browserify-shim 版本 3.7.0。

有什么想法吗?


看起来使用 browserify-shim 可能不是解决这个问题的正确方法。使用 Browserify 选项 bundleExternal=false 可能会解决问题。正在调查中... - Ethan Jewett
bundleExternal=false并不是完整的答案,因为它仍然保留了最初的“require”语句。因此,像第一个示例中的browserify-shim仍然是必需的。但是它有所帮助。使用这个设置,我可以直接在Gulp脚本中打包之前.require('codemirror/addon/hint/show-hint.js')来获取这个插件,但是似乎CodeMirror的外部要求将被省略。 - Ethan Jewett
看起来在最新版本的browserify中,可以将{global: true}选项应用于browserify-shim转换,这将导致其在依赖项上运行!这使我们能够成功地shim require('../../lib/codemirror')。 - Ethan Jewett
你是否曾经找到了这个问题的明确答案?我遇到了非常类似的问题,并在这里发布了它:questions/26696577/browserify-shim-grunt-dependency-mapping,想知道你是否有任何反馈。 - dtothefp
是的,{ global: true } 至少为我的使用情况提供了所需的灵活性。 - Ethan Jewett
2个回答

12

如果你在browserify-shim中添加{global: true},它应该也会应用于你的依赖项的依赖项(以此类推),这样就可以实现你想要的效果。

假设你在Gulpfile中使用原始的browserify,而不是:

b.transform('browserify-shim');

做:

b.transform({global: true}, 'browserify-shim');

如果你正在使用 gulp-browserify,我不确定是否有任何方法可以指定全局转换。


-1
{global: true}

对我来说可以用啊... 为什么这不是默认设置呢?


2
虽然这段代码可能回答了问题,但提供有关为什么和/或如何回答问题的额外背景信息将显着提高其长期价值。请[编辑]您的答案以添加一些解释。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接