Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Yabble入门——浏览器端CommonJS模块加载_Javascript_Node.js_Code Reuse_Commonjs - Fatal编程技术网

Javascript Yabble入门——浏览器端CommonJS模块加载

Javascript Yabble入门——浏览器端CommonJS模块加载,javascript,node.js,code-reuse,commonjs,Javascript,Node.js,Code Reuse,Commonjs,有人熟悉JS加载程序或其他浏览器端加载程序吗 我正在试验Node.js,非常希望创建Javascript模块,这些模块可以在服务器端和客户端上互换使用。这可能会更像是一种“因为它很棒”的东西,而不是一种“因为它实用和有用”的东西 因此,我基本上是想让CommonJSrequire()方法在浏览器端工作,这正是Yabble应该做的。但我真的不知道从哪里开始。除了在中找到的文档之外,我似乎找不到任何其他文档,这并没有多大帮助 基本上我所做的就是把它放在一个HTML页面中 <script src

有人熟悉JS加载程序或其他浏览器端加载程序吗

我正在试验Node.js,非常希望创建Javascript模块,这些模块可以在服务器端和客户端上互换使用。这可能会更像是一种“因为它很棒”的东西,而不是一种“因为它实用和有用”的东西

因此,我基本上是想让CommonJS
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'); }