EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本...

为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操作页面, 切换功能模块, 触发页面路由变化时, 再去加载相应需要的资源.

本系列博客的前面几篇一直在讲利用 webpack + vue 开发多页面前端, 然而多页面并不是利剑所指. 本篇将重点介绍使用 vue-router 开发单页面前端, 并且实现按需加载的效果.

关于 vue-router 的按需加载, 官方的文档点这里, 这篇博客主要是根据文档的内容, 结合实例代码, 按步骤,把需要的操作过一遍, 如果你觉得文档描述不够细节, 可以往下看看.

下面, 我们基于 blog_4 的代码 , 把它改造成按需加载的单页面.

安装 vue-router

npm i vue-router -D

修改 webpack.config.js 配置

修改 webpack.config.js, 改造成单页面

const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const webpack = require('webpack');
const path = require('path');
require("babel-polyfill");function resolve(dir) {return path.resolve(__dirname, dir)
}module.exports = {//定义页面的入口, 因为js中将要使用es6语法, 所以这里需要依赖 babel 垫片entry: {index: ['babel-polyfill', './src/index.js']},output: {path: resolve('dist'), // 指示发布目录chunkFilename: 'js/[name].[chunkhash:8].js',filename: 'js/[name].[chunkhash:8].js' //指示生成的页面入口js文件的目录和文件名, 中间包含8位的hash值},externals: {//video.js 作为外部资源引入'video.js': 'videojs'},//下面给一些常用组件和目录取别名, 方便在js中 importresolve: {extensions: ['.js', '.vue', '.json'],alias: {'vue$': 'vue/dist/vue.common.js','jquery$': 'admin-lte/plugins/jQuery/jquery-2.2.3.min.js','src': resolve('src'),'assets': resolve('src/assets'),'components': resolve('src/components')}},module: {//配置 webpack 加载资源的规则rules: [{test: /\.js$/,loader: 'babel-loader',include: [resolve('src')]}, {test: /\.vue$/,loader: 'vue-loader'}, {test: /\.css$/,loader: 'style-loader!css-loader'},{test: /\.less$/,loader: "less-loader"},{test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,loader: 'url-loader?limit=10000&name=images/[name].[hash:8].[ext]'},{test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,loader: 'url-loader?limit=10000&name=fonts/[name].[hash:8].[ext]'},{test: /\.(swf|mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,loader: 'url-loader?limit=10000&name=media/[name].[hash:8].[ext]'}]},plugins: [//引入全局变量new webpack.ProvidePlugin({$: 'jquery',jQuery: 'jquery',"window.jQuery": 'jquery',"window.$": 'jquery'}),new webpack.DllReferencePlugin({context: __dirname,manifest: require('./dll/vendor-manifest.json')}),new CopyWebpackPlugin([{ from: 'dll', ignore: ['template.html', 'vendor-manifest.json'] }]),//编译前先清除 dist 发布目录new CleanWebpackPlugin(['dist']),//生成视频广场首页, 在这个页面中自动引用入口 index --> dist/js/index.[chunkhash:8].js//以 src/index.html 这个文件作为模板new HtmlWebpackPlugin({filename: 'index.html',title: '视频广场',inject: true, // head -> Cannot find element: #appchunks: ['index'],template: './dll/template.html',minify: {removeComments: true,collapseWhitespace: false}})]
};

只保留一个 entry, 一个 HtmlWebpackPlugin
在 output 中添加 chunkFilename 属性, 以对按需加载的 js 文件命名

新建路由文件

add src/router.js

import Vue from 'vue'
import Router from 'vue-router'
import AdminLTE from 'components/AdminLTE.vue'import Index from 'components/Index.vue'
// import Player from 'components/Player.vue'
const Player = () => import(/* webpackChunkName: 'player' */ 'components/Player.vue')
const About = () => import(/* webpackChunkName: 'about' */ 'components/About.vue')Vue.use(Router);const router = new Router({routes: [{path: '/',component: AdminLTE,children: [{path: '',component: Index}, {path: 'player',component: Player}, {path: 'about',component: About}]}],linkActiveClass: 'active'
})export default router;

/ –> Inex 直接加载
/player –> Player 懒加载
/about –> About 懒加载

其中, Player 和 About 两个组件以按需加载的方式的引入, 区别于 Index, 注意文件开始部分, import 的写法, 就是 vue-router 官方文档中 懒加载 部分的写法

改造入口文件

src/index.js

import Vue from 'vue'
import store from 'src/store'
import router from 'src/router'new Vue({el: '#app',store,router,template: `<transition><router-view></router-view></transition>`
})

router-view 标签用于占位路由指向的目标组件

修改 Sider 为路由导航

components/Sider.vue

<template><aside id="slider" class="main-sidebar"><section class="sidebar"><ul class="sidebar-menu"><router-link class="treeview" v-for="(item,index) in menus" :key="index" tag="li" :exact="item.path == '/'" :to="item.path"><a><i :class="['fa', 'fa-' + item.icon]"></i><span>{{item.text}}</span></a></router-link></ul></section></aside>
</template><script>
export default {props: {menus : {default : () => []}}
}
</script>

router-link 定义路由导航链接, 这里路由链接渲染为 li > a 的形式, 当前访问路径为 router-link 或者其子路由时, 该 router-link 自动触发为激活状态, 激活状态的 class name 可以通过 linkActiveClass 指定, 我们在前面的创建 router 的时候, 统一将其指定为 active

如果只想让访问路径严格匹配路由时, 触发为激活状态, 即子路由激活时, 父路由不激活, 需要在父路由上使用 exact 标识. 这个选项, 常用于首页路由 /

改造 AdminLTE.vue

将原来的 slot 占位, 替换成 router-view 占位

<template><div class="wrapper"><NaviBar :logoText="logoText" :logoMiniText="logoMiniText"></NaviBar><Sider :menus="menus"></Sider><div class="content-wrapper"><section class="content"><transition><router-view @btnClick="btnClick"></router-view></transition></section></div></div>
</template><script>
import "font-awesome/css/font-awesome.css"
import "admin-lte/bootstrap/css/bootstrap.css"  
import "admin-lte/dist/css/AdminLTE.css"
import "admin-lte/dist/css/skins/_all-skins.css"import "admin-lte/bootstrap/js/bootstrap.js"
import "admin-lte/dist/js/app.js"import { mapState } from "vuex"
import Vue from 'vue'import Sider from 'components/Sider'
import NaviBar from 'components/NaviBar'export default {data() {return {}},mounted() {$(() => {$.AdminLTE.layout.fix();})},components: {NaviBar, Sider},computed: {//访问 vuex store 中的数据//此处用到 es6 stage-2 才有的三个点展开对象的语法, 对应 .babelrc 中的配置...mapState(["logoText","logoMiniText","menus"])},methods: {btnClick(msg){alert(msg);}}  
}
</script>

运行程序, 看看效果

npm run start

懒加载效果

如上图所示, 当首次点击 [HLS 播放器] 改变路由时, 从 Netwok 观察到加载 player.xxx.js , 表明懒加载开启成功

代码位置: https://github.com/penggy/easydss-web-src/tree/blog_5

关于EasyDSS

EasyDSS商用流媒体服务器解决方案是一套集流媒体点播、转码与管理、直播、录像、检索、时移回看于一体的一套完整的商用流媒体服务器解决方案,EasyDSS高性能RTMP流媒体服务器支持RTMP推流,同步输出HTTP、RTMP、HLS、HTTP-FLV,支持推流分发/拉流分发,支持秒开、GOP缓冲、录像、检索、回放、录像下载、网页管理等多种功能,是目前市面上最合理的一款商用流媒体服务器!

详细说明:http://www.easydss.com/

点击链接加入群【EasyDSS流媒体服务器】:560148162

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2017

EasyDarwin

转载于:https://www.cnblogs.com/babosa/p/7553173.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可工作的软件胜过面面俱到的文档

正在看一本书&#xff0c;书上讲到一个观点&#xff0c;“可工作的软件胜过面面俱到的文档”&#xff0c;这一点我一直都很认可&#xff0c;在平时工作中也是依据这一观点不写详细设计文档就开始编码&#xff0c;设计过程只做比较粗略的概要设计&#xff0c;但是涉及到数据库设…

解密阿里云七武器之高性能消息服务ONS

2019独角兽企业重金招聘Python工程师标准>>> 7月22日&#xff0c;首届阿里云分享日上&#xff0c;阿里云正式对外发布了企业级互联网架构解决方案&#xff0c;该服务由EDAS应用框架、ONS消息队列、DRDS分布式数据库组成&#xff0c;能有效解决企业上云后网站过载、性…

php动态数组的用法

// 创建连接 $con new mysqli($servername, $username, $password, $dbname); // Check conection if ($con->connect_error) {die("连接失败: " . $con->conect_error); }$sql "SELECT * FROM table limit 0,1000"; $result $con->query($sql…

MySQL划重点-查询-条件

查询的基本语法select * from 表名; 消除重复行在 select 后面列前使用distinct 可以消除重复的行 select distinct gender from students;一、条件 使用where子句对表中的数据筛选&#xff0c;结果为true的行会出现在结果集中语法如下 select * from 表名 where 条件;select *…

高数.........

高数70你敢信&#xff1f;&#xff1f;&#xff1f;临考前各种复习做卷子 各种认真 考试的时候感觉题目也都能做 尼玛连上平时分才给我70&#xff1f; 特么我是不信 打电话问问老师 如果没录错果断重修 郁闷转载于:https://www.cnblogs.com/ahu-shu/p/3520249.html

windows服务器下的ftp server搭建

软件下载链接&#xff1a;http://pan.baidu.com/s/1eQJbmUY ftpserver1.下载后打开。2.运行安装3.安装目录选择。这里我选择安装在C盘的FTP目录下&#xff0c;直接填写即可。这个安装目录可随意设置。4.安装启动。查看使用教程&#xff0c;添加用户名&#xff0c;设置密码&a…

WordPress获取当前分类ID的四种方法

WordPress获取当前分类ID的四种方法 时间: 2015-01-05 所属栏目: Wordpress教程 作者: WP管理员之家 关键词: wordpress,分类ID 关注热度&#xff1a; 4,346 次 (1条) WordPress获取当前分类ID的方法有很多&#xff0c;今天我来给大家总结一下吧,wordpress主题定制专家-WP管理…

linux笔记_20150825_linux下的软件工具唠叨下

这些都是书上看到的&#xff0c;有些工具我也没有完全用过。先记下来再说。闲着也是闲着。 1.linux下常见的语言及编程环境:c/c/java/perl/fortan等. 2.图形环境:gnome/kde/gimp/windowmaker/icewm等. 3.编辑器:xemacs/vim/gedit/pico等. 4.shells&#xff1a;bash/tcsh/ash/cs…

扩展编写jquery插件的方法

比如要扩展验证功能&#xff08;jquery.validate.js&#xff09;中的 messages: { required: "This field is required.", remote: "Please fix this field.", email: "Please enter a valid email address.", url: "Please enter a valid …

WordPress窗体化侧边栏

窗体化侧边栏是一个支持 Widget 的侧边栏或者说是窗体化&#xff08;widgetized&#xff09;的侧边栏几乎是 WordPress 主题的标准。 首先&#xff0c;什么是窗体化&#xff08;widgetizing&#xff09;呢&#xff1f;简单的说&#xff0c;窗体化就是能够通过拖拉就能够整理侧边…

EditPlus3 添加 PHP代码格式化

https://www.jb51.net/softs/23113.html 整合PHPCB到EditPlus&#xff1a; EidtPlus&#xff1a;工具》配置用户工具…》添加工具&#xff1a; 菜单文本&#xff1a;PHPCB 命令&#xff1a;浏览到PHPCB程序。 参数&#xff1a;--space-after-if --optimize-eol --space-aft…

1-17

今天很慵懒啊&#xff0c;啥事也没做&#xff0c;把高精度复习了一遍&#xff08;hdu1002&#xff09;。 首先俩字符串数组输入&#xff0c;然后按字符串的长度逆序转到整形数组里 &#xff08;主要是为了把数值的最低位移动到数组的最低位&#xff0c;方便进位&#xff09;&am…

FTP下载导致Zip解压失败的原因

情形&#xff1a;网关通过FTP下载快钱对账文件时通过Apache下commons-net的commons-net-3.5.jar进行封装&#xff0c;对账文件中有中文和英文的文字,大部分情况下能够下载成功&#xff0c;而且也能解压成功。但是偶尔会出现下载了zip的文件&#xff0c;但是解压失败的情况。解决…

SNMP学习之结构体snmp_secmod_def

此结构体中定义了各个回调函数&#xff0c;在函数init_ksm&#xff08;E:\code\net-snmp-5.4.2.1\snmplib&#xff09;中进行了初始化。 void init_ksm(void) { struct snmp_secmod_def *def; // 申请内存 def SNMP_MALLOC_STRUCT(snmp_secmod_def); // 初始化回调函数 def-…

iOS 多参数 ...NS_REQUIRES_NIL_TERMINATION 的写法

1.很早就看到项目里面有下面这样的写法 1 - (id) initWithTitle:(NSString *)title items:(MXContextMenuItem *)item, ... NS_REQUIRES_NIL_TERMINATION; 2.查了点资料&#xff0c;自己练习了下&#xff0c;试着写了个 1 //.h 2 - (NSString *)addMoreArguments:(NSString …

可视化WEB开发 -资料收集

DDDL Studio 版本&#xff0c;一直没有更新&#xff0c;不知道&#xff0c;还能不能用

Golang package

今天&#xff0c;灵感一现&#xff1a;不能一个文件干到底吧&#xff0c;那要是工程大了怎么办&#xff1f; 答案很简单&#xff0c;“包”啊 GO里的包&#xff0c;看起来很简单&#xff0c;但又不简单 一开始&#xff0c;我想当然的以为就是include 路径一样的问题 事实是&…

zabbix通过JMX监控Tomcat及一些报错

软件包下载地址&#xff1a;Wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.11/bin/apache-tomcat-7.0.11.tar.gz#安装jdk:Mkdir /usr/lib/jvmTar xf jdk-7u45-linux-x64.gz -C /usr/lib/jvm#在profile追加以下内容 Vim /etc/profileJAVA_HOME"/usr/lib/jvm/j…

文件的输入/输出操作

10.1 文件I/O操作概述 在Linux系统中&#xff0c;文件I/O操作可以分为两类&#xff0c;一类是基于文件描述符的I/O操作&#xff0c;另一类是基于数据流的I/O操作。 10.1.1 文件描述符简介 在文件操作一章中&#xff0c;也经常提到文件描述符这个概念。所谓文件描述符&#xff0…