【问题标题】:client-side node module doesn't work after browserify浏览器化后客户端节点模块不起作用
【发布时间】:2015-07-19 02:34:49
【问题描述】:

我正在尝试在 node.js 下开发一个应用程序。我需要一个名为 autocomplete 的模块,所以我做了

npm install -S autocomplete

而且效果很好。 packages.json 已更新,一切都已更新。

但我需要客户端的自动完成功能。这个问题最流行的解决方案似乎是使用 browserify,所以我全局安装了它,它似乎可以工作。

现在根据我读过的所有内容,我应该能够:

cd node_modules
browserify autocomplete/index.js > bundle.js
mv bundle.js ../public/lib/js/

然后在views/index.html中我应该能够拥有

<script src="lib/js/bundle.js">

最后我应该可以说

var auto = new Autocomplete();

因为 Autocomplete 对象是在自动完成模块中定义的,这就是说明如何实例化它的方式。

但不幸的是,我的浏览器显示Autocomplete is not defined,所以它显然没有收到消息。

上面有什么问题?

【问题讨论】:

    标签: node.js autocomplete client-side browserify node-modules


    【解决方案1】:

    运行 Browserify 时,将其创建为 standalone 模块:

    browserify autocomplete/index.js --standalone Autocomplete > autocomplete.js
    

    为了简单起见,我只是在这里更改名称 - 随便你怎么称呼它。

    然后,当您在浏览器中运行它时,new Autocomplete() 应该可用。

    编辑 虽然这是可行的,但该模块的文档丢失了,而且您正在阅读文档的模块似乎也丢失了。

    当您可以使用像 typeahead 这样已经为浏览器构建的东西时,就没有必要再去麻烦了。

    【讨论】:

    • 感谢您的成功!我有点惊讶,在我阅读 browserify 的几个小时里,我从来没有读过“--standalone”标志。我想通常不需要?你能告诉我“自动完成”有什么不同吗?
    • 任何时候一个模块只使用module.exports,那么浏览器就不知道这个模块被调用了什么。这就是--standalone 为您所做的。我现在正在用同样的东西建立一个图书馆。随意upvote :)
    • 您好,不幸的是,即使我能够使用您的解决方案实例化对象,在对象上调用方法也会出现另一个错误。我实例化了auto = new Autocomplete(),但随后auto.initialize(data) 产生了Uncaught TypeError: getInitialElements is not a function。有什么想法吗?
    • 我不知道你想做什么,或者你是怎么做的,但是如果你想在客户端使用那个库,这就是这样做的方法。其他错误是什么,我需要更多信息来帮助。
    • 用法来自模块页面npmjs.com/package/triecomplete上的示例代码。我只是插入了他们建议的代码,以演示如何使用该模块。失败的方法是自动完成模块中的内部方法,所以看起来 browserify 没有将所有需要的东西发送到客户端。感谢您的帮助。
    【解决方案2】:

    事实证明,因为自动完成没有导出到全局范围。 在您使用自动完成功能的文件中尝试此操作,例如在 app.js 中:

    var Autocomplete = require('autocomplete');
    var auto = new Autocomplete();
    

    然后

    browserify app.js > bundle.js
    mv bundle.js ../public/lib/js/
    

    【讨论】:

    • 感谢您的回复,但不幸的是,这对我不起作用,因为“require”未在客户端定义。这是另一个我知道很多已经写过的问题,但到目前为止我还没有找到解决方案!您如何为客户端使用定义“要求”?
    • browserify 将递归地分析应用程序中的所有 require() 调用,以便构建一个可以在单个
    • 当代码必须位于客户端并且客户端不知道“要求”是什么时,您的上述解决方案将如何工作?
    • 您指的是“模块名称或文件到 bundle.require() 的部分。可选地使用冒号分隔符来设置目标。”?那句话不清楚。你知道它的用途吗?
    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2015-07-30
    • 2012-07-08
    • 2019-02-07
    相关资源
    最近更新 更多