是否存在任何用于浏览器内javascript的库,它们提供与Node相同的灵活性/模块性/易用性require?
提供更多细节:原因require很好,它是:
jQuery.ajax()var dsp = require("dsp.js");我将能够访问dsp.FFT,这不会干扰我的本地var FFT我还没有找到一个能够有效地完成这项工作的库.我倾向于使用的解决方法是:
coffeescript-concat - 它很容易需要其他js,但你必须编译它,这意味着它不太适合快速开发(例如构建API in-test)
RequireJS - 它是流行的,直截了当的,并解决了1-3,但缺乏范围是一个真正的交易破坏者(我相信head.js是相似的,因为它缺乏范围,虽然我从来没有任何机会使用它.类似地,LABjs可以加载并.wait()确实缓解依赖性问题,但它仍然没有确定范围)
据我所知,似乎有许多解决方案用于javascript的动态和/或异步加载,但它们往往具有与从HTML加载js相同的范围问题.最重要的是,我想要一种加载不会污染全局命名空间的javascript的方法,但仍允许我加载和使用库(就像节点的要求一样).
编辑(我的答案):自写这篇文章以来,我已广泛使用RequireJS(现在有更清晰的文档).在我看来,RequireJS确实是正确的选择.我想澄清一下系统如何适用于那些和我一样困惑的人:
您可以require在日常开发中使用.模块可以是函数返回的任何内容(通常是对象或函数),并且作为参数确定范围.您还可以将项目编译为单个文件以进行部署r.js(实际上,这几乎总是更快,即使require可以并行加载脚本).
RequireJS和node-style之间的主要区别就像browserify(由tjameson建议的一个很酷的项目)使用的是模块的设计和要求:
require获取要加载的模块(javascript文件)列表和回调函数.当它加载了每个模块时,它会调用每个模块的回调作为回调的参数.因此,它是真正的异步,因此非常适合网络.require是一个阻塞调用,它加载模块并将其作为对象返回.这适用于Node,因为文件从文件系统读取,这足够快,但在Web上运行不佳,因为同步加载文件可能需要更长的时间.实际上,许多开发人员在看到AMD之前都使用过Node(因此也使用了CommonJS).此外,许多库/模块是为CommonJS编写的(通过向exports对象添加内容)而不是为AMD 编写(通过从define函数返回模块).因此,许多支持Node的Web开发人员希望在Web上使用CommonJS库.这是可能的,因为从<script>标签加载是阻塞的.像browserify这样的解决方案采用CommonJS(Node)模块并将它们包装起来,以便您可以将它们包含在脚本标记中.
因此,如果您正在为Web开发自己的多文件项目,我强烈推荐RequireJS,因为它确实是Web的模块系统(尽管在公平披露中,我发现AMD比CommonJS更自然).最近,区别变得不那么重要了,因为RequireJS现在允许您基本上使用CommonJS语法.另外,RequireJS可用于在Node中加载AMD模块(虽然我更喜欢node-amd-loader).
我试过这个:
// mod.js
var a = 1;
this.b = 2;
exports.c = 3;
// test.js
var mod = require('./mod.js');
console.log(mod.a); // undefined
console.log(mod.b); // 2
console.log(mod.c); // 3, so this === exports?
Run Code Online (Sandbox Code Playgroud)
所以我想象require()可能是这样实现的:
var require = function (file) {
var exports = {};
var run = function (file) {
// include "file" here and run
};
run.apply(exports, [file]);
return exports;
}
Run Code Online (Sandbox Code Playgroud)
是对的吗?请帮我理解require(),或者在哪里可以找到源代码.谢谢!
当我做:
lib = require('lib.js')(app)
Run Code Online (Sandbox Code Playgroud)
在app实际歌厅通过呢?
在lib.js中:
exports = module.exports = function(app){}
Run Code Online (Sandbox Code Playgroud)
似乎没有,因为当我尝试做的不仅仅是(app),而是做:
lib = require('lib.js')(app, param2)
Run Code Online (Sandbox Code Playgroud)
和:
exports = module.exports = function(app, param2){}
Run Code Online (Sandbox Code Playgroud)
我没有params2.
我试图通过以下方式进行调试:
params = {}
params.app = app
params.param2 = "test"
lib = require("lib.js")(params)
Run Code Online (Sandbox Code Playgroud)
但在lib.js中,当我尝试JSON.stringify收到此错误时:
"DEBUG: TypeError: Converting circular structure to JSON"
Run Code Online (Sandbox Code Playgroud) 我正在构建一个节点应用程序,并且.js中的每个文件内部用于执行此操作以在各种包中要求.
let co = require("co");
Run Code Online (Sandbox Code Playgroud)
但是得到
所以使用打字稿似乎在整个项目中只能有一个这样的声明/要求?我对此感到困惑,因为我认为let它的范围是当前文件.
我刚刚有一个正在运行的项目但是在重构之后我现在正在处理这些错误.
谁能解释一下?
怎么样require和require_dependency不同?
如何require_dependency在开发中自动重新加载类但require不能?
我深入研究了Rails ActiveSupport::Dependencies和dispatcher.rb代码.我在require_dependency代码中看到的是它基本上将常量添加到autoloaded_constants数组中.但是clear_application在每个请求之后它会在内部调度程序中被清除.
有人可以给出明确的解释或指出一些有用的资源吗?
我遇到的问题包括在我的NodeJs项目中执行的文件.
我在同一目录中有两个文件:
a.js
var test = "Hello World";
Run Code Online (Sandbox Code Playgroud)
和
b.js
require('./a.js');
console.log(test);
Run Code Online (Sandbox Code Playgroud)
我执行b.js node b.js并得到错误ReferenceError: test is not defined.
我查看了文档http://nodejs.org/api/modules.html#modules_file_modules
我错过了什么?提前致谢.
我试图要求一个文件,然后将其传递给var.我正在按照本教程创建一个身份验证系统.在编写server.js文件并尝试编译后,我得到了一个bson错误,因此我更改了需要在mongoose中发布版本的行.
这是我的代码和错误:
server.js
require('./app/routes')(app, passport);
Run Code Online (Sandbox Code Playgroud)
错误
require('./app/routes')(app, passport);
^
TypeError: require(...) is not a function
at Object.<anonymous> (d:\Node JS learning\WorkWarV2\server.js:38:24)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:475:10)
at startup (node.js:117:18)
at node.js:951:3
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)
我已经读过,这通常意味着requireJS没有正确加载,但我不知道为什么或如何解决它.
由于评论而编辑:
如上所述,这是结果console.log(require);
是否有更短的方法来要求位于同一目录中的文件(正在执行的脚本)?
require File.expand_path(File.dirname(__FILE__) + '/some_other_script')
Run Code Online (Sandbox Code Playgroud)
我读了这个require "my_script"并且require "./my_script"实际上会加载脚本两次(ruby不会认识到它实际上是同一个脚本),这File.expand_path就是推荐的原因:如果每次需要脚本时都使用它,那么它只会被加载一旦.
对我来说,像Ruby这样的简洁语言似乎没有更短的解决方案,这似乎很奇怪.例如,python只是这个:
import .some_other_module_in_the_same_directory
Run Code Online (Sandbox Code Playgroud)
我想我可以修补猴子require......但这只是邪恶的!;-)
在Ruby中,有人告诉我这样做
require "some_file"
Run Code Online (Sandbox Code Playgroud)
Ruby将在某些地方查找该文件.
我知道它在寻找some_file.rb,但默认情况下它在哪里寻找?
这是项目结构:
/
app.js
package.json
/node_modules
/app
config.json
/frontend
assets and html tpls
/modules
couch.js
raeume.js
users.js
Run Code Online (Sandbox Code Playgroud)
我需要来自app.js的config.json,raeume.js和users.js,一切正常.
var config = require('./app/config');
var raeume = require('./app/modules/raeume');
var users = require('./app/modules/users');
Run Code Online (Sandbox Code Playgroud)
然后我要求user.js中的config.json和couch.js以同样的方式,它将找不到任何东西.
var couch = require('./app/modules/couch');
var config = require('./app/config');
Run Code Online (Sandbox Code Playgroud)
我想它应该找到它.经过一些研究,我看到了各种各样的问题,包括如何编译节点.因此包括:我使用节点v0.10.7在osx 10.8上工作.