Home  >  Article  >  Web Front-end  >  Explanation of methods to implement synchronization and asynchronous loading of JavaScript files

Explanation of methods to implement synchronization and asynchronous loading of JavaScript files

巴扎黑
巴扎黑Original
2017-08-21 09:38:152145browse

This article mainly introduces the implementation code of synchronous and asynchronous loading of JavaScript files, which has certain reference value. Those who are interested can learn about

References to JS files, although there are currently many frameworks and tools (such as webpack, commonjs, requiresjs, etc.) are all handled well. 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.

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 shortcomings 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 because clac1.js is not loaded first, 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>

This will always output the correct result.

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.

Summary

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 synchronously. Webpack actually merges multiple js files into one, and then inserts a script reference into the body.

If there are multiple js files, it is recommended to load them asynchronously to avoid blocking the interface rendering and shorten the overall loading time. This article introduces two methods, script element and Ajax, and also provides examples for the loading sequence of files with dependencies.

The above is the detailed content of Explanation of methods to implement synchronization 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