34
loading...
This website collects cookies to deliver better user experience
| Compilation | Laravel Mix | Vite |
|--------------------|-------------|-------|
| Initial Compile | 13257ms | 636ms |
| Change Reflection | 5848ms | 224ms |
npm install vite
npm i tailwindcss postcss autoprefixer -D
const { resolve } = require('path');
import vue from '@vitejs/plugin-vue';
export default ({ command }) => ({
base: command === 'serve' ? '' : '/dist/',
publicDir: 'fake_dir_so_nothing_gets_copied',
build: {
manifest: true,
outDir: resolve(__dirname, 'public/dist'),
rollupOptions: {
input: 'resources/js/app.js',
},
},
plugins: [vue()],
resolve: {
alias: {
'@': resolve('./resources/js'),
},
},
});
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
module.exports = {
mode: "jit",
purge: ['./resources/**/*.{js,jsx,ts,tsx,vue,blade.php}'],
theme: {},
variants: {},
plugins: [],
}
import 'vite/dynamic-import-polyfill';
import '../css/app.css';
import { createApp, h } from 'vue'
import { App, plugin } from '@inertiajs/inertia-vue3'
let asyncViews = () => {
return import.meta.glob('./Pages/**/*.vue');
}
const app = createApp({
render: () => h(App, {
initialPage: JSON.parse(el.dataset.page),
resolveComponent: async name => {
if (import.meta.env.DEV) {
return (await import(`./Pages/${name}.vue`)).default;
} else {
let pages = asyncViews();
const importPage = pages[`./Pages/${name}.vue`];
return importPage().then(module => module.default);
}
}
})
})
You can’t use require("file")
syntax, so you always need to use import * from file.js
You need to specify file extensions when importing Vue components, like import FormInput from "@/Shared/Form/FormInput.vue"
"app.js" is the only point of entry for your app, so you need to import your app.css file in your app.js.
"scripts": {
"predev": "printf \"dev\" > public/hot",
"dev": "vite",
"preprod": "printf \"prod\" > public/hot",
"prod": "vite build"
},
npm run vite
is hot reloading itself and npm run dev is just for alias. The “pre” hooks are used to create a file in public directory so that the backend can figure out which mode is running.{{ mix('/js/app.js') }}
helper.<?php
use Illuminate\Support\HtmlString;
if (! function_exists('vite_assets')) {
/**
* @return HtmlString
* @throws Exception
*/
function vite_assets(): HtmlString
{
$devServerIsRunning = false;
if (app()->environment('local')) {
try {
$devServerIsRunning = file_get_contents(public_path('hot')) == 'dev';
} catch (Exception) {}
}
if ($devServerIsRunning) {
return new HtmlString(<<<HTML
<script type="module" src="http://localhost:3000/@vite/client"></script>
<script type="module" src="http://localhost:3000/resources/js/app.js"></script>
HTML);
}
$manifest = json_decode(file_get_contents(
public_path('dist/manifest.json')
), true);
return new HtmlString(<<<HTML
<script type="module" src="/dist/{$manifest['resources/js/app.js']['file']}"></script>
<link rel="stylesheet" href="/dist/{$manifest['resources/js/app.js']['css'][0]}">
HTML);
}
}
composer.json
"autoload": {
"psr-4": {...},
"files": [
"app/Helpers/vite.php"
]
},
composer dump-autoload
]<!DOCTYPE html>
<html>
<head>
<!-- Stuff -->
{{ vite_assets() }}
<!-- More Stuff -->
</head>