Модули позволяют организовать функционал в отдельные блоки, которые затем можно использовать в других приложениях.
Отличие модулей от обычных скриптов:
Для загрузки модулей применяется политика CORS. Это значит, что мы не можем просто кинуть в браузер html-страницу, которая подключает модуль. Модуль загружается с использованием протокола http/https. То есть страница html, которая загружает модуль, должна располагаться на каком-нибудь веб-сервере.
Модули всегда выполняются в режиме strict mode.
Модули по умолчанию загружаются асинхронно.
Модули загружаются и выполняются только один раз.
Модули позволяют использовать выражения await верхнего уровня без определения и вызова асинхронной функции.
Модули могут имортировать функционал из других модулей и, в свою очередь, экспортировать свою функциональность в другие модули.
Модули выполняются не в глобальном контексте, а в своей собственной области видимости. То есть переменные, константы, функции, классы и т.д., определенные внутри модуля, не доступны извне, пока они не будут явным образом экспортированы. А чтобы другой модуль мог их использовать, он должен их импортировать.
Если файл содержит выражения import или export, он рассматривается как модуль. Так, Чтобы сделать из простого скрипта модуль, достаточно добавить в файл:
export {};
Определим простейший модуль. Для этого создадим файл message.js, в котором определим следующий код:
export function sayHello() { console.log("Hello METANIT.COM"); }
Здесь определена обычная функция sayHello()
, которая выводит некоторое сообщение на консоль. Но она определена с ключевым словом export,
а это значит, что данный файл представляет модуль, а функцию sayHello()
можно импортировать в другие модули.
Теперь подключим эту функцию в другой файл. Для этого возьмем файл main.js:
import {sayHello} from "./message.js"; sayHello();
Для подключения функционала из другого модуля применяется ключевое слово import, после которого идут названия подключаемых
компонентов. Все подключаемые из модуля компоненты помещаются в фигурные скобки: import {sayHello}
- в данном случае подключается функция sayHello.
Затем после оператора from указывается модуль, из которого идет импорт. В данном случае указываем "./message.js". В данном случае предполагается что оба модуля - main.js и message.js будут находиться в одной папке.
Для загрузки модулей определим в папке со скомпилированными файлами веб-страницу index.html:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <script type="module" src="main.js"></script> </body> </html>
Для загрузки главного модуля приложения - main.js определяется элемент <script>
, у которого устанавливается атрибут type="module"
.
Загрузка модулей производится через AJAX, поэтому скомпилированные модули должны быть размещены на веб-сервере. То есть у нас не получится просто кинуть страницу в веб-браузер и загрузить на нее модули. Такая веб-страница должна быть размещена на веб-сервере. Поэтому прежде всего надо определиться с веб-сервером. Веб-сервер может быть любым. В данном случае воспользуемся самым простым вариантом - Node.js. Но опять же вместо node.js это может быть любая другая технология сервера - php, asp.net, python и т.д. либо какой-то определенный веб-сервер типа Apache или IIS.
Итак, создадим в папке с файлами модулей файл сервера. Пусть он будет называться server.js и будет иметь следующий код:
const http = require("http"); const fs = require("fs"); http.createServer(function(request, response){ // получаем путь после слеша let filePath = request.url.substring(1); if(filePath == "") filePath = "index.html"; fs.readFile(filePath, function(error, data){ if(error){ response.statusCode = 404; response.end("Resourse not found!"); } else{ if(filePath.endsWith(".js")) response.setHeader("Content-Type", "text/javascript"); response.end(data); } }); }).listen(3000, function(){ console.log("Server started at 3000"); });
Это самый примитивный сервер, который отдает пользователю статические файлы. Для создания сервера применяется функция http.createServer()
,
а для считывания и отправки файлов - функция fs.readFile()
. Если имя файла не указано, то отправляется файл index.html
.
Сервер будет запускаться по адресу http://localhost:3000/
Стоит отметить, что при отправке модулей js нам надо устанавливать mime-тип отправляемого контента в "text/javascript"
:
if(filePath.endsWith(".js")) response.setHeader("Content-Type", "text/javascript");
Структура финального проекта:
Теперь запустим сервер с помощью команды
node server.js
После запуска сервера мы можем перейти в браузере по адресу http://localhost:3000, нам отобразится страница, а в консоли браузера мы сможем увидеть результат работы модуля main.js: