極速快三平臺出租laravel+vue+element-ui 搭建和靜態檔案優化篇
問題出現背景
公司接到一個專案,恩,外包。本來我是不想做,但是因為這個專案是政府單位,所以無奈得做了。然後,專案想要快速成型,於是我選擇使用目前最流行的PHP框架laravel(之前公司都是用自己的框架,很精簡)。
ok,始於laravel。
始於laravel
開啟Laravel的文件,按照官方的quick start開始了一個專案,但是從根目錄發現了package.json。
emmm,這不是nodejs的生態鏈嗎?
於是百度google開始了自己的爬坑之旅。
laravel+vue+element-ui
環境
首先,我們需要構建一個新的vue過程,我簡單的來(前提環境php composer node npm)
composer install
npm install
為了加快速度,一般我們會採用cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
好,想想,我們要用哪幾個元件
vue
vue-router
vue-resource //我並沒有採用 axios 習慣問題
element-ui
全部安裝 cnpm install 上面的包
執行laravel本地服務
php artisan serve
php
新增路由(我這裡使用了一個middleware,如果不用請忽略。)
Route::group(['prefix'=>'admin','middleware'=>'format'] , function (){
Route::get('count','Manager\AdminController@count');
Route::get('index','Manager\AdminController@index');
Route::get('select','Manager\AdminController@select');
Route::post('create','Manager\AdminController@create');
Route::put('update','Manager\AdminController@update' );
Route::delete('delete','Manager\AdminController@delete');
});
新建類,程式碼我就省略了
新建檢視
<divid="app">
<admin-component>
</admin-component>
</div>
vue
新建vue元件
<template>
<divid="app">
<el-row>
<el-col:span="24">
這裡是admin
</el-col>
</el-row>
</div>
</template>
<script>exportdefault {
name: "adminIndexComponent",
}
</script>
RouteCompent.vue router的介面
<template>
<divid="app">
<router-view></router-view>
</div>
</template>
新建入口admin.js
import ELE from 'element-ui'
import VueResource from 'vue-resource'
import App from './components/RouteComponent.vue'
import VUE from 'vue'
window.Vue = VUE;
const app = new Vue({
router,
render: h => h(App)
}).$mount('#app');
新建router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Admin from '../components/admin/AdminIndexComponent.vue'
import Home from '../components/CommonComponent.vue'
const routes = [
{
path: '/',
component: Home,
hidden: true
},
{
path: '/',
component: Home,
name: '管理員列表',
iconCls: 'el-icon-d-caret',
hidden: false,
children: [
{ path: '/admin/index', component: Admin, name: '管理員列表' },
{ path: '/admin/index', component: Admin, name: '管理員列表1' }
]
}
];
const router = new Router({ routes });
export default router
關於laravel的crsf問題
Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('meta[name=csrf-token]').getAttribute('content');
打包js
首先我們要修改mix的打包結構,根目錄下有webpack.mix.js,如下:
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css')
我們依葫蘆畫瓢修改成自己想要的
.js('resources/assets/js/admin.js', 'public/js')
.sass('resources/assets/sass/admin.scss', 'public/css/admin.css')
npm run dev
laraver-mix優化
打包完成後,發現包有1.3m。這肯定是不行的,政府的伺服器是自己的老舊機器,我們都懂的。那該如何優化呢?
mix.extarct
我找到官方文件,說,可以將固定的功能單獨打包。
.extract(['vue','vue-router','vue-resource','element-ui'])
這樣打包之後,會產生3個js
js/manifest.js
js/vendor.js
js/admin.js
用mix引入即可 但是又發現vendor.js太大了。這個時候我去看了下原始碼,發現extract可以指定生成的名字,那我覺得應該也是可以分開打包。 於是:
.extract(['element-ui'],'public/js/element-ui.js')
.extract(['vue','vue-router','vue-resource'],'public/js/vue.js')
然而,我發現光element-ui打包出來就有700k,這樣不行啊。繼續尋找其他方式。 官方說laravel-mix是基於webpack的上層封裝,然後我看了element-ui按需引入,再次修改程式碼,只引入我要用的東西
admin.js
import { Submenu,Menu,MenuItemGroup,MenuItem,DropdownMenu,Dropdown,DropdownItem, Button , Input, Select, Dialog, Pagination, Table, TableColumn} from 'element-ui';
Vue.use(VueResource);
Vue.use(Button);
Vue.use(Input);
Vue.use(Select);
Vue.use(Dialog);
Vue.use(Pagination);
Vue.use(Table);
Vue.use(TableColumn);
Vue.use(Dropdown);
Vue.use(DropdownItem);
Vue.use(DropdownMenu);
Vue.use(Menu);
Vue.use(MenuItemGroup);
Vue.use(MenuItem);
Vue.use(Submenu);
這時候,再打包,我發現element-ui還是將整個包完全打好。emmm,為什麼為什麼。
webpack config注入
再回到上面說的(加粗黑體字"laravel-mix是基於webpack的上層封裝")極速快三平臺出租(www.1159880099.com)QQ1159880099,那麼對webpack的修改肯定也會影響到laravel-mix 所以,繼續百度google(element官網說的用blade我嘗試過,laravel-mix沒找到使用他的方式,可能是我太菜把)。
最後在mix找到一個方法,mix.webpackConfig,再找了一個關於element-ui的webpack打包的說明
mix.webpackConfig({
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
"plugins": [["component", [
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk" //原文theme-default 修改成theme-chalk 原文對css的使用css-loader取消
}
]]]
}
},
]
},
});
再次 npm install prod,duangduangduang!!!!
fonts/vendor/_element-ui@2.2.2@element-ui/lib/theme-chalk/element-icons.woff?2fad952a20fbbcfd1bf2ebb210dccf7a 6.16 kB [emitted]
fonts/vendor/_element-ui@2.2.2@element-ui/lib/theme-chalk/element-icons.ttf?6f0a76321d30f3c8120915e57f7bd77e 11 kB [emitted]
/js/admin.js 338 kB 0 [emitted] [big] /js/admin
/js/vue.js 131 kB 1 [emitted] /js/vue
/js/manifest.js 798 bytes 2 [emitted] /js/manifest
/css/admin.css 193 kB 0 [emitted] /js/admin
nginx最後的優化
最後還有一個300kb+的檔案,這時候,再採取我們的nginx進行優化(gzip),原文
gzip on;
gzip_buffers 32 4k;
gzip_comp_level 6;
gzip_min_length 200;
gzip_types text/css text/xml application/javascript;
最後執行結果:
原來338kb的檔案,現在已經縮成了70kb,完美解決~
後記
關於node-sass報錯解決方案:
cd PROJECT_PATH/node_modules/node-sass/vendor/linux-x64-59(自動產生的版本目錄)
當前目錄會產生一個binding.node
但是好像用npm只會產生一個binding 我猜測直接改名也可以
blog裡說的是用 rebuild node-sass重新編譯 也是可以的。