前言
一個疑問衍生出另一個疑問再衍生出又一個疑問,于是有了這篇文章。
一、Vue 項目初始化命令
- 基于 Vite 創建 Vue 項目
- 命令:
npm create vite@latest my-project -- --template vue
- 適用場景:需輕量級、高速開發環境
- 關鍵點:使用 Vite 作為構建工具,
--template vue
指定 Vue 模板
- 命令:
- 基于 Vue CLI 創建項目
- 命令:
npm create vue@latest
- 適用場景:企業級應用,需成熟工具鏈
- 關鍵點:交互式選擇功能(如 Router、Pinia 等),使用 Webpack 構建
- 命令:
- Vite 初始化項目(項目名不同)
- 命令:
npm init vite@latest frontend -- --template vue
- 功能:與第一個命令功能一致,僅項目名改為
frontend
- 命令:
- Laravel 項目混合編譯依賴安裝
- 命令:
npm install laravel-mix vue@latest @vitejs/plugin-vue --save-dev
- 適用場景:Laravel 項目混合使用新舊編譯工具
- 關鍵點:安裝
laravel-mix
(傳統編譯)和@vitejs/plugin-vue
(Vite 插件)
- 命令:
二、Laravel 項目初始化命令
- 手動創建 Laravel 項目并使用 Sail 啟動 Docker 容器
- 命令:
composer create-project --prefer-dist laravel/laravel my-laravel-project cd my-laravel-project ./vendor/bin/sail up -d
- 適用場景:需要完全控制項目結構和配置的場景
- 命令:
- 使用 Laravel 在線構建服務創建項目并啟動 Docker 容器
- 命令:
curl -s "https://laravel.build/my-project?with=mysql,redis" | bash cd my-project && ./vendor/bin/sail up -d
- 適用場景:需要快速啟動并包含特定服務的場景,如 MySQL 和 Redis
- 命令:
三、curl 命令詳解
- 作用
curl
是一個命令行工具,用于在命令行界面下執行數據傳輸。支持多種協議,包括 HTTP、HTTPS、FTP 等。
- 常用選項
-s
或--silent
:靜默模式,不顯示進度條或下載速度等信息,常用于腳本中避免輸出不必要的信息。
- 使用場景
- 通過
curl
從指定 URL 下載數據并執行。例如,Laravel 在線構建服務通過curl
下載并執行 shell 腳本,自動化創建 Laravel 項目并配置依賴。
- 通過
- 結合 Bash 使用
|
是管道符號,用于將前一個命令的輸出作為后一個命令的輸入。curl
下載的數據(通常是 shell 腳本)傳遞給bash
執行。
- Laravel 在線構建服務示例
- 命令:
curl -s "https://laravel.build/myapp?with=mysql,redis" | bash
- 功能:靜默下載并執行 Laravel 在線構建服務的 shell 腳本,自動化創建包含 MySQL 和 Redis 服務的 Laravel 項目。
- 命令:
四、CORS 策略解析與實際案例
1. CORS 核心機制:預檢請求與響應頭
- 通俗解釋:
當網頁發起跨域請求(如 AJAX 請求其他域名的 API,如 example.com 訪問 api.com),
瀏覽器會先派“偵察兵”(OPTIONS 預檢請求)問服務器:“我允許訪問嗎?”
服務器返回響應頭明確規則,瀏覽器才放行實際請求。
CORS 則是網站主動告訴瀏覽器“允許誰訪問我”,避免安全隱患。
- 解決方案(二選一)
- 中間件手動配置:創建
Cors
中間件添加頭部,適用于簡單場景。 - 專用擴展包:使用
fruitcake/laravel-cors
自動處理預檢請求和動態配置。
- 中間件手動配置:創建
- 關鍵響應頭
頭字段 作用示例 Laravel 配置方式 Access-Control-Allow-Origin
*
或https://your-domain.com
中間件設置 Access-Control-Allow-Methods
GET,POST,PUT,DELETE
配置 config/cors.php
Access-Control-Allow-Headers
Authorization, Content-Type
插件自動處理(如 fruitcake/laravel-cors
) - 實際案例(PHP 處理預檢請求):
// 檢測到 OPTIONS 請求(瀏覽器派出的“偵察兵”) if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {header('Access-Control-Allow-Origin: https://client.com'); // 只允許 client.com 訪問header('Access-Control-Allow-Methods: GET, POST, DELETE'); // 允許的 HTTP 方法header('Access-Control-Allow-Headers: Content-Type, Authorization'); // 允許的請求頭header('Access-Control-Max-Age: 86400'); // 緩存規則24小時,減少重復預檢exit; // 結束腳本,無需處理實際數據 }
- 作用:此代碼攔截預檢請求,明確告訴瀏覽器后續請求的權限。否則,跨域請求會被瀏覽器直接阻止。
2. 域名白名單:精準控制訪問權限
- 通俗解釋:
CORS 支持域名白名單,就像“VIP 名單”:服務器只響應名單內域名的請求,其他一律拒絕,防止惡意網站盜取數據。 - 實際案例(Nginx 動態白名單配置):
# 只允許 x1.domain.com 和 x2.domain.com 訪問 set $cors_origin ""; if ($http_origin ~* "^https://(x1.domain.com|x2.domain.com)$") {set $cors_origin $http_origin; } add_header Access-Control-Allow-Origin $cors_origin; add_header Access-Control-Allow-Methods "GET, POST"; add_header Access-Control-Allow-Headers "Content-Type";
- 作用:正則匹配請求來源,非白名單域名返回 403 錯誤,保障接口安全。
3. 帶 Cookie 的跨域請求:特殊處理
-
通俗解釋:
若跨域請求需攜帶 Cookie(如用戶登錄狀態),服務器必須明確指定域名(不能用*
通配符),同時前端設置withCredentials: true
。 -
實際案例(Laravel 中間件配置):
// 創建中間件 app/Http/Middleware/CorsMiddleware.php public function handle($request, Closure $next) {$response = $next($request);$response->header('Access-Control-Allow-Origin', 'http://localhost:3000') // 指定前端域名->header('Access-Control-Allow-Credentials', 'true'); // 允許攜帶 Cookiereturn $response; }
-
注冊中間件(在
app/Http/Kernel.php
添加):protected $middleware = [\App\Http\Middleware\CorsMiddleware::class, ];
-
作用:讓
localhost:3000
的前端安全調用 Laravel API 并傳遞用戶憑證。
五、CORS 問題延申
GET, POST, DELETE我似乎在PHP代碼的表單里見過,印象中每個代表一個方法?這里和表單里有什么不一樣?
GET、POST、DELETE 是 HTTP 協議定義的請求方法,它們在 PHP 表單和 HTTP 請求中的角色既有聯系又有區別。
1. 表單中的方法 vs HTTP 方法
-
表單中的
method
屬性
在 HTML 表單中,method
屬性通常只支持GET
或POST
,用于指定數據提交方式:GET
:數據通過 URL 參數傳遞(如?key=value
),適合非敏感數據(如搜索)。POST
:數據隱藏在請求體中,適合敏感信息(如密碼)或大數據量提交。
表單默認不支持DELETE
,需通過 JavaScript 或隱藏字段模擬。
-
HTTP 方法的完整語義
HTTP 協議定義了更多方法,如DELETE
、PUT
等,用于 RESTful API 設計:DELETE
:刪除服務器資源(如刪除用戶數據)。PUT
:更新資源(如修改用戶信息)。
這些方法需通過 AJAX 或 API 調用實現,傳統表單無法直接使用。
2. 核心區別與適用場景
- 數據傳遞方式
GET
:參數暴露在 URL 中,長度受限(約 2KB),可被緩存/收藏。POST
:數據在請求體,無長度限制,更安全但不可緩存。DELETE
:通常通過 URL 標識資源(如/users/123
),無請求體。
- 冪等性與安全性
GET
和DELETE
是冪等的(多次執行結果相同),POST
不是(如重復提交訂單)。POST
和DELETE
可能修改服務器數據,GET
僅用于查詢。
- PHP 中的處理差異
GET
數據通過$_GET
獲取,POST
通過$_POST
,DELETE
需解析原始輸入(如file_get_contents('php://input')
)。
3. 實際案例對比
-
表單提交(傳統方式)
<!-- GET 表單 --> <form method="get" action="search.php"><input type="text" name="keyword"><button>搜索</button> </form><!-- POST 表單 --> <form method="post" action="login.php"><input type="password" name="pwd"><button>登錄</button> </form>
GET 適合搜索,POST 適合登錄。
-
RESTful API 調用(現代應用)
// 使用 cURL 發送 DELETE 請求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.example.com/users/123"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_exec($ch);
需通過編程方式實現非表單方法。
4. 總結
- 表單:僅支持
GET/POST
,用于頁面數據提交。 - HTTP 方法:包含
DELETE/PUT
等,用于完整資源操作(需結合 API 使用)。 - 選擇依據:根據操作類型(查詢/修改/刪除)和數據敏感性決定方法。
七、Laravel Mix 與 Vite 編譯對比
- Laravel Mix(傳統編譯)
- 原理:基于 Webpack 的封裝層,提供簡化配置的 API。
- 編譯流程:資源文件 → Webpack 編譯 → 合并/壓縮/版本哈希 → public 目錄生成編譯文件。
- 特點:配置簡單但構建速度較慢,適合傳統 Laravel 項目。
- Vite 編譯
- 原理:利用瀏覽器原生 ES 模塊,開發階段免打包。
- 編譯流程:瀏覽器請求 → Vite 服務器按需編譯 → 實時返回單文件。
- 優勢:熱更新快(毫秒級),生產構建用 Rollup 優化。
八、Laravel 實操建議
- Laravel 項目優化:移除混合編譯,統一使用 Vite。
npm remove laravel-mix npm install vite laravel-vite-plugin --save-dev
- Laravel 集成 Vite:使用官方插件并配置腳本,實現自動資源版本化和深度整合 Laravel 路由與視圖系統。
九、Laravel Sail 是否需要安裝?
1. 概述
Laravel Sail 不需要單獨安裝,但它依賴于 Docker 和 Docker Compose。在使用 Laravel Sail 之前,你需要確保你的系統上已經安裝了 Docker 和 Docker Compose。一旦這些依賴項安裝完畢,你就可以通過 Laravel 項目中的預配置腳本或手動添加的方式使用 Laravel Sail了。
2. 詳細說明
- 依賴項安裝:
- Docker:一個開源平臺,用于自動化應用程序的部署為輕量級、可移植的容器。
- Docker Compose:用于定義和運行多容器 Docker 應用程序的工具。
在安裝 Laravel Sail 之前,請確保你的系統上已經安裝了這兩個工具。
- Laravel Sail 的使用:
- Laravel Sail 是 Laravel 官方提供的一個用于管理 Docker 容器的輕量級工具。
- 它通過項目根目錄下的
docker-compose.yml
文件來定義應用程序所需的服務(如 PHP、MySQL、Redis 等)。 - 使用 Laravel Sail,你可以輕松地啟動、停止和管理這些容器。
- Laravel 項目中的 Laravel Sail:
- 當你通過 Laravel 的在線構建服務或使用 Composer 創建一個新的 Laravel 項目時,如果你選擇了包含 Laravel Sail 的選項,項目中將自動包含所需的
docker-compose.yml
文件和sail
命令。 - 在這種情況下,你不需要進行額外的安裝步驟即可使用 Laravel Sail。
- 當你通過 Laravel 的在線構建服務或使用 Composer 創建一個新的 Laravel 項目時,如果你選擇了包含 Laravel Sail 的選項,項目中將自動包含所需的
- 手動添加 Laravel Sail:
- 如果你的 Laravel 項目中沒有包含 Laravel Sail,你也可以手動添加它。這通常涉及將
laravel/sail
包作為開發依賴項添加到項目的composer.json
文件中,并創建或更新docker-compose.yml
文件以定義所需的服務。
- 如果你的 Laravel 項目中沒有包含 Laravel Sail,你也可以手動添加它。這通常涉及將