ES 6学習ノート-Moduleの文法

14024 ワード

1.exportコマンド

  • 書き方一
  • export var m=1;

    functionとclassの出力
    export function f(){};
  • 書き方二
  • var m=1export {m};

    functionとclassの出力
     function f(){};
     export {f};

    比較的多くの変数がある場合は、このように書くことができます.
    var firstName = 'Michael';
    var lastName = 'Jackson';
    var year = 1958;
    export {firstName, lastName, year};
  • 書き方三
  • var n=1;
    export {n as m};

    比較的多くの変数がある場合
    function v1() { ... }
    function v2() { ... }
    
    export {
      v1 as streamV1,
      v2 as streamV2,
      v2 as streamLatestVersion
    };
  • 誤った書き方
  • // 
    export 1; 
    
    // 
    var m=1;
    export m;
    
    // 
    function f(){}
    export f;

    2.importコマンド

  • 用法
  • // main.js
    import {firstName, lastName, year} from './profile';
    
    function setName(element) {
      element.textContent = firstName + ' ' + lastName;
    }
  • 入力した変数の名前を変更するには、importコマンドでasキーを使用して、入力した変数の名前を変更します.
  • import { lastName as surname } from './profile';
  • importコマンドは、モジュール全体のヘッダに昇格し、まず実行します.
  • foo();
    import {foo} from 'my_module';
  • 同じimport文を複数回繰り返し実行すると、複数回は実行されず、1回のみ実行されます.

  • 3.モジュール全体のロード


    出力値のロードを指定するだけでなく、全体のロード、すなわちアスタリスク(*)でオブジェクトを指定し、すべての出力値をこのオブジェクトにロードすることもできます.
    import * as circle from './circle';
    
    //area() circumference() circle ,* area() circumference() 。
    
    console.log(' :' + circle.area(4));
    console.log(' :' + circle.circumference(14));

    モジュール全体がロードされているオブジェクト(前例はcircle)は、静的に分析できるはずなので、実行時の変更は許可されません.以下の書き方はすべて許されません.
    import * as circle from './circle';
    
    //  
    circle.foo = 'hello';
    circle.area = function () {};

    4.export defaultコマンド


    上記の例から分かるように、importコマンドを使用するには、ロードする変数名または関数名を知る必要があります.ユーザーがドキュメントを読まずにモジュールをロードできるようにするには、export defaultコマンドを使用します.
  • export default書き方
  • // export-default.js
    export default function foo() {
      console.log('foo');
    }
    
    //  
    
    function foo() {
      console.log('foo');
    }
    export default foo;
  • デフォルト出力を使用すると、importコマンドの後にカッコを使用する必要はありません.デフォルト出力と通常出力の比較
  • //  
    export default function crc32() {};
    //  
    import crc32 form 'crc32';
    //  
    export function crc32(){};
    //  
    import {crc32} from 'crc32'; 
  • import文にデフォルトメソッドと他の変数を同時に入力したい場合は、
  • と書きます.
    export default function (obj) {
      // ···
    }
    
    export function each(obj, iterator, context) {
      // ···
    }
    
    import _, { each } from 'lodash';
  • export defaultはクラス
  • を出力するために使用することもできる.
    // MyClass.js
    export default class {  };
    
    // main.js
    import MyClass from 'MyClass';
    let o = new MyClass();

    5.exportとimportの複合表記

  • 同じモジュールを1つのモジュールに入力して出力すると、import文はexport文と一緒に書くことができます.
  • export { foo, bar } from 'my_module';
    
    //  
    import { foo, bar } from 'my_module';
    export { foo, bar };
  • モジュールのインタフェース名
  • //  
    export { foo as myFoo } from 'my_module';
  • 全体出力
  • //  
    export * from 'my_module';
  • デフォルトインタフェース
  • export { default } from 'foo';
  • デフォルトインタフェースは、名前付きインタフェース
  • に名前を変更することもできる.
    export { es6 as default } from './someModule';
    
    //  
    import { es6 } from './someModule';
    export default es6;
  • デフォルトインタフェースは、別名インタフェース
  • に変更することもできる.
    export { default as es6 } from './someModule';

    6.モジュールの継承


    circleplusモジュールがcircleモジュールを継承していると仮定します.
    // circleplus.js
    
    export * from 'circle';
    export var e = 2.71828182846;
    export default function(x) {
      return Math.exp(x);
    }

    上のコードのexportは、circleモジュールのすべての属性と方法を再出力することを示しています.注意、exportコマンドはcircleモジュールのdefaultメソッドを無視します.次に、上記のコードは、カスタムe変数とデフォルトメソッドを出力します.
    上のモジュールをロードする書き方は次のとおりです.
    // main.js
    
    import * as math from 'circleplus';
    import exp from 'circleplus';
    console.log(exp(math.e));

    上のコードのimport expは、circleplusモジュールのデフォルトメソッドをexpメソッドにロードすることを示します.

    7.モジュール間変数


    const宣言の定数は、現在のコードブロックでのみ有効です.モジュール間定数(すなわち、複数のファイル間)を設定したり、1つの値を複数のモジュールで共有したりする場合は、次のように書くことができます.
    // constants.js  
    export const A = 1;
    export const B = 3;
    export const C = 4;
    
    // test1.js  
    import * as constants from './constants';
    console.log(constants.A); // 1
    console.log(constants.B); // 3
    
    // test2.js  
    import {A, B} from './constants';
    console.log(A); // 1
    console.log(B); // 3

    使用する定数が非常に多い場合は、専用のconstantsディレクトリを作成し、さまざまな定数を異なるファイルに書き、そのディレクトリの下に保存することができます.
    // constants/db.js
    export const db = {
      url: 'http://my.couchdbserver.local:5984',
      admin_username: 'admin',
      admin_password: 'admin password'
    };
    
    // constants/user.js
    export const users = ['root', 'admin', 'staff', 'ceo', 'chief', 'moderator'];

    その後、これらのファイルの出力定数をindexにマージする.jsの中.
    // constants/index.js
    export {db} from './db';
    export {users} from './users';

    使用するときはindexを直接ロードします.jsでいいです.
    // script.js
    import {db, users} from './constants';

    8. import()

    importコマンドは、JavaScriptエンジンによって静的に解析され、モジュール内の他のモジュールより先に実行されます(「接続」と呼ばれます.したがって、次のコードはエラーを報告します.
    //  
    if (x === 2) {
      import MyModual from './myModual';
    }

    上記のコードでは、エンジンがimport文を処理するのはコンパイル時であり、if文を分析したり実行したりしないため、import文をifコードブロックに置くのは意味がないため、実行時エラーではなく文法エラーを報告します.すなわち、importコマンドとexportコマンドは、モジュールの最上位にのみ使用でき、コードブロック(ifコードブロック、関数など)には使用できません.
    requireはランタイムロードモジュールであるため、importコマンドはrequireのダイナミックロード機能に取って代わることはできません.
    const path = './' + fileName;
    const myModual = require(path);

    上の文はダイナミックロードで、requireがどのモジュールをロードするかは、実行時にしかわかりません.import文ではできません.
    そこで,import()関数を導入し,動的ロードを完了することを提案する.