本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到!

接上回 《高性能流媒体服务器EasyDSS前端重构(一)-从零开始搭建 webpack + vue + AdminLTE 多页面脚手架》

在上一篇博客中, 我们白手起家, 从零搭建了 webpack + vue + AdminLTE 多页面脚手架. 代码在这里: easydss-web-src , 我为第一篇博客建立了单独的分支 blog_1 , 并且我打算后面的系列都这样, 建立一个单独分支.

为什么要提取共用文件

我们已经创建了两个静态页面: index.html 和 about.html, 对应的入口 js 分别是 index.js 和 about.js.

运行编译

npm run build

build 两个如此简单的两个页面, 耗时 6 秒多, 可以预见在实际开发中将面临 build 耗时长的问题. 并且我们看到 build 后的 js 文件达到 1.05MB 之大. 实际上, index.js 和 about.js 两者是有共用部分的, 这其中包括 jquery , vue, AdminLTE 这些基础组件. 本篇的主题就是介绍如何提取这部分共用的组件出来单独编译.

webpack.DllPlugin

类似于 Windows 中 DLL 动态库的概念, 在 webpack 2 当中, 引入了 DllPlugin. 借助这个插件, 我们能够把共用的组件 build 到一块, 生成 vendor.js, 然后在静态页面中, 引用这个 vendor.js.

新建组件打包配置文件: webpack.dll.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const webpack = require('webpack');
const path = require('path');function resolve(dir) {return path.resolve(__dirname, dir)
}module.exports = {entry: {//提取共用组件, 打包成 vendor.jsvendor: ['jquery', 'vue', 'vuex', 'babel-polyfill','font-awesome/css/font-awesome.css', 'admin-lte/bootstrap/css/bootstrap.css','admin-lte/dist/css/AdminLTE.css', 'admin-lte/dist/css/skins/_all-skins.css','admin-lte/bootstrap/js/bootstrap.js', 'admin-lte/dist/js/app.js']},output: {path: resolve('dll'),filename: 'js/[name].[chunkhash:8].js',library: '[name]_library'},resolve: {extensions: ['.js', '.vue', '.json'],alias: {'vue$': 'vue/dist/vue.common.js','jquery$': 'admin-lte/plugins/jQuery/jquery-2.2.3.min.js'}},module: {rules: [{test: /\.css$/,loader: 'style-loader!css-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: /\.(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.HashedModuleIdsPlugin(),new CleanWebpackPlugin(['dll']),new webpack.DllPlugin({path: resolve("dll/[name]-manifest.json"),name: "[name]_library",context: __dirname}),new HtmlWebpackPlugin({filename: 'template.html',title: '<%= htmlWebpackPlugin.options.title %>',inject: 'head',chunks: ['vendor'],template: './src/template.html',minify: {removeComments: true,collapseWhitespace: false}})        ]
};

entry 当中, 指定哪些资源被视为共用组件
上面的配置将在当前目录下, 创建一个 dll 目录, 专门用来存放共用组件包 vendor.js, 并且生成一个 template.html, 这个 template.html 中包含对 vendor.js 的引用. template.html 将作为其他页面的基础模板使用, 这样一般静态页面就能够引用到 vendor.js 了.

webpack.DllReferencePlugin

DllReferencePlugin 这个插件用来告诉 webpack , 哪些引用到的资源已经被打包在共用组件包当中, 从而避免再次被打包.

我们来修改 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'],about: ['babel-polyfill', './src/about.js']},output: {path: resolve('dist'), // 指示发布目录filename: 'js/[name].[chunkhash:8].js' //指示生成的页面入口js文件的目录和文件名, 中间包含8位的hash值},//下面给一些常用组件和目录取别名, 方便在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}}),//生成版本信息页面, 在这个页面中自动引用入口 about --> dist/js/about.[chunkhash:8].js//以 src/index.html 这个文件作为模板new HtmlWebpackPlugin({filename: 'about.html',title: '版本信息',inject: true,chunks: ['about'],template: './dll/template.html',minify: {removeComments: true,collapseWhitespace: false}})]
};

DllReferencePlugin 通过读取 ./dll/vendor-manifest.json, 判断哪些资源引用被打包在共用组件包
index.html 和 about.html 以 ./dll/template.html 作为模板, 从而获取对 vendor.js 的引用
引入 CopyWebpackPlugin 这个插件, 负责将共用组件包依赖的资源文件拷贝到发布目录下, 同时过滤掉发布时不需要的文件: template.html 和 vendor-manifest.json

使用新的编译方式

因为新引入 CopyWebpackPlugin 插件, 首先, 我们安装它

npm i copy-webpack-plugin --save-dev

修改 package.json , 添加 dll 编译配置:

{"name": "easydss-web-src","version": "1.0.0","description": "","main": "index.js","scripts": {"build": "webpack --progress --hide-modules","dll": "webpack --progress --hide-modules --config ./webpack.dll.config.js","start": "webpack-dev-server --open","test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","devDependencies": {"admin-lte": "^2.3.11","babel-core": "^6.26.0","babel-loader": "^7.1.1","babel-polyfill": "^6.26.0","babel-preset-es2015": "^6.24.1","babel-preset-stage-2": "^6.24.1","clean-webpack-plugin": "^0.1.16","css-loader": "^0.28.5","file-loader": "^0.11.2","font-awesome": "^4.7.0","html-webpack-plugin": "^2.30.1","less": "^2.7.2","less-loader": "^4.0.5","style-loader": "^0.18.2","url-loader": "^0.5.9","vue": "^2.4.2","vue-loader": "^13.0.4","vue-template-compiler": "^2.4.2","vuex": "^2.3.1","webpack": "^3.5.5","webpack-dev-server": "^2.7.1"}
}

编译共用组件, 你可能在整个开发过程中, 只需要执行一次对共用组件的 build, 因为一般情况下, 我们很少会对它做改动, 这一点是我优化编译时间的关键.

npm run dll

编译静态页面, 这一次的耗时相对之前减少了 4 秒多.

npm run build

是不是离幸福又近了一点, 源码位置: easydss-web-src/tree/blog_2

下一篇介绍在此基础之上, 引入饿了么前端组件框架 element-ui

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2017

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

高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间...相关推荐

  1. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器前端源码重构(二)-webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间

    接上篇 在上一篇博客中, 我们白手起家, 从零搭建了 webpack + vue + AdminLTE 多页面脚手架. 代码在这里: easydss-web-src , 我为第一篇博客建立了单独的分支 ...

  2. webpack服务器性能,高性能流媒体服务器EasyDSS前端重构(三)- webpack + vue + AdminLTE 多页面引入 element-ui...

    接上篇 本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! element-ui 介绍 饿了么前端开发组件框架 ...

  3. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器前端源码重构(三)- webpack + vue + AdminLTE 多页面引入 element-ui

    EasyDSS流媒体解决方案总体可划分成三个部分:前端视频源设备(PC.手机.摄像机)流媒体数据获取并即时回传.流媒体服务器端直播和录像与回放.客户端直播播放与录像检索回放.前端推流我们使用跨平台的R ...

  4. EasyDSS高性能流媒体服务器前端重构

    本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! EasyDSS 高性能流媒体服务器前端架构概述 EasyDS ...

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

    为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...

  6. 使用Nginx架设高性能流媒体服务器

    前言* 随着Nginx 大量被各互联网公司使用,常见的Nginx 用来做反向代理WEB 服务器.缓存服务器,nginx 应用很广泛,今天我们来研究一下使用Nginx架设高性能流媒体服务器 . 一. 系 ...

  7. EasyDSS高性能流媒体服务器前端重构(六)- webpack-dev-server 支持手机端访问

    很多时候,前端开发的页面,不仅要在PC端测试效果, 还要在手机端测试效果. 在开发阶段, 我们以 webpack-dev-server 来启动浏览器, 打开正在开发的页面. webpack-dev-s ...

  8. EasyDSS高性能RTMP/HLS(m3u8)/HTTP-FLV/RTSP流媒体服务器EasyDSS出现加密机授权异常问题如何解决?

    EasyDSS流媒体服务器提供一站式的转码.点播.直播.时移回放服务,简化了开发和集成的工作. 其中,点播功能主要包含:上传.转码.分发.直播功能,主要包含:直播.录像,直播支持RTMP输入,RTMP ...

  9. EasyDSS流媒体服务器软件-搭建及二次开发接口对接说明示列

    EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作. 其中,点播功能主要包含:上传.转码.分发.直播功能主要包含:直播.录像, 直播支持RTMP输 ...

最新文章

  1. 别盲目调参!深度学习要先找到最佳策略
  2. 类中成员函数声明后面的const的含义
  3. 互联网高并发架构技术实践
  4. linux管道阻塞代码,linux中的管道
  5. 7 php程序的调试方法_php程序调试方法总结
  6. 数据结构实验之二叉树二:遍历二叉树
  7. ‘MicrosoftWebDriver.exe‘ executable needs to be in PATH.
  8. 前端组件化-抽象公共组件类
  9. 构建现代Web应用时究竟是选择传统web应用还是SPA
  10. android uber源码,Uber SDK in android
  11. 【数据结构和算法05】 红-黑树(转发)
  12. java基础入门数据类型,JAVA基础教程:JAVA的基本数据类型及介绍
  13. 仿iReader-按menu键弹出PopupWindow布局界面
  14. linux 路由访问不了php文件,linux系统nginx服务器不能访问php文件问题
  15. 防火墙之iptables
  16. 微信和QQ,终于可以互通了
  17. 易优CMS:arcview的基础用法
  18. 解决应用程序无法正常启动0xc0150002问题
  19. 新浪微博产品的细微体验,你发现了么?
  20. TortoiseSVN 使用教程

热门文章

  1. Android从入门到进阶之高级控件
  2. Netcraft :2019年4月全球Web服务器排名 nginx首度登顶
  3. 性能测试报告模板_性能测试新手误区
  4. ffmpeg基础使用
  5. tensorflow系列之1:加载数据
  6. sklearn综合示例7:集成学习与随机森林
  7. java线程暂停与恢复suspend和resume
  8. ElasticSearch 实践过程中遇到的几个小问题
  9. 时间序列(七): 高冷贵族: 隐马尔可夫模型
  10. 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(二)