Typescript Глубокое Погружение
  • Typescript Глубокое Погружение
  • Typescript проект
    • Контекст компиляции
    • Пространство декларации
    • Модули
    • Пространства имен
    • Динамический импорт выражений
  • Typescript Система типов
    • Обзор
    • Миграция с JavaScript
    • @types
    • Декларация окружения
    • Интерфейсы
    • Перечисления
    • lib.d.ts
    • Функции
    • Подлежащий выкупу
    • Тип утверждения
    • Freshness
    • Тип защиты
    • Литеральный тип
    • readonly
    • Дженерики
    • Тип вывода
    • Тип совместимости
Powered by GitBook
On this page

Was this helpful?

  1. Typescript проект

Динамический импорт выражений

PreviousПространства именNextОбзор

Last updated 5 years ago

Was this helpful?

Динамический импорт - это новая функция ECMAScript, которая позволяет асинхронно загружать модуль в любом месте вашей программы. Комитет TC39 JavaScript имеет такое предложение на stage 4, которое называется .

Кроме того, в webpack есть функция Code splitting, которая позволяет разбить код на множество чанков(разных файлов), которые могут быть загружены асинхронно в будущем. Поэтому вы можете обеспечить минимальный размер при запуске программы и загружать другие модули асинхронно в будущем.

Естественно думать (если мы работаем с webpack в dev режиме) автоматически разбивают ваш окончательно сгенерированный код JavaScript на множество частей(чанков). Но это не кажется простым, потому что это зависит от файла конфигурации tsconfig.json, который мы используем.

Есть два способа, которыми webpack может реализовать разбиение кода: использование import() (предпочтительно, предложение ECMAScript) и require.ensure() (реализация webpack). Поэтому мы ожидаем, что выходные данные TypeScript сохранят оператор import(), а не преобразуют его в любой другой код.

Давайте рассмотрим пример. В этом примере мы продемонстрировали, как настроить webpack и TypeScript 2.4+.

В следующем примере я хочу лениво загрузить библиотеку moment, а также использовать функцию разделения кода, которая означает, что moment будет разделен на отдельный файл JavaScript, а при его использовании он будет загружен асинхронно.

import(/* webpackChunkName: "momentjs" */ 'moment')
  .then(moment => {
    // Ленивые загруженные модули имеют все типы и могут работать как обычные
    // Проверка типов будет работать, и ссылки на код также будут работать \o/
    const time = moment().format();
    console.log('TypeScript >= 2.4.0 Dynamic Import Expression:');
    console.log(time);
  })
  .catch(err => {
    console.log('Failed to load moment', err);
  });

Это настройки для tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "lib": [
      "dom",
      "es5",
      "scripthost",
      "es2015.promise"
    ],
    "jsx": "react",
    "declaration": false,
    "sourceMap": true,
    "outDir": "./dist/js",
    "strict": true,
    "moduleResolution": "node",
    "typeRoots": [
      "./node_modules/@types"
    ],
    "types": [
      "node",
      "react",
      "react-dom"
    ]
  }
}
  • Используйте параметр module: esnext: TypeScript генерирует операторы import() для разделения кода webpack.

Для получения дополнительной информации, я рекомендую прочитать эту статью:

import() proposal for JavaScript
TypeScript 2.4 dynamic import expressions
Dynamic Import Expressions and webpack 2 Code Splitting integration with TypeScript 2.4.