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

时间:2015-12-08 03:45:05

标签: javascript browserify amd

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

2 个答案:

答案 0 :(得分:1)

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

您可以使用延迟 async 属性使脚本加载异步。 Link

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

要明确回答您的问题,请阅读以下内容以了解相应图书馆的清晰图片

RequireJS(AMD):

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中的回调进行了连接,以解决加载时间差异,从某种意义上说,这些模块在使用内存中加载的必需模块执行回调时可用。

Browserify:

模拟浏览器上客户端的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;代码可以识别功能调用。