Home  >  Article  >  Web Front-end  >  Implementation code for synchronous and asynchronous loading of JavaScript files

Implementation code for synchronous and asynchronous loading of JavaScript files

韦小宝
韦小宝Original
2018-01-19 10:32:211309browse

This article mainly introduces the implementation code of synchronization and asynchronous loading of JavaScript files. It has certain reference and value for learning JavaScript. Those who are interested in JavaScript can learn about this article

Regarding the reference of JS files, although there are currently many frameworks and tools (such as webpack, commonjs, requiresjs, etc.), they have done a good job. But aside from these frameworks, it is still helpful to understand the native loading method. This article briefly describes the synchronous and asynchronous loading methods of some js files.

Synchronous loading

Can be inserted into the html file with the 3f1c4e4b6b16bbbd69b2ee476dc4f83a tag. This is the most basic way when you first learn .

Prepare two js files as follows:

calc1.js

console.log('calc1 loading begin')

function add(...args) {
  return args.reduce((currentTotal, i) => currentTotal + i, 0);
}
console.log('calc1 loading end')

calc2.js

console.log('calc2 loading begin')

console.log(add(1,2,3))

console.log('calc2 loading end')

calc2.js depends on calc1.js of.

The html file is as follows:

<body>

  <script src="calc1.js">
  </script>
  
  <script src="calc2.js">
  </script>
</body>

In this way, the file loading is synchronous. That is, calc2.js is loaded only after calc1.js is loaded, so it is guaranteed that calc2.js can always call the add function in calc1 correctly. The debugging results in Chrome are as follows:

However, the disadvantages of synchronous loading are also obvious. If there are multiple files, the total loading time will be very long and the user interface will be blocked. response.

Asynchronous loading through Script Element

The advantage of asynchronous loading is that multiple js files can be loaded at the same time, and because it is asynchronous , will not block the user interface and provide a good user experience. Of course, the disadvantage is that the loading order of dependent files cannot be guaranteed.

html Code

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script type="text/javascript">
    var script1 = document.createElement(&#39;script&#39;);
    script1.src=&#39;calc1.js&#39;;
    script1.type=&#39;text/javascript&#39;;

    var script2 = document.createElement(&#39;script&#39;);
    script2.src=&#39;calc2.js&#39;;
    script2.type=&#39;text/javascript&#39;;

    document.getElementsByTagName(&#39;head&#39;)[0].appendChild(script1).appendChild(script2);
  </script>
</head>

The debugging results in Chrome can sometimes be correctly output as follows:

But sometimes due to clac1. js is not loaded first, and an error will be reported when calc2.js is executed.

Then we have to solve the loading order problem and ensure that calc1.js is loaded first.

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script type="text/javascript">
    function loadScript(file, callbackFn) {
      var script = document.createElement(&#39;script&#39;);
      script.src= file;
      script.type=&#39;text/javascript&#39;;
      // 监听onload时间,当前js文件加载完成后,再加载下一个
      script.onload = callbackFn;
      document.getElementsByTagName(&#39;head&#39;)[0].appendChild(script)
    }
    
    loadScript(&#39;calc1.js&#39;, function () {
      loadScript(&#39;calc2.js&#39;);
    } );

  </script>
</head>

In this way, the correct result will always be output.

Loading JS files through AJAX

 <script>
    function loadScript(file, callbackFn) {
      var xhr = new XMLHttpRequest();
      xhr.open(&#39;get&#39;, file, true);
      // for IE
      if (xhr.onreadystatechange) {
        xhr.onreadystatechange = function () {
          console.log(xhr.readyState, xhr.status);
          if (xhr.readyState == 4) {
            if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
              insertScriptText(xhr.responseText);
              if (callbackFn) {
                callbackFn();
              }
            }
          }
        }
      } else {
        xhr.onload = function () {
          insertScriptText(xhr.responseText);
          if (callbackFn) {
            callbackFn();
          }
        }
      }
      xhr.send(null);
    }

    function insertScriptText(scriptText) {
      var script = document.createElement(&#39;script&#39;);
      script.type = &#39;text/javascript&#39;;
      script.text = scriptText;
      document.body.appendChild(script);
    }

    loadScript(&#39;calc1.js&#39;, function () {
      loadScript(&#39;calc2.js&#39;);
    });

  </script>


can also output the results correctly.


If it is a single or a few js files, you can insert a script tag at the end of the html body to load it synchronously. Webpack actually merges multiple js files into one, and then inserts a script reference into the body.

Related recommendations:

Imitating Sina Weibo’s original ecological input word count instant check function implemented in JavaScript

javascript How to generate random numbers Summary of this method

JavaScript implementation code for shielding the Backspace key

The above is the detailed content of Implementation code for synchronous and asynchronous loading of JavaScript files. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn