123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- import path from "path";
- import { defineConfig, loadEnv } from "vite";
- import react from "@vitejs/plugin-react";
- import svgrPlugin from "vite-plugin-svgr";
- import { ViteEjsPlugin } from "vite-plugin-ejs";
- import { VitePWA } from "vite-plugin-pwa";
- import checker from "vite-plugin-checker";
- import { createHtmlPlugin } from "vite-plugin-html";
- import Sitemap from "vite-plugin-sitemap";
- import { woff2BrowserPlugin } from "../scripts/woff2/woff2-vite-plugins";
- export default defineConfig(({ mode }) => {
- // To load .env variables
- const envVars = loadEnv(mode, `../`);
- // https://vitejs.dev/config/
- return {
- server: {
- port: Number(envVars.VITE_APP_PORT || 3000),
- // open the browser
- open: true,
- },
- // We need to specify the envDir since now there are no
- //more located in parallel with the vite.config.ts file but in parent dir
- envDir: "../",
- resolve: {
- alias: [
- {
- find: /^@excalidraw\/common$/,
- replacement: path.resolve(__dirname, "../packages/common/src/index.ts"),
- },
- {
- find: /^@excalidraw\/common\/(.*?)/,
- replacement: path.resolve(__dirname, "../packages/common/src/$1"),
- },
- {
- find: /^@excalidraw\/element$/,
- replacement: path.resolve(__dirname, "../packages/element/src/index.ts"),
- },
- {
- find: /^@excalidraw\/element\/(.*?)/,
- replacement: path.resolve(__dirname, "../packages/element/src/$1"),
- },
- {
- find: /^@excalidraw\/excalidraw$/,
- replacement: path.resolve(__dirname, "../packages/excalidraw/index.tsx"),
- },
- {
- find: /^@excalidraw\/excalidraw\/(.*?)/,
- replacement: path.resolve(__dirname, "../packages/excalidraw/$1"),
- },
- {
- find: /^@excalidraw\/math$/,
- replacement: path.resolve(__dirname, "../packages/math/src/index.ts"),
- },
- {
- find: /^@excalidraw\/math\/(.*?)/,
- replacement: path.resolve(__dirname, "../packages/math/src/$1"),
- },
- {
- find: /^@excalidraw\/utils$/,
- replacement: path.resolve(__dirname, "../packages/utils/src/index.ts"),
- },
- {
- find: /^@excalidraw\/utils\/(.*?)/,
- replacement: path.resolve(__dirname, "../packages/utils/src/$1"),
- },
- ],
- },
- build: {
- outDir: "build",
- rollupOptions: {
- output: {
- assetFileNames(chunkInfo) {
- if (chunkInfo?.name?.endsWith(".woff2")) {
- const family = chunkInfo.name.split("-")[0];
- return `fonts/${family}/[name][extname]`;
- }
- return "assets/[name]-[hash][extname]";
- },
- // Creating separate chunk for locales except for en and percentages.json so they
- // can be cached at runtime and not merged with
- // app precache. en.json and percentages.json are needed for first load
- // or fallback hence not clubbing with locales so first load followed by offline mode works fine. This is how CRA used to work too.
- manualChunks(id) {
- if (
- id.includes("packages/excalidraw/locales") &&
- id.match(/en.json|percentages.json/) === null
- ) {
- const index = id.indexOf("locales/");
- // Taking the substring after "locales/"
- return `locales/${id.substring(index + 8)}`;
- }
- },
- },
- },
- sourcemap: true,
- // don't auto-inline small assets (i.e. fonts hosted on CDN)
- assetsInlineLimit: 0,
- },
- plugins: [
- Sitemap({
- hostname: "https://excalidraw.com",
- outDir: "build",
- changefreq: "monthly",
- // its static in public folder
- generateRobotsTxt: false,
- }),
- woff2BrowserPlugin(),
- react(),
- checker({
- typescript: true,
- eslint:
- envVars.VITE_APP_ENABLE_ESLINT === "false"
- ? undefined
- : { lintCommand: 'eslint "./**/*.{js,ts,tsx}"' },
- overlay: {
- initialIsOpen: envVars.VITE_APP_COLLAPSE_OVERLAY === "false",
- badgeStyle: "margin-bottom: 4rem; margin-left: 1rem",
- },
- }),
- svgrPlugin(),
- ViteEjsPlugin(),
- VitePWA({
- registerType: "autoUpdate",
- devOptions: {
- /* set this flag to true to enable in Development mode */
- enabled: envVars.VITE_APP_ENABLE_PWA === "true",
- },
- workbox: {
- // don't precache fonts, locales and separate chunks
- globIgnores: [
- "fonts.css",
- "**/locales/**",
- "service-worker.js",
- "**/*.chunk-*.js",
- ],
- runtimeCaching: [
- {
- urlPattern: new RegExp(".+.woff2"),
- handler: "CacheFirst",
- options: {
- cacheName: "fonts",
- expiration: {
- maxEntries: 1000,
- maxAgeSeconds: 60 * 60 * 24 * 90, // 90 days
- },
- cacheableResponse: {
- // 0 to cache "opaque" responses from cross-origin requests (i.e. CDN)
- statuses: [0, 200],
- },
- },
- },
- {
- urlPattern: new RegExp("fonts.css"),
- handler: "StaleWhileRevalidate",
- options: {
- cacheName: "fonts",
- expiration: {
- maxEntries: 50,
- },
- },
- },
- {
- urlPattern: new RegExp("locales/[^/]+.js"),
- handler: "CacheFirst",
- options: {
- cacheName: "locales",
- expiration: {
- maxEntries: 50,
- maxAgeSeconds: 60 * 60 * 24 * 30, // <== 30 days
- },
- },
- },
- {
- urlPattern: new RegExp(".chunk-.+.js"),
- handler: "CacheFirst",
- options: {
- cacheName: "chunk",
- expiration: {
- maxEntries: 50,
- maxAgeSeconds: 60 * 60 * 24 * 90, // <== 90 days
- },
- },
- },
- ],
- },
- manifest: {
- short_name: "Excalidraw",
- name: "Excalidraw",
- description:
- "Excalidraw is a whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them.",
- icons: [
- {
- src: "android-chrome-192x192.png",
- sizes: "192x192",
- type: "image/png",
- },
- {
- src: "apple-touch-icon.png",
- type: "image/png",
- sizes: "180x180",
- },
- {
- src: "favicon-32x32.png",
- sizes: "32x32",
- type: "image/png",
- },
- {
- src: "favicon-16x16.png",
- sizes: "16x16",
- type: "image/png",
- },
- ],
- start_url: "/",
- id:"excalidraw",
- display: "standalone",
- theme_color: "#121212",
- background_color: "#ffffff",
- file_handlers: [
- {
- action: "/",
- accept: {
- "application/vnd.excalidraw+json": [".excalidraw"],
- },
- },
- ],
- share_target: {
- action: "/web-share-target",
- method: "POST",
- enctype: "multipart/form-data",
- params: {
- files: [
- {
- name: "file",
- accept: [
- "application/vnd.excalidraw+json",
- "application/json",
- ".excalidraw",
- ],
- },
- ],
- },
- },
- screenshots: [
- {
- src: "/screenshots/virtual-whiteboard.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/wireframe.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/illustration.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/shapes.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/collaboration.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/export.png",
- type: "image/png",
- sizes: "462x945",
- },
- ],
- },
- }),
- createHtmlPlugin({
- minify: true,
- }),
- ],
- publicDir: "../public",
- };
- });
|