typescript中的esModuleInterop选项
<p>当没有加esModuleInterop时</p><p>库的代码:</p>
<div class="cnblogs_code">
<pre>export const a = 1<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, 255, 1)">function</span> b() {}</pre>
</div>
<p>生成代码</p>
<div class="cnblogs_code">
<pre>exports.__esModule = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
exports.a </span>= 1<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)"> b() { }
exports[</span>"default"] = b;</pre>
</div>
<p> </p>
<p>使用库的代码:</p>
<div class="cnblogs_code">
<pre>import * as lib from './export'<span style="color: rgba(0, 0, 0, 1)">;
console.log(lib);</span></pre>
</div>
<p>生成代码</p>
<div class="cnblogs_code">
<pre>exports.__esModule = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> lib = require("./export"<span style="color: rgba(0, 0, 0, 1)">);
console.log(lib);</span></pre>
</div>
<div class="cnblogs_code">
<pre>import lib from './export'<span style="color: rgba(0, 0, 0, 1)">;
console.log(lib);</span></pre>
</div>
<p>生成代码</p>
<div class="cnblogs_code">
<pre>exports.__esModule = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> export_1 = require("./export"<span style="color: rgba(0, 0, 0, 1)">);
console.log(export_1[</span>"default"]);</pre>
</div>
<pre>以上代码使用ts生成代码都是可以的。<br><br>但是如果我们使用的库是第三方的,比如fs。我们的代码如下</pre>
<div class="cnblogs_code">
<pre>import fs from 'fs'<span style="color: rgba(0, 0, 0, 1)">;
console.log(fs);</span></pre>
</div>
<p>生成代码</p>
<div class="cnblogs_code">
<pre>exports.__esModule = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> fs_1 = require("fs"<span style="color: rgba(0, 0, 0, 1)">);
console.log(fs_1[</span>"default"]);</pre>
</div>
<p>fs是没有default属性的,所以这种使用fs的方法是不对的。</p>
<p>所以,不加esModuleInterop时,正确引用fs的方法是下面这样:</p>
<div class="cnblogs_code">
<pre>import * as fs from 'fs'<span style="color: rgba(0, 0, 0, 1)">;
console.log(fs);
</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 {fsync} from </span>'fs'<span style="color: rgba(0, 0, 0, 1)">;
console.log(fsync);</span></pre>
</div>
<p> </p>
<p>加上esModuleInterop,代码</p>
<div class="cnblogs_code">
<pre>import * as lib from './export'<span style="color: rgba(0, 0, 0, 1)">;
console.log(lib);</span></pre>
</div>
<p>编译为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> __importStar = (<span style="color: rgba(0, 0, 255, 1)">this</span> && <span style="color: rgba(0, 0, 255, 1)">this</span>.__importStar) || <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (mod) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (mod && mod.__esModule) <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mod;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> result =<span style="color: rgba(0, 0, 0, 1)"> {};
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (mod != <span style="color: rgba(0, 0, 255, 1)">null</span>) <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> k <span style="color: rgba(0, 0, 255, 1)">in</span> mod) <span style="color: rgba(0, 0, 255, 1)">if</span> (Object.hasOwnProperty.call(mod, k)) result =<span style="color: rgba(0, 0, 0, 1)"> mod;
result[</span>"default"] =<span style="color: rgba(0, 0, 0, 1)"> mod;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result;
};
exports.__esModule </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> lib = __importStar(require("./export"<span style="color: rgba(0, 0, 0, 1)">));
console.log(lib);</span></pre>
</div>
<p>代码</p>
<div class="cnblogs_code">
<pre>import lib from './export'<span style="color: rgba(0, 0, 0, 1)">;
console.log(lib);</span></pre>
</div>
<p>编译为</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> __importDefault = (<span style="color: rgba(0, 0, 255, 1)">this</span> && <span style="color: rgba(0, 0, 255, 1)">this</span>.__importDefault) || <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (mod) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> (mod && mod.__esModule) ? mod : { "default"<span style="color: rgba(0, 0, 0, 1)">: mod };
};
exports.__esModule </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> export_1 = __importDefault(require("./export"<span style="color: rgba(0, 0, 0, 1)">));
console.log(export_1[</span>"default"]);</pre>
</div>
<p>这时</p>
<div class="cnblogs_code">
<pre>import fs from 'fs'<span style="color: rgba(0, 0, 0, 1)">;
console.log(fs);</span></pre>
</div>
<p>就可以正常使用了。</p>
<p> </p>
<p>总结:</p>
<p>因为很多老的js库使用了commonjs的导出方式,并且没有导出default属性,而是使用module.exports=xxx直接导出,这样会导致 import fs from 'fs';的语法引入失败。</p>
<p>typescript为了兼容这些js库,于是引入了esModuleInterop,使import fs from 'fs'能正常使用。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/chen8840/p/12144202.html
頁:
[1]