Оригинальный адрес:What are CJS, AMD, UMD, and ESM in Javascript?
Оригинальный автор:Igor Irianto
Переводчик:Gopal
Поскольку этот вопрос часто задают в интервью, добавляется ярлык [Говорит интервью].
исходный,Javascript
Нет возможности импортировать/экспортировать модули, что является головной болью. Представьте, что вы пишете приложение всего одним файлом — это кошмар!
Тогда многие люди намного умнее меня пытались датьJavascript
Добавьте модульности. Среди нихCJS
,AMD
,UMD
а такжеESM
. Возможно, вы слышали о некоторых из этих методов (есть и другие, но они более общие).
Я представлю их: их синтаксис, назначение и базовое поведение. Моя цель — помочь читателям узнать их, когда они их увидят.
CJS
CJS
даCommonJS
аббревиатура от. Часто мы используем это:
// importing
const doSomething = require('./doSomething.js');
// exporting
module.exports = function doSomething(n) {
// do something
}
- Многие люди могут получить от
Node
сразу узналCJS
синтаксис. Это потому чтоNode
это использоватьCJS
модульиз -
CJS
модуль синхронного импорта - ты можешь начать
node_modules
Импортируйте библиотеку из или импортируйте файл из локального каталога. Такие какconst myLocalModule = require('./some/local/file.js')
илиvar React = require('react');
, оба могут работать - когда
CJS
При импорте он даст вам копию импортированного объекта -
CJS
Не работает в браузере. это должно быть преобразовано и упаковано
AMD
AMD
Представляет определение асинхронного модуля. Ниже приведен пример кода
define(['dep1', 'dep2'], function (dep1, dep2) {
//Define the module value by returning a value.
return function () {};
});
или
// "simplified CommonJS wrapping" https://requirejs.org/docs/whyamd.html
define(function (require) {
var dep1 = require('dep1'),
dep2 = require('dep2');
return function () {};
});
-
AMD
асинхронный (asynchronously
) импорт модуля (отсюда и название) - При первом предложении,
AMD
сделан для передней части (в то время какCJS
это бэкенд) -
AMD
синтаксис не так хорош, какCJS
Интуитивно понятный. я думаюAMD
а такжеCJS
полностью противоположный
UMD
UMD
означает общее определение модуля (Universal Module Definition
). Вот как это может выглядеть(источник)
(function (root, factory) {
if (typeof define === "function" && define.amd) {
define(["jquery", "underscore"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"), require("underscore"));
} else {
root.Requester = factory(root.$, root._);
}
}(this, function ($, _) {
// this is where I defined my module implementation
var Requester = { // ... };
return Requester;
}));
- Работает как на фронтенде, так и на бэкенде (отсюда и название «универсальный»)
- а также
CJS
илиAMD
不同,UMD
Больше похоже на шаблон для настройки многомодульных систем.здесьМожно найти больше шаблонов - когда используешь
Rollup/Webpack
упаковщики, такие какUMD
Обычно используется как запасной модуль
ESM
ESM
представлятьES
модуль. ЭтоJavascript
Предложена схема реализации стандартной модульной системы. Я уверен, что многие из вас видели это:
import React from 'react';
или больше
import {foo, bar} from './myLib';
...
export default function() {
// your Function
};
export const function1() {...};
export const function2() {...};
- во многихсовременный браузерможно использовать
- Он имеет преимущества двух аспектов: с
CJS
простой синтаксис иAMD
асинхронный - выгода от
ES6
изстатическая модульная структура, можно продолжить Tree Shaking -
ESM
разрешить что-то вродеRollup
такой упаковщик,удалить ненужный код, сокращение пакетов кода для более быстрой загрузки - допустимый
HTML
вызов, пока следующее
<script type="module">
import {func1} from 'my-lib';
func1();
</script>
Но не все браузеры поддерживают (источник)
Суммировать
- из-за
ESM
Имеет простой синтаксис, асинхронные функции и древовидную структуру, поэтому это лучшее модульное решение. -
UMD
встречается повсеместно, обычно вESM
Используйте в качестве резервной копии, если это не работает -
CJS
является синхронным, подходит для бэкенда -
AMD
асинхронный, подходит для фронтенда
Спасибо за прочтение, разработчики! В будущем я планирую подробно обсудить каждый модуль, особенно ESM, так как он содержит много отличных вещей. Пожалуйста, не переключайтесь!
Пожалуйста, дайте мне знать, если вы заметили какие-либо ошибки.