Home  >  Article  >  Web Front-end  >  Introduction to file synchronization and asynchronous loading methods in JavaScript

Introduction to file synchronization and asynchronous loading methods in JavaScript

黄舟
黄舟Original
2017-08-20 09:49:101496browse

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 best way to start learning. Basic way.

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 script references into the body.

The above is the detailed content of Introduction to file synchronization and asynchronous loading methods in JavaScript. 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