Browserify 的自定义依赖项名称不起作用

2024-06-18

我正在尝试让 browserify 的自定义依赖项名称与内存流一起使用。我使用内存流的原因是因为此代码注定要在 AWS Lambda 内部运行,该 AWS Lambda 将接收多个“文件”作为输入,并且 Lambda 无法通过文件系统使用该代码。

根据文档https://github.com/substack/node-browserify https://github.com/substack/node-browserify,看起来这应该是可能的:

b.require(文件,选项)

文件也可以是流,但您还应该使用 opts.basedir 以便可以解决相对需求。

使用 opts 的公开属性来指定自定义依赖项名称。 require('./vendor/Angular/Angular.js', {expose: 'Angular'}) 启用 require('Angular')

Code:

const browserify = require('browserify')
const path = require('path')
const File = require('vinyl')

const jsIndex = new File({
    file: path.resolve('index.js'),
    contents: new Buffer('var two = require("./two")')})
const jsTwo  = new File({
    file: path.resolve('two.js'),
    contents: new Buffer('console.log("Hello from two.js")')})

browserify({
        entries: [ jsIndex ],
        require: [ jsTwo ],
        basedir: path.resolve('.')
    })
    .bundle((err, res) => {
        if (err) console.log(err.message)
    })
    .pipe(process.stdout)

Error:

Cannot find module './two' from '...'

Edit:

另一个人在 node-browserify github 页面上发布了类似的问题:https://github.com/substack/node-browserify/issues/1622 https://github.com/substack/node-browserify/issues/1622


Browserify 大量使用文件系统,因为它实现了自己的模块解析,该解析使用与 Node 相同的算法require。要让 Browserify 使用内存中的源文件进行捆绑,一种解决方案是对文件系统进行猴子修补 - 类似于mock-fs https://github.com/tschaub/mock-fs对测试有用的模块。

但是,您实际上只想对源文件执行此操作。 Browserify 对捆绑包中包含的其他文件使用其模块解析,并且必须将这些文件添加到内存文件系统中会很乏味。修补的文件系统函数应该检查涉及内存中源文件的调用,相应地处理它们并将其他调用转发到原始实现。 (mock-fs做类似的事情,它检测发生在require并将这些调用转发给原始实现。)

'use strict';

const fs = require('fs');
const path = require('path');
const toStream = require('string-to-stream');

// Create an object hash that contains the source file contents as strings,
// keyed using the resolved file names. The patched fs methods will look in
// this map for source files before falling back to the original
// implementations.

const files = {};
files[path.resolve('one.js')] =
    'console.log("Hello from one.js");' +
    'var two = require("./two");' +
    'exports.one = 1;';
files[path.resolve('two.js')] =
    'console.log("Hello from two.js");' +
    'exports.two = 2;';

// The three fs methods that need to be patched take a file name as the
// first parameter - so the patch mechanism is the same for all three.

function patch(method, replacement) {

    var original = fs[method];
    fs[method] = function (...args) {

        var name = path.resolve(args[0]);
        if (files[name]) {
            args[0] = name;
            return replacement.apply(null, args);
        } else {
            return original.apply(fs, args);
        }
    };
}

patch('createReadStream', function (name) {

    return toStream(files[name]);
});

patch('lstat', function (...args) {

    args[args.length - 1](null, {
        isDirectory: function () { return false; },
        isFile: function () { return true; },
        isSymbolicLink: function () { return false; }
    });
});

patch('stat', function (...args) {

    args[args.length - 1](null, {
        isDirectory: function () { return false; },
        isFile: function () { return true; }
    });
});

// With the fs module patched, browserify can be required and the bundle
// can be built.

const browserify = require('browserify');

browserify()
    .require(path.resolve('one.js'), { entry: true, expose: 'one' })
    .require(path.resolve('two.js'), { expose: 'two' })
    .bundle()
    .pipe(process.stdout);

require and expose

在你的问题中,你提到expose. The one.js and two.js模块使用捆绑require,因此可以使用在浏览器中指定的名称来要求它们expose选项。如果这不是你想要的,你可以使用add相反,它们将是捆绑包内部的模块。

<!doctype html>
<html>
<head>
    <title>so-39397429</title>
</head>
<body>
    <script src="./bundle.js"></script>
    <script>
        // At this point, the bundle will have loaded and the entry
        // point(s) will have been executed. Exposed modules can be
        // required in scripts, like this:
        console.log(require('one'));
        console.log(require('two'));
    </script>
</body>
</html>

我花了一些时间研究 Browserifyrequire and expose调查时的选项这个问题 https://stackoverflow.com/q/38891391/6680611。这些选项有助于从捆绑包外部请求模块,但我完全不确定它们对捆绑包内模块之间的需求有任何影响(这就是您所需要的)。另外,他们的实现有点令人困惑 - 特别是这部分 https://github.com/substack/node-browserify/blob/13.1.0/index.js#L118-L128其中公开的名称有时会在前面加上斜杠。

乙烯基流

在你的问题中,你使用了vinyl。但是,我无法使用vinyl对于读取流。虽然它确实实现了pipe,它不是一个事件发射器,并且似乎没有实现on- 基于 pre-Streams 2 API - 这是 Browserify 对createReadStream result.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Browserify 的自定义依赖项名称不起作用 的相关文章

随机推荐

  • ASP.NET Core 应用程序生命周期

    目前是否有关于生命周期的 ASP NET Core 文档 我希望能够在正确的点融入生命周期 它与现有的 ASP NET MVC 5 生命周期相似吗 http www asp azureedge net v 2016 09 01 001 me
  • 如何在 RxSwift 中延迟地从 Collection 中一件一件地发出项目

    我想从anyCollection 创建一个Observable 它会在延迟后一一发出每个元素 另外 在下一步我想对项目 模型 执行一些更新 例如 喂所有狗 一只一只 间隔 5 秒 class Dog var name String var
  • 覆盖二维平面上给定点的最小圆

    问题 覆盖 2D 平面上给定 N 个点的圆的最小可能直径是多少 解决这个问题最有效的算法是什么 它是如何工作的 这是最小圆问题 http en wikipedia org wiki Smallest circle problem 请参阅参考
  • 如何在C#中使用谷歌语音识别API?

    我想从 C 获取音频文件并发送到谷歌语音识别 API 以获得 语音到文本 的答案 我的代码是这样的 try byte BA AudioFile GetFile filename HttpWebRequest HWR SpeechToText
  • 在android 10中设置通知操作的背景颜色

    我已经做到了这一点图片链接 https i stack imgur com o0Cel jpg通过关注这篇文章https medium com dcostalloyd90 show incoming voip call notificati
  • 更改所选控件的输入语言

    我的应用程序中有一个文本区域 我想以编程方式单独设置文本区域的输入语言 而不影响其他控件 不幸的是 您的程序无法完成此操作 用户需要使用 Unicode 键盘或输入法编辑器 IME 由于您使用的是 C Net 平台 因此您的程序已经能够处理
  • C 有标准的队列实现吗?

    是否有 C 语言 附带 的队列数据结构实现 或者我必须开发自己的队列数据结构实现 这是一个学校项目 因此我必须使用标准 gcc 安装中存在的东西 或者必须自己实现一个 其他通用数据结构 如链表 堆栈等 又如何呢 尝试这个 Unix 附带了几
  • 为什么 Javascript 中未定义的变量有时会计算为 false,有时会抛出未捕获的 ReferenceError?

    我读过的所有内容都表明 在 Javascript 中 未定义变量的布尔值是 False 我已经使用过这样的代码数百次 if elem 其目的是 如果 elem 未定义 则将执行块中的代码 它通常可以工作 但有时浏览器会抛出一个错误 抱怨未定
  • 无法使用 CLI Firebase auth:import 命令导入用户帐户

    我需要在 Firebase 中导入用户列表以及电子邮件和密码 我正在尝试使用 CLI auth import 命令在 Firebase 中导入用户 https firebase google com docs cli auth import
  • 有没有办法将 SVG 字符串渲染到 Web Worker 中的 OffscreenCanvas?

    我正在开发一个网页 对 SVG 字符串数据进行一些相当繁重的处理 因为这些字符串的大小可能达到 m bs 所以我想将 SVG 的渲染 取决于浏览器 移至工作人员 以避免阻塞 UI 我的问题是 worker 中无法访问 DOM 元素 有没有办
  • 从 MVC 控制器调用 Web API

    我的 MVC 5 项目解决方案中有一个 Web API 控制器 WebAPI 有一个方法可以将特定文件夹中的所有文件作为 Json 列表返回 name file1 zip path c 从我的 HomeController 我想调用这个方法
  • 使用自制程序和安装程序安装 gfortran 是否会产生冲突?

    我正在按照在线教程使用 homebrew 安装一些 Python 模块 其中一个步骤是安装 gfortranbrew install gfortran 后来 我尝试使用另一个第三方安装脚本来安装一些Python模块 之后我意识到该脚本所做的
  • 使用 RSpec 测试导轨金属/机架?

    假设我有一个名为 Preview 的 Metal 类 如何使用 RSpec 进行测试 当我尝试时 require spec helper describe Preview do it should return the posted con
  • GLSurfaceView onDrawFrame 清除行为

    我在使用 GLSurfaceView 时遇到了不同的行为 据我所知 程序有责任清除每帧的缓冲区 颜色和深度 这意味着 如果我不清除缓冲区 我将获得最后一帧的内容 或双缓冲的前一帧 似乎无论在某些设备上如何 缓冲区都会被清除 我在一些测试设备
  • Swift 仅删除字符串中的尾随空格

    SO 中的许多示例都固定两侧 即前导和尾随 我的要求只是关于尾随 我的输入文本是 保持我的左侧 期望的输出 保持我的左侧 当然 这个命令会删除两端 let cleansed messageText trimmingCharacters in
  • IClaimsTransformation 未被调用

    我正在开发 ASP NET Core Web 应用程序 NET 5 0 这是一个 Intranet 应用程序 因此我使用 Windows 身份验证 对于授权 我使用 AspNetCore Identity 中的自定义角色 出于各种原因不想使
  • 在 Java 中复制文件的最快方法

    在 Java 中复制大量文件的最快方法是什么 到目前为止我已经使用了文件流和nio 总体来说流似乎比 nio 更快 到目前为止 你有哪些经历 http www baptiste wicht com 2010 08 file copy in
  • 更改先前提交的作者姓名:快进推送被拒绝

    我最近在 GitHub 上打开了一个存储库 我是 Git 新手 与新人一样 我使用默认名称和电子邮件进行提交 按照最佳菜鸟传统 我发现五次提交为时已晚 现在乐趣开始了 因为我开始搜索有关如何更改这些提交的作者和提交者名称的信息 美好的 我基
  • Xcode 4.6.3 中 Dropbox API 的代码设计失败:“代码对象根本没有签名”

    我有一个通过 Mac App Store 分发的 OS X 应用程序 最近更新到 Xcode 4 6 3 当我现在运行常规构建时 我收到 Command usr bin codesign failed with exit code 1 Us
  • Browserify 的自定义依赖项名称不起作用

    我正在尝试让 browserify 的自定义依赖项名称与内存流一起使用 我使用内存流的原因是因为此代码注定要在 AWS Lambda 内部运行 该 AWS Lambda 将接收多个 文件 作为输入 并且 Lambda 无法通过文件系统使用该