Пост

Проект под любые нужны с vite

Запускаем новый проект на чистом js с vite в docker за 10 минут

Вводная

Иногда нужно просто запустить какой-то javascript код, или проект написанный на чистом javascript. Или просто проверить свое решение.

Здесь нам поможет современный, быстрый сборщик vite.

Я намеренно не даю ссылку на готовый код на github, дабы это не будет универсальным подходящим решением для всех.

Когда ты разворачиваешь самостоятельно не копируя готовый код, приходит понимание как это работает.

В этой заметке, мы просто запустим скелет проекта с нуля.

Что нам нужно

Для запуска стартового проекта с нуля, нам нужен будет только docker.

С него и начнем.

docker

Сперва создадим папку docker и несколько файлов, где будут настройки наших контейнеров.

1
2
3
4
5
6
7
docker
├── nginx
│    ├── conf.d
│    │   └── default.conf
│    └── Dockerfile
└── node
    └── Dockerfile

vite-simple/docker/nginx/conf.d/default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
    listen 80;
    charset utf-8;
    root /vite-simple;
    server_tokens off;

    resolver 127.0.0.11 ipv6=off;

    add_header X-Frame-Options "SAMEORIGIN";

    location / {
        set $upstream http://node:5173;
        proxy_set_header  Host $host;
        proxy_set_header  Upgrade $http_upgrade;
        proxy_set_header  Connection "Upgrade";
        proxy_pass        $upstream;
        proxy_redirect    off;
    }
}

vite-simple/docker/nginx/Dockerfile

1
2
3
4
5
FROM nginx:stable

COPY ./nginx/conf.d /etc/nginx/conf.d

WORKDIR /vite-simple

vite-simple/docker/node/Dockerfile

1
2
3
4
5
6
7
8
9
10
FROM node:lts

RUN useradd -m alex && usermod -a -G node alex

RUN npm install -g npm@latest

WORKDIR /vite-simple

USER node

В корне создадим docker-compose.yml. Он будет запускать наши контейнеры

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
services:
  node-cli:
    build:
      context: docker
      dockerfile: node/Dockerfile
    volumes:
      - ./:/vite-simple
  nginx:
    build:
      context: docker
      dockerfile: nginx/Dockerfile
    ports:
      - "80:80"
    depends_on:
      - node
  node:
    build:
      context: docker
      dockerfile: node/Dockerfile
    environment:
      WDS_SOCKET_PORT: 0
    volumes:
      - ./:/vite-simple
    command: npm run dev
    tty: true

Мы создали настройки docker контейнеров.

Файлы проекта

Так как проекта как такового у нас еще нет, у нас есть некий скелет файлов которые могут быть. Все лежит в корне, но структура может быть абсолютно любой.

В качестве примера создадим файлы:

1
2
3
4
5
6
├── .gitignore
├── index.html
├── main.js
├── package.json
├── testFunction.js
└── vite.config.js

vite-simple/.gitignore

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

vite-simple/index.html

Это входная точка в приложение.

1
2
3
4
5
6
7
8
9
10
11
12
13
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite simple app</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/main.js"></script>
</body>
</html>

vite-simple/main.js

Это главный фаил который подключается в html

1
2
3
4
5
6
7
import {testFunction} from "./testFunction.js";

document.querySelector('#app').innerHTML = `
  <div>
    ${testFunction()}
  </div>
`;

vite-simple/package.json

Стандартные зависимости npm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "name": "vite-simple",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview --port 80"
  },
  "devDependencies": {
    "vite": "^5.4.9"
  }
}

Как можно видеть у нас одна зависимость, что не может не радовать.

vite-simple/testFunction.js

Фаил функции, их может быть несколько.

1
2
3
export function testFunction() {
    return 'testFunctionText5';
}

vite-simple/vite.config.js

Конфигурация vite.

1
2
3
4
5
6
7
8
9
10
11
12
import { defineConfig } from 'vite'

// https://vite.dev/config/
export default defineConfig({
    server: {
        watch: {
            usePolling: true
        },
        host: true,
        strictPort: true
    },
})

Makefile

Отдельно добавим главный файл Makefile, команды которого мы будем запускать.

1
2
3
4
5
6
7
8
9
10
docker-build:
	docker compose build --pull
docker-up:
	docker compose up -d
docker-down:
	docker compose down --remove-orphans
npm-install:
	docker compose run --rm node-cli npm install
npm-be-updated-all:
	docker compose run --rm node-cli npm outdated --depth=9999

Запуск

Перед запуском установим зависимости.

1
make npm-install

Запускам.

1
make docker-up

Останавливаем.

1
make docker-down

Пересобираем.

1
make docker-build

После запуска проект будет доступен по адресу 127.0.0.1.

Что примечательно vite идет из коробки с hot-reload, что делает разработку комфортной.

Еще что можно отметить, помимо dev режима можно быстро и просто собрать production сборку командой npm run vite build.

Итог

Не вдаваясь в подробности устройства сборщика vite у нас получилось подготовить полноценное окружение для разработки любого проекта.

Помимо этого сюда можно прикрутить:

  • sass
  • react
  • vue
  • typescript

Эти технологии рассмотрю отдельно в соответствующих статьях.

У кого есть что добавить пишите комментарии.

Документация по vite

Авторский пост защищен лицензией CC BY 4.0 .