vue打包后在dist文件夹里有index.html和static文件夹,如果把这两个文件直接放到服务器根目录下,是不会有问题的。但是,如果放到不是根目录的其他路径,都会报错。比如放到thinkphp的view目录下。这是因为打包后的静态文件是相对当前url的。
公司开发过程中,遇到一个需要把vue-cli的小项目,打包部署在thinkphp的控制器模板文件下,作为入口。
方法1:
需要把vue路由从history模式改为hash模式,即可解决后端路由和vue路由冲突,刷新后vue页面正常
url格式就会是 域名/控制器/模板(如:index)/#/
tp端 controller 控制器,新建 diyPageController.php 文件
<?php namespace HomeController; use ThinkController; class DiyPageController extends FormBaseController { public function index() { $this->display('index'); } }
对应模板文件,放入打包后的文件,作为入口
<!DOCTYPE html> <html lang=""> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="icon" href="/assets/diypage/favicon.ico" /> <title>{$pageTitle}</title> <link href="/assets/diypage/css/chunk-vendors.3bdbd2e4.css" rel="stylesheet" /> <link href="/assets/diypage/css/app.c7872c12.css" rel="stylesheet" /> </head> <body> <noscript ><strong >We're sorry but diyform doesn't work properly without JavaScript enabled. Please enable it to continue.</strong ></noscript > <div id="app"></div> <script defer="defer" src="/assets/diypage/js/chunk-vendors.1f1fa155.js" ></script> <script defer="defer" src="/assets/diypage/js/app.2f916d84.js"></script> </body> </html>
hash模式,优势就是不会和tp路由产生冲突,只需要吧index.html 作为程序的入口文件即可
方法二:
如果想用history 模式也可以的
但是需要配置好vue-router下面的Base。Base 需要为你在tp端的文件路径。
import Vue from 'vue'; import Router from 'vue-router'; Vue.use(Router); import diyIndex from '@/pages/setting/diyIndex'; import index from '@/pages/setting/index'; const router = new Router({ mode: 'history', base: '/order/home/DiyPage/', //base 此处要配置为tp端的路由路径 routes: [ // 路由列表,里面的每一个成员都是一个url地址和组件的映射关系 { path: '/', name: 'index', meta: { title: '1v1预约咨询' }, component: index, }, { path: '/index', name: 'index', meta: { title: '1v1预约咨询' }, component: index, }, { path: '/diy', name: 'diyindex', meta: { title: '表单diy工具' }, component: diyIndex, }, { path: '/order/home/DiyPage/diy', name: 'diyindex', meta: { title: '表单diy工具' }, component: diyIndex, }, ], }); export default router;
域名/order/home/DIyPage/index.html 这个时候访问路径默认会展示vue-cli里面的默认组件。
如果想访问路由/diy 的内容呢? 需要在tp端controller 多声明一个方法,模板指向index.html 入口文件(与默认index方法一样)
<?php namespace HomeController; use ThinkController; class DiyPageController extends FormBaseController { public function index() { $this->display('index'); } public function diy() { $this->display('index'); } }
这个时候就可以通过 域名/order/home/DiyPage/diy.html 访问到 /diy 路由下的内容了。