Javascript Yabble入门——浏览器端CommonJS模块加载
有人熟悉JS加载程序或其他浏览器端加载程序吗 我正在试验Node.js,非常希望创建Javascript模块,这些模块可以在服务器端和客户端上互换使用。这可能会更像是一种“因为它很棒”的东西,而不是一种“因为它实用和有用”的东西 因此,我基本上是想让CommonJSJavascript Yabble入门——浏览器端CommonJS模块加载,javascript,node.js,code-reuse,commonjs,Javascript,Node.js,Code Reuse,Commonjs,有人熟悉JS加载程序或其他浏览器端加载程序吗 我正在试验Node.js,非常希望创建Javascript模块,这些模块可以在服务器端和客户端上互换使用。这可能会更像是一种“因为它很棒”的东西,而不是一种“因为它实用和有用”的东西 因此,我基本上是想让CommonJSrequire()方法在浏览器端工作,这正是Yabble应该做的。但我真的不知道从哪里开始。除了在中找到的文档之外,我似乎找不到任何其他文档,这并没有多大帮助 基本上我所做的就是把它放在一个HTML页面中 <script src
require()
方法在浏览器端工作,这正是Yabble应该做的。但我真的不知道从哪里开始。除了在中找到的文档之外,我似乎找不到任何其他文档,这并没有多大帮助
基本上我所做的就是把它放在一个HTML页面中
<script src="yabble.js"></script>
<!-- Uses require -->
<script>
require.setModuleRoot('http://localhost:8030/')
my_module = require('my_module')
</script>
require.setModuleRoot('http://localhost:8030/')
my_module=require('my_module')
但无论何时调用require()
函数,我得到的同步require()都不受支持。
引发异常
有人能帮我开始吗?我应该在哪里加载
yabble.js
我应该在哪里调用require?是否有特殊的方式来运行我的Javascript模块?在浏览器中同步加载模块是有问题的。一种类似于:
var x = require('something_remote.js')
意味着浏览器将停止您的代码(即块),去获取远程文件,解析它,然后将导出返回给您。但这与单线程浏览器环境并不矛盾——我们将在网络性能上停止主JavaScript线程(从而停止用户的页面交互)。因此,浏览器已经针对这种情况进行了改进,在自己的时间表上支持异步加载。这里有一些很好的讨论:
一种可能在这里起作用的模式是require()实现确实会同步阻塞,通过XHR获取文件,然后对其进行求值,但这似乎是针对所有基于异步文件加载的浏览器支持/基础结构的。我也很好奇这对浏览器安全的跨域原语有什么影响
因此,为了适应浏览器异步加载模型,我们需要使用回调机制,如:
require("something.js", function () { // called later, after something.js has loaded! })
看起来RequireJS正在这样做:
也许可以试一试
像NodeJS等JavaScript环境——通过提供从磁盘而不是从外部网络主机加载“本地”模块而构建——可以进行同步加载
我非常感谢JS专家的任何更正:-)当将需要使用
require()
函数的Javascript代码加载到浏览器中时,该代码的入口点必须是require.run()
函数
e、 g.好的:
<script src="yabble.js"></script>
<script>
require.setModuleRoot('http://localhost:8030/')
require.run('my_module') // <-- Uses require() function somewhere
</script>
仅供参考,Yabble做这件事真是妙不可言。它实际上会静态分析Javascript源代码,我认为基本上只需使用正则表达式来查找
require()
方法,然后尝试从服务器中提取.js
脚本,然后对.js
脚本进行相同的静态分析,等等
这可能特别令人困惑,因为它实际上会加载那些.js
脚本,即使控制逻辑意味着程序流永远不会到达require()
函数。e、 如果你有
if (False) { require('some_module'); }
。。。Yabble仍将加载此模块。感谢您提供的有用信息!事实上,我一直在寻找关于Yabble的更具体的信息,所以我不能真正将此标记为答案,但我最终还是自己找到了答案。如果你把所有东西都捆绑到一个文件中(使用yabbler),它已经有了所有的模块,一个sync
require()
就可以了。它是在if(false){require('x;)}
的情况下运行模块,还是从服务器上拉出来?@Kragen我不确定,我会在有机会的时候运行一个测试。酷!也许我自己会试试。
if (False) { require('some_module'); }