Dockerfile - это текстовый документ, содержащий все команды, которые могут быть вызваны в командной строке для создания образа Docker. В Dockerfile:
- Используется образ
node:18-alpineв качестве базового. Это означает, что контейнер будет запущен на Node.js версии 18 на Alpine Linux, который является легким дистрибутивом Linux. - Устанавливается рабочий каталог в
/home/app. - Копируется содержимое каталога
appс хоста в рабочий каталог в контейнере. - Устанавливаются некоторые утилиты командной строки, такие как
mc,nano,curl,wget,bash,gnupg,zsh,git,make. - Устанавливаются zsh и oh-my-zsh для улучшения командной строки.
- Открываются порты, указанные в переменной окружения
${PORT_1},${PORT_2},${PORT_3}.
Docker Compose - это инструмент для определения и запуска многоконтейнерных приложений Docker. В файле docker-compose.yml:
- Определяется одна служба под названием
web. - Строится образ Docker из Dockerfile в текущем каталоге.
- Задается имя образа с помощью переменной окружения
${IMAGE_NAME}. - Задается имя контейнера с помощью переменной окружения
${CONTAINER_NAME}. - Настраивается контейнер так, чтобы он всегда перезапускался.
- Открываются порты, указанные в переменных окружения
${PORT_1},${PORT_2},${PORT_3}. - Монтируется каталог
appс хоста в/home/appв контейнере и файл.envс хоста в/home/app/.envв контейнере.
Makefile - это файл, используемый утилитой make для автоматизации сборки программ. В Makefile:
- Определяется набор команд для работы с Docker, таких как
build,up,down,bash. - Определяется набор команд для работы с приложением внутри Docker контейнера, таких как
app-install-npm,app-install-yarn,app-start,app-build-dev,app-build-prod,app-browser.
Чтобы увидеть список доступных команд Makefile, нужно выполнить команду
makeв терминале.
-
make build: Строит Docker образ без использования кэша. -
make up: Запускает Docker контейнер и открывает терминал. -
make down: Останавливает Docker контейнер. -
make bash: Открывает терминал в текущем Docker контейнере.
make app-install-npm: Устанавливает необходимые пакеты NPM для приложения.make app-install-yarn: Устанавливает необходимые пакеты YARN для приложения.make app-start: Запускает сервер приложения в режиме разработки.make app-build-dev: Собирает приложение в режиме разработки (несжатые файлы).make app-build-prod: Собирает приложение в режиме продакшена (сжатые файлы).make app-browser: Запускает приложение с Browser-Sync для тестирования в реальном времени.
- Настраивается базовый URL и пути для модулей.
- Устанавливается целевую версию ECMAScript на
es6. - Включаются некоторые библиотеки, такие как
ES2020,DOM,DOM.Iterable. - Включаются некоторые опции для линтера и компилятора, такие как
strict,allowJs,noImplicitAny,noUnusedLocals,noUnusedParameters,noFallthroughCasesInSwitch. - Указываются, какие файлы должны быть включены и исключены из компиляции.
"baseUrl": "./": Этот параметр используется для разрешения неабсолютных модульных импортов. В данном случае, он установлен на текущий каталог."paths": Этот параметр используется вместе сbaseUrlдля указания псевдонимов путей, что упрощает импорт модулей. Например,"app": ["./src/app"]позволяет импортировать модули из./src/appпросто используяimport ... from 'app'."module": "es6": Этот параметр указывает, какой стиль модулей использовать. В данном случае, это ECMAScript 2015 модули."target": "es6": Этот параметр указывает, какую версию ECMAScript целить при компиляции TypeScript. В данном случае, это ECMAScript 2015."lib": ["ES2020", "DOM", "DOM.Iterable"]: Этот параметр указывает, какие библиотеки объявлений включить в компиляцию. В данном случае, это ECMAScript 2020, DOM и DOM.Iterable."pretty": true: Этот параметр указывает, следует ли использовать цвета и отступы в сообщениях диагностики."moduleResolution": "bundler": Этот параметр указывает стратегию разрешения модулей. В данном случае, это "bundler", что означает, что разрешение модулей будет осуществляться как в bundler'ах типа webpack."allowSyntheticDefaultImports": true: Этот параметр позволяет импортировать модули, которые не имеют экспорта по умолчанию, как если бы они имели его."forceConsistentCasingInFileNames": true: Этот параметр заставляет TypeScript учитывать регистр при импорте файлов. Это может быть полезно для предотвращения проблем с регистром на системах, которые не учитывают регистр."strict": true: Этот параметр включает все строгие проверки типов."allowJs": true: Этот параметр позволяет компилировать JavaScript файлы."noImplicitAny": true: Этот параметр говорит компилятору генерировать ошибку на выражениях и объявлениях, которые имеют неявный типany."noUnusedLocals": true: Этот параметр говорит компилятору генерировать ошибку при наличии неиспользуемых локальных переменных."noUnusedParameters": true: Этот параметр говорит компилятору генерировать ошибку при наличии неиспользуемых параметров."noFallthroughCasesInSwitch": true: Этот параметр говорит компилятору генерировать ошибку для случаев в операторе switch, которые не заканчиваются break или return."noImplicitReturns": true: Этот параметр говорит компилятору генерировать ошибку для любых кодовых путей, которые не возвращают значение в функции, если функция указывает возвращаемый тип."strictNullChecks": true: Этот параметр говорит компилятору быть более строгим в отношении null и undefined."include": ["src/**/*"]: Этот параметр указывает, какие файлы должны быть включены в компиляцию. В данном случае, это все файлы в каталогеsrc."exclude": ["node_modules", "public/**/*"]: Этот параметр указывает, какие файлы должны быть исключены из компиляции. В данном случае, это все файлы в каталогахnode_modulesиpublic.
- Определяются точки входа для приложения.
- Настраивается
HtmlWebpackPluginдля генерации HTML-файлов, которые включают скрипты. - Настраивается сервер разработки с определенными параметрами, такими как порт, хост, статический каталог и файлы для отслеживания.
- Настраиваются правила для обработки различных типов файлов, таких как TypeScript, CSS, изображения и шрифты.
- Настраиваются расширения, которые должны быть разрешены, и плагины для разрешения путей в соответствии с файлом
tsconfig.json.
const path = require('path');: Это импорт Node.js модуля для работы с путями файлов.const HtmlWebpackPlugin = require('html-webpack-plugin');: Это импорт плагина Webpack, который генерирует HTML файлы для приложения.const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');: Это импорт плагина Webpack, который позволяет разрешать пути, определенные в файлеtsconfig.json.const mode = process.env.NODE_ENV;: Это определение режима сборки, который может быть 'production' или 'development'.const isProductionMode = mode === 'production';: Это булево значение, указывающее, является ли текущий режим режимом 'production'.const entries = {...};: Это определение точек входа для приложения. Каждая точка входа представляет собой JavaScript файл, который будет использован как начальная точка для сборки приложения.const html = [...];: Это массив экземпляровHtmlWebpackPlugin, каждый из которых генерирует HTML файл, включающий скрипты, указанные в свойствеchunks.module.exports = {...};: Это экспорт конфигурации Webpack. Внутри этого объекта:devServer: Это конфигурация сервера разработки Webpack.mode: Это режим сборки.devtool: Это опция, которая контролирует, как исходные карты генерируются.target: Это опция, которая контролирует, как Webpack должен компилировать код.entry: Это точки входа для приложения.output: Это опции, которые контролируют, куда Webpack должен выводить собранные файлы.module: Это опции, которые контролируют, как Webpack должен обрабатывать различные типы файлов.resolve: Это опции, которые контролируют, как Webpack должен разрешать импорты модулей.plugins: Это массив плагинов, которые Webpack должен использовать при сборке приложения.
- Используется
huskyдля управления git hooks. - Настраивается скрипт
prepareдля установкиhusky.
- Устанавливается набор зависимостей разработки, таких как TypeScript, Webpack, ESLint, Prettier и другие.
- Устанавливаются некоторые зависимости для приложения, такие как
axiosиnormalize.css. - Определяются целевые браузеры для приложения с помощью
browserslist.
Пример скрипта который будет добавлять необходимые скрипты на страницу. Это не обязательно виджеты (widgets), может быть любое назначение, например целая страница
// index.js
function addScriptsForWidgets(widgets) {
// Проходим по каждому виджету
for (let widget of widgets) {
// Если на странице есть элемент с атрибутом data-widget, значение которого совпадает с именем виджета
if (document.querySelector(`[data-widget="${widget.name}"]`)) {
// Создаем новый элемент script
let script = document.createElement('script');
// Устанавливаем атрибут src
script.src = widget.scriptUrl;
// Добавляем скрипт в футер
document.body.appendChild(script);
}
}
}
// Использование функции
addScriptsForWidgets([
{name: 'tabs', scriptUrl: 'https://example.com/source/url_to_tabs_script.js'},
{name: 'slider', scriptUrl: 'https://example.com/source/url_to_slider_script.js'}
]);- Открыть
Powershellот имени администратора - Выполнить команду
#если походу установки будут задаваться вопросы отвечать YES
Set-ExecutionPolicy Bypass -Scope Process -Force; `
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))- Далее в
Powershellвыполнить команду
choco install make