Python开发阶段后台管理系统,如何检测JS内容变动并自动修改文件名?

flask--> 使用者不知清缓存,会导致页面部分数据不正确或者没有

解决方法一: 改变静态文件名称,与上次名字不一致。缺点:有时候开发者会忘记,操作麻烦,让开发者精力集中在业务上。

方法二: 听说有个 gulp 可以管理静态文件,具体教程各位大佬有?

方法三(主要想要这种方法): 有 python 或者 flask 相关的包,来管理这些静态文件?


Python开发阶段后台管理系统,如何检测JS内容变动并自动修改文件名?
32 回复

我看到别人 JavaScript 的 scr 后面带了?版本号。
比如现在这个页面,你查看源代码就可以看到;
<script src="/static/dist/combo.js?v=c60a80c85dcdff5b64f7ce14139b2435" type=“text/javascript” defer></script>


这个问题在Web开发中很常见,主要是为了实现前端静态资源的版本化管理,避免浏览器缓存导致更新后用户看不到最新代码。

核心思路是:在构建阶段,通过计算JS文件的哈希值(如MD5或SHA-256)并将其附加到文件名中,同时自动更新HTML模板中的引用路径。

这里提供一个基于Python的简单实现方案,使用hashlib计算文件哈希,并结合osre模块进行文件操作和内容替换。

import hashlib
import os
import re
import glob

def generate_file_hash(filepath):
    """计算文件的MD5哈希值(取前8位)"""
    hash_md5 = hashlib.md5()
    with open(filepath, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()[:8]

def update_js_references(html_file, js_mapping):
    """更新HTML文件中的JS引用"""
    with open(html_file, 'r', encoding='utf-8') as f:
        content = f.read()
    
    for old_name, new_name in js_mapping.items():
        # 使用正则匹配替换script标签中的src属性
        pattern = rf'src=["\'](.*?{re.escape(old_name)})["\']'
        replacement = f'src="static/js/{new_name}"'
        content = re.sub(pattern, replacement, content)
    
    with open(html_file, 'w', encoding='utf-8') as f:
        f.write(content)

def main():
    # 配置路径
    js_dir = "static/js"
    html_file = "templates/index.html"
    
    # 获取所有JS文件
    js_files = glob.glob(os.path.join(js_dir, "*.js"))
    js_mapping = {}
    
    for js_file in js_files:
        # 计算哈希并生成新文件名
        file_hash = generate_file_hash(js_file)
        base_name = os.path.basename(js_file)
        name_without_ext, ext = os.path.splitext(base_name)
        new_name = f"{name_without_ext}.{file_hash}{ext}"
        
        # 重命名文件
        new_path = os.path.join(js_dir, new_name)
        os.rename(js_file, new_path)
        js_mapping[base_name] = new_name
        print(f"Renamed: {base_name} -> {new_name}")
    
    # 更新HTML引用
    if js_mapping:
        update_js_references(html_file, js_mapping)
        print("Updated HTML references")

if __name__ == "__main__":
    main()

关键点说明:

  1. 哈希生成generate_file_hash函数计算JS文件的MD5哈希,取前8位足够区分不同版本。
  2. 文件重命名:将原文件名改为原文件名.哈希值.js的格式。
  3. 引用更新update_js_references函数使用正则表达式匹配HTML中对应的<script>标签,并替换src属性。

使用方式:

  • 将上述代码保存为version_assets.py
  • 根据实际情况修改js_dirhtml_file路径
  • 在构建或部署脚本中运行此脚本

生产环境建议: 虽然这个方案能解决问题,但在实际项目中,更推荐使用成熟的构建工具:

  • Webpack:配合output.filename[contenthash]占位符
  • Vite:内置资源哈希处理
  • Django-CompressorFlask-Assets:专门的静态资源管理扩展

这些工具提供了更完善的功能,如依赖分析、代码压缩、缓存失效等。

一句话总结:用文件哈希重命名JS并同步更新HTML引用,但建议直接用Webpack等成熟构建工具。

js 后面拼时间戳参数就行了

webpack 啊

所以开发阶段为什么会有使用者?

你们没用 webpack ?

如果没有用 webpack 可以直接在后面添加时间戳 那每次加载 js 都是最新的 获取找找其他的类似 JSLoader 之类的工具

是供公司内部使用的,运营边使用边提出需求

没有用过

那岂不是我说的第一种方法,这种方法不好操作,太繁琐,想一劳永逸

webpack 了解一下

有 python 相关的包?

webpack 和 gulp 都行,原理就是自动帮你改静态文件名。

网上资料大把,但是相关具体操作文档难找,请问您有相关资料?

gulp 也行

mc 牛逼

请求后面都带随机数,每次都强刷好了

js url 加一个时间戳参数就可以了,作用是每次都会请求最新的 js 文件。
例如: 1.js?timestamp=2123122232323

地址后加 search 串可穿透缓存

<script src="/static/dist/combo.js?v=c60a80c85dcdff5b64f7ce14139b2435" type=“text/javascript” defer></script> 这样?就是问号后面随意写?

直接加随机字符串时间戳也可以

随便写就算你在?后面写个小说应该都没问题。[doge]

webpack 是个工具 不是包

只是内部用,你搞个时间戳就行了,没必要搞那么麻烦,解决问题不需要 1 分钟

不写的话,你的 js 文件被缓存到本地了,就不会重新加载了
写了以后,你的 js 文件每次都不一样,都会重新加载
webpack 自动加

叫他 刷新用 ctrl+f5

webpack 在你电脑打开以后,如果在局域网可以访问你的 ip,

如果不在一个局域网, 可以用内网穿透,不过没有必要

自己找个地方搭建个上传不就可以了, 告诉他这个就是开发环境

用 nginx 代理一下,设置 expires = -1 表示浏览器不缓存即可。




webpack 咋设置?各位大佬

ctrl+F5 能实现的事非得搞出点其他东西。。。路径后面加时间戳也能实现的东西非得搞出点其他东西。。。webpack 和 gulp 都能实现的东西,百度搜一下就知道了,人家都回复你了,还得问具体咋设置

abc.js => abc-flsadjfasldkfjaslkdjfads.js
加上一串奇怪的 hash 就行了。
基本上 webpack gulp 这些东西 build 时候都可以给你加上一串 hash 的。
然后 你需要做的就是在 前端页面 动态的修改 script 标签里面的 引用。

简单直接在静态文件后增加时间戳,毕竟是内部使用。

回到顶部