gpt4 book ai didi

JavaScript 在这些语句中会初始化/执行任何内容吗?

转载 作者:行者123 更新时间:2023-12-03 08:10:58 24 4
gpt4 key购买 nike

我正在尝试确定以下语句是否实际执行 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>

最佳答案

好的,首先,JavaScript 按照您在文档中定义的顺序执行,无论是一段代码还是脚本标记指向的物理文件,但完整的解析取决于文件大小和网络因此,多个文件按照定义的升序开始,并以不同的时间间隔完成加载。

您可以使用 deferasync 属性使脚本加载异步。 Link .

要了解执行流程,请查看此stackoverflow link谁有使用 jquery 的类似代码。

要获得问题的明确答案,请阅读以下内容以清楚了解各个库

RequireJS(AMD):

RequireJS 查找首先通过入口点配置中定义的 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 函数之前可用的依赖函数定义。所有代码文件都捆绑到一个文件中,该文件在运行时在单个范围内可用。类似的可以在 RequireJS 中使用 r.js 来实现优化器。

请阅读此link关于浏览器化

插图示例代码:

mod1.js:

module.exports = function(){    
alert("Loaded");
};

构建命令:

browserify -r ./mod1.js:mod > 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 缝合了从入口点代码开始的所有 JS 文件(这里是 mod1.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 文件中。因此,所有定义和函数共享相同的闭包范围,并在内存中进行初始化和可用。当您需要模块定义时 -> 如果它是变量,则返回值,或者如果它是函数,则返回指针,您可以在其中进行函数调用。

AMD 作为 RequireJS: 这相对来说是非常不同的,因为文件是在运行时的 require 调用执行时加载的,稍后会执行附加到该 require 定义的回调。依赖关系已解决。因此,在此方法中,当 require 调用发生时,内存会逐渐被函数重载(这称为延迟加载)。

<小时/>

注意:r.js 是 requireJS 插件,用于优化和拼接所有 JS 文件,与 browserify 相同。

关于JavaScript 在这些语句中会初始化/执行任何内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34147617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com