用 Flask 来写个轻博客 (28) — 使用 Flask-Assets 压缩 CSS/JS 提升网页加载速度

举报
云物互联 发表于 2021/08/06 01:23:36 2021/08/06
【摘要】 Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录前文列表扩展阅读Flask-Assets将 Flask-Assets 应用到项目中 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 F...

Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog

目录

前文列表

用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板
用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目
用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单
用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码
用 Flask 来写个轻博客 (21) — 结合 reCAPTCHA 验证码实现用户注册与登录
用 Flask 来写个轻博客 (22) — 实现博客文章的添加和编辑页面
用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录
用 Flask 来写个轻博客 (24) — 使用 Flask-Login 来保护应用安全
用 Flask 来写个轻博客 (25) — 使用 Flask-Principal 实现角色权限功能
用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务
用 Flask 来写个轻博客 (27) — 使用 Flask-Cache 实现网页缓存加速

扩展阅读

http://flask-assets.readthedocs.io/en/latest/
Flask-Assets实例学习
Flask-Assets中文参考

Flask-Assets

在访问 Web 应用的时候浏览器会在加载和解析为 HTML 文件之后, 再下载大量的 CSS/JS 文件, 发送了大量的 HTTP 请求. 虽然现在很多浏览器能够支持并行下载, 但也是由限制的, 所以这就成为了网页加载速度的另外一个瓶颈.

Flask-Assets 能够帮助我们将多个 CSS 或 JS 文件合并成为一个大的文件, 并且将这个文件中的空白符和换行符去除, 这样能够让文件的 Size 减少近 30%. 而且 Flask-Assets 还会使用特定的 HTTP Response Header, 让浏览器缓存这些文件, 只有在这些文件的内容被修改时, 才会再次下载, 这个功能一般的 HTTP 方式是不会有的.

  • 安装 Flask-Assets
pip install Flask-Assets, cssmin, jsmin
pip freeze > requirements.txt
  
 
  • 1
  • 2

将 Flask-Assets 应用到项目中

  • 初始化 assets 对象, 并创建打包对象
    vim jmilkfansblog/extensions.py
from flask_assets import Environment, Bundle


#### Create the Flask-Assets's instance
assets_env = Environment()
# Define the set for js and css file.
main_css = Bundle( 'css/bootstrap.css', 'css/bootstrap-theme.css', filters='cssmin', output='assets/css/common.css')

main_js = Bundle( 'js/bootstrap.js', filters='jsmin', output='assets/js/common.js')
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

NOTE 1: Bundel() 的构造器能够接受无限个文件名作为非关键字参数, 定义那些文件需要被打包, 这里主要打包本地 static 下的 CSS 和 JS 两种类型文件.
NOTE 2: 关键字参数 filters 定义了这些需要被打包的文件通过那些过滤器(可以为若干个)进行预处理, 这里使用了 cssmin/jsmin 会将 CSS/JS 文件中的空白符和换行符去除.
NOTE 3: 关键字参数 output 定义了打包后的包文件的存放路径
NOTE 4: 上述的所有路径的前缀都会默认为 ./static/

  • 将 assets 和包对象注册到 app 对象中
from jmilkfansblog.extensions import assets_env, main_js, main_css

...

def create_app(object_name): """Create the app instance via `Factory Method`"""

... #### Init the Flask-Assets via app object assets_env.init_app(app) assets_env.register('main_js', main_js) assets_env.register('main_css', main_css)
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意: 在开发环境下不应该将 CSS/JS 文件打包, 因为我们可能会经常对这些文件进行修改, 所以需要设定在开发环境中不打包, 但生产环境中会自动进行打包.

vim jmilkfansblog/config.py

class DevConfig(Config): """Development config class.""" #### Flask-Assets's config # Can not compress the CSS/JS on Dev environment. ASSETS_DEBUG = True
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

NOTE 1: ProdConfig 不需要修改, 默认是自动打包压缩的.

  • 使用特殊的 Jinja 控制代码来修改 templates 中的 CSS/JS 引用标签 <link><script>

link Old:

  <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.css') }}">
  
 
  • 1

link New:

  {% assets "main_css" %}
  <link rel="stylesheet" type="text/css" href="{{ ASSET_URL }}">
  {% endassets %}

  
 
  • 1
  • 2
  • 3
  • 4

script Old:

<script src="{{ url_for('static', filename='js/bootstrap.js') }}"></script>
  
 
  • 1

script New:

  {% assets "main_js" %}
  <script src="{{ ASSET_URL }}"></script>
  {% endassets %}

  
 
  • 1
  • 2
  • 3
  • 4

经过这些处理之后, 如果 templates 文件的 link 或 script 使用的 css/js 文件路径已经被包含在了 Bunble 中, 那么这些原来会被加载到浏览器中 CSS/JS 文件, 将不会再被加载, 取而代之的是被压缩过的 Size 更小的文件.

  • 我们也可以使用 manager shell 指令的方式来打包 CSS/JS 文件
from flask_assets import ManageAssets
from jmilkfansblog.extensions import assets_env

...

# Pack the static file
manager.add_command('assets', ManageAssets(assets_env))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这样我们就能够通过指令 python manage.py assets -h 来查看其使用方法了:

usage: manage.py assets [-h] [-v] [-q] [--jinja-extension JINJA_EXTENSION] [--parse-templates] {watch,build,clean,check} ...

Manage assets.

positional arguments:
  {watch,build,clean,check}

optional arguments:
  -h, --help show this help message and exit
  -v be verbose
  -q be quiet
  --jinja-extension JINJA_EXTENSION specify the glob pattern for Jinja extensions (default: *.html)
  --parse-templates search project templates to find bundles
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/53765082

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。