博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
laravel+vue+element-ui 搭建和静态文件优化篇
阅读量:6849 次
发布时间:2019-06-26

本文共 5905 字,大约阅读时间需要 19 分钟。

hot3.png

问题出现背景

公司接到一个项目,恩,外包。本来我是不想做,但是因为这个项目是政府单位,所以无奈得做了。然后,项目想要快速成型,于是我选择使用目前最流行的PHP框架laravel(之前公司都是用自己的框架,很精简)。

ok,始于laravel。

始于laravel

打开Laravel的文档,按照官方的quick start开始了一个项目,但是从根目录发现了package.json。

emmm,这不是nodejs的生态链吗?

于是百度google开始了自己的爬坑之旅。

laravel+vue+element-ui

环境

首先,我们需要构建一个新的vue过程,我简单的来(前提环境php composer node npm)

composer installnpm install

为了加快速度,一般我们会采用cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

好,想想,我们要用哪几个组件

vuevue-routervue-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');});

新建类,代码我就省略了

新建视图

vue

新建vue组件

RouteCompent.vue router的界面

新建入口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.jsjs/vendor.jsjs/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的上层封装"),那么对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重新编译  也是可以的。

转载于:https://my.oschina.net/lwl1989/blog/1786265

你可能感兴趣的文章
分配到弱属性;对象将在赋值之后释放
查看>>
java作用域public ,private ,protected 及不写时的区别
查看>>
基于DirectShow的局域网内音视频流的多机共享
查看>>
until循环语句
查看>>
Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现
查看>>
提高用户体验方式:饥饿营销
查看>>
忘记无线密码也有办法解决
查看>>
Java8中的LocalDateTime工具类
查看>>
Exchange 2013 PowerShell创建自定义对象
查看>>
pvcreate出错: Can't open /dev/sdb7 exclusively. Mounted filesystem?
查看>>
RAID-10 阵列的创建(软)
查看>>
javaScript的调试(四)
查看>>
nginx不使用正则表达式匹配
查看>>
dell台式机双SATA硬盘开机提示NO boot device available- Strike F1 to retryboot .F2
查看>>
js表达式和语句
查看>>
linux下mysql的卸载、安装全过程
查看>>
KafkaConsumer分析
查看>>
samba不需密碼的分享
查看>>
mysql备份还原
查看>>
利用putty进行vnc + ssh tunneling登录
查看>>