我正在尝试解决以下语句是否实际执行JavaScript - bundle.js是否运行,还是仅仅是bundle.js中的函数已经准备好为稍后的语句执行它们?
关于var X = require的相同问题(' X');
我的理解是,这会将X.js加载到内存中但是会初始化代码吗?或者var =只是将函数加载到内存中吗?
<body >
</div>
<script src="http://localhost:3000/dist/bundle.js"></script>
<script type="text/javascript">
(function () {
var X = require('X');
X(mountNode, endpointsRoot, locale, user);
})();
</script>
</body>
答案 0 :(得分:1)
好的开始,JavaScript按照您在文档中定义的顺序执行,可以是脚本标记指向的一段代码或物理文件,但完整的解析取决于文件大小和网络因此,多个文件按照定义的升序开始,并以不同的时间间隔完成加载。
您可以使用延迟和 async 属性使脚本加载异步。 Link
要了解执行流检查此 stackoverflow link谁使用jquery有类似的代码。
要明确回答您的问题,请阅读以下内容以了解相应图书馆的清晰图片
RequireJS查找首先按照在entrypoint中的config中定义的JS文件的名称或在require方法数组中定义的依赖项进行。
请阅读此链接RequireJS
例如,请看下面的代码:
<强> bundle.js 强>
define("X", [],function(){ //named definition without any dependencies.
return function() {
alert("Loaded");
}
});
<强> 的index.html 强>
<body>
<script src="require.js" type="text/javascript" charset="utf-8"></script>
<script src="bundle.js"></script>
<script type="text/javascript">
require(["require", "X"],function (require) { //"X" is defined in the array of require definition
var X = require("X");
X();
});
</script>
</body>
所有依赖关系都与AMD中的回调进行了连接,以解决加载时间差异,从某种意义上说,这些模块在使用内存中加载的必需模块执行回调时可用。
模拟浏览器上客户端的Node JS模块加载。
工作原理:
额外构建步骤可以连接所有在require函数之前可用的依赖函数定义。所有代码文件都捆绑在一个文件中,该文件在运行时在单个作用域中可用。使用r.js优化器可以在RequireJS中实现类似的功能。
请阅读link有关browserify的信息
插图示例代码:
mod1.js:
module.exports = function(){
alert("Loaded");
};
构建命令:
browserify -r ./mod1.js:mod&gt; bundle.js
这会生成一个名为 bundle.js 的文件,其模块名称为 mod ,可以包含在index.html中,如下所示
<body >
<script src="bundle.js"></script>
<script type="text/javascript">
(function () {
var X = require('mod');
X();
})();
</script>
</body>
这里,browserify从入口点代码(此处为mod1.js)开始定义所有JS文件,并递归搜索require api并在这些模块之上构建闭包范围。
因此你的bundle.js看起来如下
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"mod":[function(require,module,exports){
module.exports = function(){
alert("Loaded");
};
},{}]},{},[]);
Browserify: 一次性加载函数,因为所有文件都连接成一个JS文件。因此,所有定义和函数共享相同的闭包范围并初始化并在内存中可用。当您需要模块定义时 - &gt;如果它是一个变量,则返回该值,或者如果它是一个函数然后指针,则返回函数,您可以在其中进行函数调用。
AMD作为RequireJS: 这是相当不同的,因为文件在运行时需要调用执行时加载,后来执行附加到该需求定义的回调依赖关系得到解决。 因此,在这种方法中,当需要调用(这称为延迟加载)时,内存会逐渐重载函数。
注意:强> r.js 是用于优化和连接所有JS文件的requireJS插件,与browserify相同。
答案 1 :(得分:0)
是的,Javascript匿名函数已执行。
bundle.js被加载到内存中,直到稍后执行。 如果bundle.js只包含定义而没有调用,则不会执行任何操作但会加载到内存中。
要求(&#39; X&#39;)加载&#39; X&#39;进入内存并初始化代码。
如果你可以分享bundle.js和&#39; X&#39;代码可以识别功能调用。