湉湉幂幂 發表於 2020-8-7 16:13:00

JavaScript 模块封装

<h1 class="md-end-block md-heading"><span class="md-plain">前言介绍</span></h1>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">在最早的时候<span class="md-pair-s"><code>JavaScript</code><span class="md-plain">这门语言其实是并没有模块这一概念,但是随着时间的推移与技术的发展将一些复用性较强的代码封装成模块变成了必要的趋势。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">在这篇文章中主要介绍原生的 <span class="md-pair-s"><code>JavaScript</code><span class="md-plain">封装的几种手段以及新增的 <span class="md-pair-s"><code>ES6 Module</code><span class="md-plain">的语法,来实现模块封装。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">并且会简单的使用<span class="md-pair-s"><code>Webpack</code><span class="md-plain">让<span class="md-pair-s"><code>Es6</code><span class="md-plain">代码向后兼容。</span></span></span></span></span></span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">引入问题</span></h1>
<p class="md-end-block md-p md-focus"><span class="md-tab">   <span class="md-plain">以下有两个<span class="md-pair-s"><code>Js</code><span class="md-plain">文件,如果不采取任何封装手段直接导入会导致<span class="md-pair-s"><code>window</code><span class="md-plain">环境污染。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">并且,如果文件中有相同名字的变量或函数会发生命名冲突,因为它们都是放在全局作用域<span class="md-pair-s"><code>window</code><span class="md-plain">对象中的。</span></span></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script src="./js_m1.js"&gt;&lt;/script&gt;
&lt;script src="./js_m2.js"&gt;&lt;/script&gt;
&lt;script&gt;"use strict"<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这是由于js_m2后引入,所以js_m1的同名变量以及函数都被覆盖掉了。</span>
<span style="color: rgba(0, 0, 0, 1)">
    console.log(module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2</span>
<span style="color: rgba(0, 0, 0, 1)">
    show();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2.show</span>
&lt;/script&gt;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> module_name = "js_m1"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> show(){
      console.log(</span>"js_m1.show"<span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> module_name = "js_m2"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> show(){
      console.log(</span>"js_m2.show"<span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160218927-349382145.png"><img src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160218927-349382145.png" alt="image-20200807115438551"></span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">简单解决</span></h1>
<h2 class="md-end-block md-heading"><span class="md-plain">IIFE封装</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">针对上述问题,采取函数的闭包及作用域特性我们为每个模块封装一个作用域。</span></span></p>
<blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">第一步:进行自执行函数包裹代码封装出局部作用域</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">第二步:向外部暴露接口,为<span class="md-pair-s"><code>window</code><span class="md-plain">对象添加新的对象</span></span></span></span></p>
</blockquote>
<div class="cnblogs_code">
<pre>&lt;script src="./js_m1.js"&gt;&lt;/script&gt;
&lt;script src="./js_m2.js"&gt;&lt;/script&gt;
&lt;script&gt;"use strict"<span style="color: rgba(0, 0, 0, 1)">;

    console.log(js_m1.module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1</span>
<span style="color: rgba(0, 0, 0, 1)">
    js_m1.show();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1.show</span>
<span style="color: rgba(0, 0, 0, 1)">
    console.log(js_m2.module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2</span>
<span style="color: rgba(0, 0, 0, 1)">
    js_m2.show();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2.show</span>
&lt;/script&gt;</pre>
</div>
<div class="cnblogs_code">
<pre>(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {

      </span><span style="color: rgba(0, 0, 255, 1)">var</span> module_name = "js_m1"<span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> show() {
                console.log(</span>"js_m1.show"<span style="color: rgba(0, 0, 0, 1)">);
      }

      window.js_m1 </span>=<span style="color: rgba(0, 0, 0, 1)"> { module_name: module_name, show: show };
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在es6中,可简写为 { module_name , show }</span>
}())</pre>
</div>
<div class="cnblogs_code">
<pre>(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {

      </span><span style="color: rgba(0, 0, 255, 1)">var</span> module_name = "js_m2"<span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> show() {
                console.log(</span>"js_m2.show"<span style="color: rgba(0, 0, 0, 1)">);
      }

      window.js_m2 </span>=<span style="color: rgba(0, 0, 0, 1)"> { module_name: module_name, show: show };
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在es6中,可简写为 { module_name , show }</span>
}())</pre>
</div>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160218534-1906327129.png"><img src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160218534-1906327129.png" alt="image-20200807120606342"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">Es6块级封装</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">在<span class="md-pair-s"><code>Es6</code><span class="md-plain">之前,由于没有出现块级作用域的概念,那时候大家都使用上面的方式进行封装。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">在当<span class="md-pair-s"><code>Es6</code><span class="md-plain">的块级作用域出现之后,又诞生出了新的封装方式即块级作用域封装。</span></span></span></span></p>
<blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">和<span class="md-pair-s"><code>IIFE</code><span class="md-plain">封装相同,都是利用作用域的特性进行封装。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">注意一点,块级作用域只对<span class="md-pair-s"><code>let</code><span class="md-plain">或<span class="md-pair-s"><code>const</code><span class="md-plain">声明有效。</span></span></span></span></span></span></p>
</blockquote>
<div class="cnblogs_code">
<pre>&lt;script src="./js_m1.js"&gt;&lt;/script&gt;
&lt;script src="./js_m2.js"&gt;&lt;/script&gt;
&lt;script&gt;"use strict"<span style="color: rgba(0, 0, 0, 1)">;

    console.log(js_m1.module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1</span>
<span style="color: rgba(0, 0, 0, 1)">
    js_m1.show();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1.show</span>
<span style="color: rgba(0, 0, 0, 1)">
    console.log(js_m2.module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2</span>
<span style="color: rgba(0, 0, 0, 1)">
    js_m2.show();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2.show</span>
&lt;/script&gt;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
      let module_name </span>= "js_m1"<span style="color: rgba(0, 0, 0, 1)">;

      let show </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
                console.log(</span>"js_m1.show"<span style="color: rgba(0, 0, 0, 1)">);
      }

      window.js_m1 </span>=<span style="color: rgba(0, 0, 0, 1)"> { module_name, show };

}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
      let module_name </span>= "js_m2"<span style="color: rgba(0, 0, 0, 1)">;

      let show </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
                console.log(</span>"js_m2.show"<span style="color: rgba(0, 0, 0, 1)">);
      }

      window.js_m2 </span>=<span style="color: rgba(0, 0, 0, 1)"> { module_name, show };

}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160218114-262657353.png"><img src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160218114-262657353.png" alt="image-20200807121327601"></span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">Es6 module 语法</span></h1>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">上面的两种方式虽然都能达到模块封装的效果,但是我们依然有更好的选择。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面将介绍极力推荐的<span class="md-pair-s"><code>Es6 module</code><span class="md-plain">语法进行导入。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">学习<span class="md-pair-s"><code>Es6 module</code><span class="md-plain">从以下三个方面来入手:</span></span></span></span></p>
<blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">1.模块标签及其特性</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">2.导出</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">3.导入</span></span></p>
</blockquote>
<h1 class="md-end-block md-heading"><span class="md-plain">模块标签</span></h1>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">要想使用<span class="md-pair-s"><code>Es6 module</code><span class="md-plain">语法导入模块,必须使用模块标签来引入<span class="md-pair-s"><code>Js</code><span class="md-plain">文件。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">模块标签与普通的<span class="md-pair-s"><code>&lt;script&gt;</code><span class="md-plain">标签具有一些不太一样的地方,下面会从各个方面逐一进行介绍。</span></span></span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">声明标签</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">将<span class="md-pair-s"><code>&lt;script&gt;</code><span class="md-plain">标签添加上<span class="md-pair-s"><code>type="module"</code><span class="md-plain">的属性。</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;&lt;/script&gt;</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">导入路径</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">在浏览器中引用模块必须添加路径如<span class="md-pair-s"><code>./</code><span class="md-plain"> ,但在打包工具如<span class="md-pair-s"><code>webpack</code><span class="md-plain">中则不需要,因为他们有自己的存放方式。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">总而言之,即使是在当前目录也要添加上<span class="md-pair-s"><code>./</code><span class="md-plain">,不可以进行省略。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">这也是推荐的一种引入文件方式,不管是何种语言中都推荐引入文件时不进行路径省略。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-pair-s "><strong>正确的导入路径</strong></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module" src="./js_m1.js"&gt;&lt;/script&gt;
&lt;script type="module" src="./js_m2.js"&gt;&lt;/script&gt;</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-pair-s "><strong>错误的导入路径</strong></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module" src="js_m1.js"&gt;&lt;/script&gt;// 不可省略!<span style="color: rgba(0, 0, 0, 1)">省略就会抛出异常
</span>&lt;script type="module" src="js_m2.js"&gt;&lt;/script&gt;</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">延迟解析</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">所谓延迟解析是指在模块标签中的代码会提到<span class="md-pair-s"><code>HTML</code><span class="md-plain">代码以及嵌入式的<span class="md-pair-s"><code>&lt;script&gt;</code><span class="md-plain">标签后才进行执行。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">注意看下面的示例,编码时模块标签在普通的<span class="md-pair-s"><code>&lt;script&gt;</code><span class="md-plain">之上,但是结果却相反。</span></span></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    console.log(</span>"&lt;script type='module'&gt; code run..."<span style="color: rgba(0, 0, 0, 1)">);

</span>&lt;/script&gt;

&lt;script&gt;

    "use strict"<span style="color: rgba(0, 0, 0, 1)">;

    console.log(</span>"&lt;script&gt; code run..."<span style="color: rgba(0, 0, 0, 1)">);

</span>&lt;/script&gt;</pre>
</div>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160217400-1628674175.png"><img src="https://img2020.cnblogs.com/blog/1881426/202008/1881426-20200807160217400-1628674175.png" alt="image-20200807123803291"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">严格模式</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">模块标签中的所有代码都是按严格模式运行的,请注意变量名的声明以及<span class="md-pair-s"><code>this</code><span class="md-plain">指向问题,同时还有解构赋值等等。</span></span></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    username </span>= "云崖";<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 抛出异常,未声明</span>

&lt;/script&gt;</pre>
</div>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    let obj </span>=<span style="color: rgba(0, 0, 0, 1)"> {
      show() {
            console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> {show: ƒ}</span>
            (<span style="color: rgba(0, 0, 255, 1)">function</span> () { console.log(<span style="color: rgba(0, 0, 255, 1)">this</span>); }())<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> undefined 严格模式下为undefined ,普通模式下为window对象</span>
<span style="color: rgba(0, 0, 0, 1)">      }
    };

    obj.show();

</span>&lt;/script&gt;</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">作用域</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">每个模块标签中的代码都会为其创建一个专属的作用域,禁止相互之间进行访问。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">而普通的<span class="md-pair-s"><code>&lt;script&gt;</code><span class="md-plain">标签中的代码全部在全局作用域下执行。</span></span></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">

    let m1 </span>= "m1..."<span style="color: rgba(0, 0, 0, 1)">;

</span>&lt;/script&gt;

&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">

    console.log(m1);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> m1...</span>

&lt;/script&gt;</pre>
</div>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    let m1 </span>= "m1..."<span style="color: rgba(0, 0, 0, 1)">;

</span>&lt;/script&gt;

&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    console.log(m1);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Uncaught ReferenceError: m1 is not defined</span>

&lt;/script&gt;</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">预解析</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">模块在导入时只执行一次解析,之后的导入不会再执行模块代码,而使用第一次解析结果,并共享数据。</span></span></p>
<blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">可以在首次导入时完成一些初始化工作</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">如果模块内有后台请求,也只执行一次即可</span></span></p>
</blockquote>
<div class="cnblogs_code">
<pre>&lt;script type="module" src="./js_m3.js"&gt;&lt;/script&gt;
&lt;script type="module" src="./js_m3.js"&gt;&lt;/script&gt;
&lt;script type="module" src="./js_m3.js"&gt;&lt;/script&gt;

&lt;!-- 导入多次,也只执行一次代码--&gt;
&lt;!-- 打印结果如下:import m3... --&gt;

&lt;!--<span style="color: rgba(0, 0, 0, 1)"> js_m3内容如下:

    console.log(</span>"import m3..."<span style="color: rgba(0, 0, 0, 1)">);

</span>--&gt;</pre>
</div>
<h1 class="md-end-block md-heading"><span class="md-plain">导出模块</span></h1>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-pair-s"><code>ES6</code><span class="md-plain">使用基于文件的模块,即一个文件一个模块。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">可以使用<span class="md-pair-s"><code>export</code><span class="md-plain">来将模块中的接口进行导出,导出方式分为以下几种:</span></span></span></span></p>
<blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">1.单个导出</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">2.默认导出</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">3.多个导出</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">4.混合导出</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">5.别名导出</span></span></p>
</blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">另外,<span class="md-pair-s"><code>ES6</code><span class="md-plain">的导出是是以引用方式导出,无论是标量还是对象,即模块内部变量发生变化将影响已经导入的变量。</span></span></span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">单个导出</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面将使用<span class="md-pair-s"><code>export</code><span class="md-plain">来将模块中的接口进行单个单个的导出。</span></span></span></span></p>
<div class="cnblogs_code">
<pre>export let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

export </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test(){
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

export class User{
      constructor(username){
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show(){
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}</span></pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">默认导出</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">一个模块中,只能默认导出一个接口。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">如果默认导出的是一个类,那么该类就可以不用起类名,此外函数同理。</span></span></p>
<div class="cnblogs_code">
<pre>export let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

export </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test(){
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> class{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认导出</span>
<span style="color: rgba(0, 0, 0, 1)">      constructor(username){
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show(){
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}</span></pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">多个导出</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">可以使用<span class="md-pair-s"><code>exprot</code><span class="md-plain">与<span class="md-pair-s"><code>{}</code><span class="md-plain">的形式进行接口的批量多个导出。</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

class User {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name, test, User };</span></pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">混合导出</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用<span class="md-pair-s"><code>export default</code><span class="md-plain"> 导出默认接口,使用 <span class="md-pair-s"><code>export {}</code><span class="md-plain"> 批量导入普通接口</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name, test };</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">同时也可以使用<span class="md-pair-s"><code>as</code><span class="md-plain">来为一个导出的接口取别名,如果该接口别名为<span class="md-pair-s"><code>default</code><span class="md-plain">则将该接口当做默认导出。</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

class User {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name, test, User as </span><span style="color: rgba(0, 0, 255, 1)">default</span> };</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">别名导出</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用<span class="md-pair-s"><code>as</code><span class="md-plain">来为导出的<span class="md-pair-s"><code>export {}</code><span class="md-plain">中的导出接口起一个别名,当导入时也应该使用导出接口的别名进行接收。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">当一个接口的别名为<span class="md-pair-s"><code>default</code><span class="md-plain">时,该接口将当做默认导出。</span></span></span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

class User {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name as m_name, test as m_tst, User as </span><span style="color: rgba(0, 0, 255, 1)">default</span> };</pre>
</div>
<h1 class="md-end-block md-heading"><span class="md-plain">导入模块</span></h1>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用<span class="md-pair-s"><code>import</code><span class="md-plain">与<span class="md-pair-s"><code>from</code><span class="md-plain">进行静态的模块的导入,注意导入时必须将导入语句放在顶层。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">模块的导入分为以下几部分:</span></span></p>
<blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">1.具名导入</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">2.批量导入</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">3.默认导入</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">4.混合导入</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">5.别名导入</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">6.动态导入</span></span></p>
</blockquote>
<h2 class="md-end-block md-heading"><span class="md-plain">具名导入</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">具名导入应该注意与导出的接口名一致。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面是模块导出的代码:</span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

class User {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name, test, User };</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用具名导入:</span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    import { module_name, test, User} from </span>"./js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

    console.log(module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m3.js</span>
<span style="color: rgba(0, 0, 0, 1)">
    test(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 测试功能</span>
<span style="color: rgba(0, 0, 0, 1)">
    let u1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> User("云崖"<span style="color: rgba(0, 0, 0, 1)">);

    u1.show(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云崖</span>

&lt;/script&gt;</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">批量导入</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">如果导入的内容过多,可使用<span class="md-pair-s"><code>*</code><span class="md-plain">进行批量导入,注意批量导入后应该使用<span class="md-pair-s"><code>as</code><span class="md-plain">来取一个别名方便调用。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面是模块导出的代码:</span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

class User {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name, test, User };</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用批量导入:</span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    import </span>* as m3 from "./js_m3.js";   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 别名为m3,下面使用都要以m3开头</span>
<span style="color: rgba(0, 0, 0, 1)">
    console.log(m3.module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m3.js</span>
<span style="color: rgba(0, 0, 0, 1)">
    m3.test(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 测试功能</span>
<span style="color: rgba(0, 0, 0, 1)">
    let u1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> m3.User("云崖"<span style="color: rgba(0, 0, 0, 1)">);

    u1.show(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云崖</span>

&lt;/script&gt;</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">默认导入</span></h2>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用默认导入时不需要用<span class="md-pair-s"><code>{}</code><span class="md-plain">进行接收,并且可以使用任意名字来接收默认导出的接口。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面是模块导出的代码:</span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

class User {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name, test, User as </span><span style="color: rgba(0, 0, 255, 1)">default</span> };</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用默认导入,我们只导入默认导出的接口,可以随便取一个名字。</span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    import m3U from </span>"./js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

    let u1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> m3U("云崖"<span style="color: rgba(0, 0, 0, 1)">);

    u1.show(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云崖</span>

&lt;/script&gt;</pre>
</div>
<h3 class="md-end-block md-heading"><span class="md-plain">混合导入</span></h3>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">当一个模块中导出的又有默认导出的接口,又有其他的导出接口时,我们可以使用混合导入。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用<span class="md-pair-s"><code>{}</code><span class="md-plain">来接收其他的导出接口,对于默认导出的接口而言只需要取一个名字即可。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面是模块导出的代码:</span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}

class User {
      constructor(username) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
      }

      show() {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username);
      }
}

export { module_name, test, User as </span><span style="color: rgba(0, 0, 255, 1)">default</span> };</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用混合导入:</span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    import m3U, { module_name, test } from </span>"./js_m3.js"<span style="color: rgba(0, 0, 0, 1)">;

    console.log(module_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m3.js</span>
<span style="color: rgba(0, 0, 0, 1)">
    test();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 测试功能</span>
<span style="color: rgba(0, 0, 0, 1)">
    let u1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> m3U("云崖"<span style="color: rgba(0, 0, 0, 1)">);

    u1.show(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云崖</span>

&lt;/script&gt;</pre>
</div>
<h3 class="md-end-block md-heading"><span class="md-plain">别名导入</span></h3>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">为了防止多个模块下接口名相同,我们可以使用<span class="md-pair-s"><code>as</code><span class="md-plain">别名导入,再使用时也应该按照别名进行使用。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面是<span class="md-pair-s"><code>m1</code><span class="md-plain">模块导出的代码:</span></span></span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m1"<span style="color: rgba(0, 0, 0, 1)">;

let show </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
      console.log(</span>"js_m1.show"<span style="color: rgba(0, 0, 0, 1)">);
}

export { module_name, show };</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面是<span class="md-pair-s"><code>m2</code><span class="md-plain">模块导出的代码:</span></span></span></span></p>
<div class="cnblogs_code">
<pre>let module_name = "js_m2"<span style="color: rgba(0, 0, 0, 1)">;

let show </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
      console.log(</span>"js_m2.show"<span style="color: rgba(0, 0, 0, 1)">);
}

export { module_name, show };</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">下面是使用别名导入这两个模块的接口并进行使用:</span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    import { module_name as m1_name, show as m1_show } from </span>"./js_m1.js"<span style="color: rgba(0, 0, 0, 1)">;
    import { module_name as m2_name, show as m2_show } from </span>"./js_m2.js"<span style="color: rgba(0, 0, 0, 1)">;

    console.log(m1_name);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1</span>
    console.log(m2_name);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2</span>
<span style="color: rgba(0, 0, 0, 1)">
    m1_show();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1.show</span>
    m2_show();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2.show</span>

&lt;/script&gt;</pre>
</div>
<h3 class="md-end-block md-heading"><span class="md-plain">动态导入</span></h3>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">使用<span class="md-pair-s"><code>import</code><span class="md-plain">与<span class="md-pair-s"><code>from</code><span class="md-plain">的导入方式属于静态导入,必须将导入语句放在最顶层,如果不是则抛出异常。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">这是模块中的导出接口:</span></span></p>
<div class="cnblogs_code">
<pre>export <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test() {
      console.log(</span>"测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">如果我们想在某种特定条件下才导入并调用改接口,使用<span class="md-pair-s"><code>import</code><span class="md-plain">与<span class="md-pair-s"><code>from</code><span class="md-plain">的方式会抛出异常。</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;

    <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) {

      import { test } from </span>"./js_m3.js"; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Error</span>
<span style="color: rgba(0, 0, 0, 1)">
      test();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 想在特定条件下执行模块中的测试功能</span>
<span style="color: rgba(0, 0, 0, 1)">    }

</span>&lt;/script&gt;</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">这个时候就需要用到动态导入,使用 <span class="md-pair-s"><code>import()</code><span class="md-plain"> 函数可以动态导入,实现按需加载,它返回一个 <span class="md-pair-s"><code>promise</code><span class="md-plain"> 对象。</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;

    <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) {

      let m3 </span>= import("./js_m3.js"<span style="color: rgba(0, 0, 0, 1)">);

      m3.then((module)</span>=&gt; module.test()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 测试功能</span>
<span style="color: rgba(0, 0, 0, 1)">
    }

</span>&lt;/script&gt;</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">我们可以使用解构语法来将模块中的接口一个一个全部拿出来。</span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;

    <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) {

      let m3 </span>= import("./js_m3.js"<span style="color: rgba(0, 0, 0, 1)">);

      m3.then(({ test, }) </span>=&gt; test()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拿出test接口</span>
<span style="color: rgba(0, 0, 0, 1)">
    }

</span>&lt;/script&gt;</pre>
</div>
<h1 class="md-end-block md-heading"><span class="md-plain">合并使用</span></h1>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">如果有多个模块都需要被使用,我们可以先定义一个<span class="md-pair-s"><code>Js</code><span class="md-plain">文件将这些需要用到的模块中的接口做一个合并,然后再将该文件导出即可。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">合并导出请将<span class="md-pair-s"><code>export</code><span class="md-plain">与<span class="md-pair-s"><code>from</code><span class="md-plain">结合使用。</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1</span>
<span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> class{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认导出</span>
<span style="color: rgba(0, 0, 0, 1)">      static register(){
                console.log(</span>"注册功能"<span style="color: rgba(0, 0, 0, 1)">);
      }
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m2</span>
<span style="color: rgba(0, 0, 0, 1)">
export class Login{
      static login(){
                console.log(</span>"登录功能"<span style="color: rgba(0, 0, 0, 1)">);
      }
}

export </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> test(){
      console.log(</span>"js_m2测试功能"<span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.js</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 合并导出</span>
<span style="color: rgba(0, 0, 0, 1)">
import js_m1 from </span>"./js_m1.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> js_m1中有接口是默认导出,因此我们需要不同的导出方式 , 注意这里就导出了一个接口,即js_m1的注册类</span>
export {<span style="color: rgba(0, 0, 255, 1)">default</span> as js_m1_register} from "./js_m1.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导出js_m2中的接口,共导出两个接口。登录类和测试函数。</span>
export * as js_m2 from "./js_m2.js";</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">导入与使用:</span></span></p>
<div class="cnblogs_code">
<pre>&lt;script type="module"&gt;<span style="color: rgba(0, 0, 0, 1)">

    import </span>* as index from "./index.js"<span style="color: rgba(0, 0, 0, 1)">;

    index.js_m1_register.register();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 注册功能</span>
<span style="color: rgba(0, 0, 0, 1)">
    index.js_m2.Login.login();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 登录功能</span>
<span style="color: rgba(0, 0, 0, 1)">
    index.js_m2.test();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">js_m2测试功能</span>

&lt;/script&gt;</pre>
</div>
<h1 class="md-end-block md-heading"><span class="md-plain">指令总结</span></h1>
<table class="md-table">
<thead>
<tr class="md-end-block"><th><span class="td-span"><span class="md-plain">表达式</span></span></th><th><span class="td-span"><span class="md-plain">说明</span></span></th></tr>
</thead>
<tbody>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">export function show(){}</span></span></td>
<td><span class="td-span"><span class="md-plain">导出函数</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">export const name="Yunya"</span></span></td>
<td><span class="td-span"><span class="md-plain">导出变量</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">export class User{}</span></span></td>
<td><span class="td-span"><span class="md-plain">导出类</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">export default show</span></span></td>
<td><span class="td-span"><span class="md-plain">默认导出</span></span></td>
</tr>
<tr class="md-end-block">
<td>
<p><span class="td-span"><span class="md-plain">const name = "Yunya" </span></span></p>
<p><span class="td-span"><span class="md-plain">export {name}</span></span></p>
</td>
<td><span class="td-span"><span class="md-plain">导出已经存在变量</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">export {name as m1_name}</span></span></td>
<td><span class="td-span"><span class="md-plain">别名导出</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">import m1_default from './m1_js.js'</span></span></td>
<td><span class="td-span"><span class="md-plain">导入默认导出</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">import {name,show} from '/m1_js.js'</span></span></td>
<td><span class="td-span"><span class="md-plain">导入命名导出</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">Import {name as m1_name,show} from 'm1_js.js'</span></span></td>
<td><span class="td-span"><span class="md-plain">别名导入</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">Import * as m1 from '/m1_js.js'</span></span></td>
<td><span class="td-span"><span class="md-plain">导入全部接口</span></span></td>
</tr>
</tbody>
</table>
<h1 class="md-end-block md-heading"><span class="md-plain">编译打包</span></h1>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">由于<span class="md-pair-s"><code>module</code><span class="md-plain">语法是<span class="md-pair-s"><code>Es6</code><span class="md-plain">推出的,所以对老旧的浏览器兼容不太友好,这个时候就需要用到打包工具进行打包处理使其能让老旧的浏览器上进行兼容。</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">首先登录 <span class="md-pair-s"><code>https://nodejs.org/en/</code><span class="md-plain"> 官网下载安装<span class="md-pair-s"><code>Node.js</code><span class="md-plain">,我们将使用其他的<span class="md-pair-s"><code>npm</code><span class="md-plain">命令,<span class="md-pair-s"><code>npm</code><span class="md-plain">用来安装第三方类库。</span></span></span></span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">在命令行输入 <span class="md-pair-s"><code>node -v</code><span class="md-plain"> 显示版本信息表示安装成功。</span></span></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">安装配置</span></h3>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-pair-s"><code>cd</code><span class="md-plain">到你的项目路径,并使用以下命令生成配置文件 <span class="md-pair-s"><code>package.json</code></span></span></span></span></p>
<div class="cnblogs_code">
<pre>npm init -y</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">修改<span class="md-pair-s"><code>package.json</code><span class="md-plain">添加打包命令</span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">...
</span>"main": "index.js"<span style="color: rgba(0, 0, 0, 1)">,
</span>"scripts"<span style="color: rgba(0, 0, 0, 1)">: {
    </span>"dev": "webpack --mode development --watch"<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加这一句</span>
<span style="color: rgba(0, 0, 0, 1)">},
...</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">安装<span class="md-pair-s"><code>webpack</code><span class="md-plain">工具包,如果安装慢可以使用淘宝 <span class="md-meta-i-cmd-link"><span class="md-plain">cnpm</span><span class="md-plain"> 命令</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>npm i webpack webpack-cli --save-dev</pre>
</div>
<h3 class="md-end-block md-heading"><span class="md-plain">目录结构</span></h3>
<blockquote>
<p class="md-end-block md-p"><span class="md-plain">index.html</span></p>
<p class="md-end-block md-p"><span class="md-plain"><span class="md-softbreak"><span class="md-plain">--dist #压缩打包后的文件</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain"><span class="md-softbreak"><span class="md-plain"><span class="md-softbreak"><span class="md-plain">--src</span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain"><span class="md-softbreak"><span class="md-plain"><span class="md-softbreak"><span class="md-plain"><span class="md-softbreak"><span class="md-plain">----index.js #合并入口</span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain"><span class="md-softbreak"><span class="md-plain"><span class="md-softbreak"><span class="md-plain"><span class="md-softbreak"><span class="md-plain"><span class="md-softbreak"><span class="md-plain">----style.js //模块</span></span></span></span></span></span></span></span></span></p>
</blockquote>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">index.html内容如下</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="en"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="UTF-8"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="viewport"</span><span style="color: rgba(255, 0, 0, 1)"> content</span><span style="color: rgba(0, 0, 255, 1)">="width=device-width, initial-scale=1.0"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">http-equiv</span><span style="color: rgba(0, 0, 255, 1)">="X-UA-Compatible"</span><span style="color: rgba(255, 0, 0, 1)"> content</span><span style="color: rgba(0, 0, 255, 1)">="ie=edge"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>Document<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="dist/main.js"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">index.js内容如下</span></span></p>
<div class="cnblogs_code">
<pre>import style from "./style"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">new</span> style().init();</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">style.js</span></span></p>
<div class="cnblogs_code">
<pre>export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class User {
constructor() {}
init() {
    document.body.style.backgroundColor </span>= "green"<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<h3 class="md-end-block md-heading"><span class="md-plain">执行打包</span></h3>
<p class="md-end-block md-p"><span class="md-tab">   <span class="md-plain">运行以下命令将生成打包文件到 <span class="md-pair-s"><code>dist</code><span class="md-plain">目录,因为在命令中添加了 <span class="md-pair-s"><code>--watch</code><span class="md-plain">参数,所以源文件编辑后自动生成打包文件。</span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>npm run dev</pre>
</div><br><br>
来源:https://www.cnblogs.com/Yunya-Cnblogs/p/13453519.html
頁: [1]
查看完整版本: JavaScript 模块封装