Typeescript内蔵のモジュール導入互換方式
4008 ワード
私の公開番号
はじめに
フロントエンドのモジュール化仕様は、
二、import*as
互換性を考慮して、コードを
二、esModuleInterop
このような場合に対応するために、TSは構成項
三、Tree Shaking
ついでにまた散布してください.
本論文は
Talk
に注目してください.最新の記事を取得します.はじめに
フロントエンドのモジュール化仕様は、
commonJS
、AMD
、CMD
、ES6
、およびAMD
を含む.CMD
およびcommonJS
は、過渡期の産物ともいえるが、現在は比較的一般的であるES6
およびes5
である.TSにおけるこれらの2つのモジュール化スキームの混用は、しばしばいくつかの予期せぬ問題が発生する.二、import*as
互換性を考慮して、コードを
tsconfig.json
規格にコンパイルします.{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
}
}
コードコンパイル後は最終的にcommonJS
として出力されます.React
を使う時、このような書き方はimport React from "react"
に意味不明なエラーが発生します.Module "react" has no default export
この時はコードをこのように変更するしかありません.import * as React from "react"
.その理由を追求すると、React
はcommonJS
の仕様で導出され、import React from "react"
はこのような書き方でReact
モジュールのexports.default
を探し、React
はこの属性を導出していないので、上記のようなエラーを報告した.import * as React
の書き方はmodule.exports
の中の値を取っています.このように使うと何の問題もありません.React
モジュールから導出されたコードはどのようなものかを見てみましょう....
var React = {
Children: {
map: mapChildren,
forEach: forEachChildren,
count: countChildren,
toArray: toArray,
only: onlyChild
},
createRef: createRef,
Component: Component,
PureComponent: PureComponent,
...
}
module.exports = React;
React
が導出したのはオブジェクトであり、自然にdefault
の属性もないことがわかる.二、esModuleInterop
このような場合に対応するために、TSは構成項
esModuleInterop
およびallowSyntheticDefaultImports
を提供し、加えてエラーが発生しない.{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
}
}
allowSyntheticDefaultImports
のこのフィールドの役割は、静的タイプの検査の時だけであり、import
のエラーがないと無視される.exports.default
は、本当にコンパイル中に互換コードを生成し、モジュールを正しく導入できるようにする.それとも開始コードですか?import React from "react";
現在TSコンパイル後はこうなります.var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var react_1 = __importDefault(require("react"));
コンパイラは新しいオブジェクトを生成してくれました.モジュールにesModuleInterop
属性を与えてくれます.実行時にエラーが発生しません.三、Tree Shaking
default
仕様でTSをコンパイルすれば、ES6
を追加する必要はなく、esModuleInterop
だけが必要で、静的なタイプの時報の誤チェックを防ぐ.{
"compilerOptions": {
"module": "es6",
"target": "es6",
"allowSyntheticDefaultImports": true
}
}
私たちはどんな状況でallowSyntheticDefaultImports
仕様に導き出すかを考えますか?多くの場合、ES6
のwebpack
特性を使用するために、tree shaking
のコードのみに対して有効となる.ついでにまた散布してください.
import { Button, Select } from 'element-ui'
上のコードをコンパイルした後、次のようになります.var a = require('element-ui');
var Button = a.Button;
var Select = a.Select;
ES6
は、2つのコンポーネントのみを使用しても、コンポーネントライブラリ全体を導入する.babel-plugin-component
の役割は、コードを以下のように変換することである.//
import { Button, Select } from 'element-ui'
//
import Button from 'element-ui/lib/button'
import Select from 'element-ui/lib/select'
最終的にコンパイルされたのはこのようにして、使うコンポーネントだけをロードします.var Button = require('element-ui/lib/button');
var Select = require('element-ui/lib/select');
四、まとめ本論文は
var a = require('element-ui')
を説明した. どのように異なるモジュールの標準パッケージのコードを導入しますか?babel-plugin-component
またはTypeScript
のコードを導入しても大丈夫です.commonJS
とES6
を全部配置します.