webpack热更新报错:Refused to apply style from ‘http://127.0.0.1:9000/main.8b0a1621.css‘ because its MIME

本文介绍了如何解决Webpack热更新失效的问题。通过排查发现是由于使用了MiniCSSExtractPlugin导致的,该插件不支持热更新功能。最终通过将MiniCSSExtractPlugin替换为style-loader解决了问题。

webpack热更新无效

打开控制台一看,报了下面的错:
在这里插入图片描述

原来是无法访问到打包后的样式资源,测试后纯js是可以热更新的。

网上搜了很多答案,绝大部分都是路径问题,但实际上我这不是路径问题,点击链接可以在控制台的来源中访问到样式资源:
在这里插入图片描述
后面我怀疑是我的css相关loader有问题,结果一看,果然如此:

            {
                test: /\.css$/,
                use: [MiniCssExtractPlugin.loader, 'css-loader'],
            },
            {
                test: /\.less$/,
                use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'less-loader']
            },

我这里用的是MiniCSSExtractPlugin.loader来代替style-loader的,而MiniCSSExtractPlugin是不支持HRM热更新的,需要手动刷新

将MiniCSSExtractPlugin.loader改回style-loader即可。

最后感谢这位博主的文章,让我知道问题所在:
style-loader、mini-css-extract-plugin的区别

### 解决CSP阻止应用内联样式的方法 当启用严格的内容安全策略(CSP)时,可能会遇到无法使用内联样式的情况。这是因为默认情况下,许多严格的CSP配置会禁用`unsafe-inline`指令,以防止潜在的安全风险。 为了允许内联样式而不过度放宽安全性设置,有几种方法可供选择: #### 方法一: 使用 `style-src 'self' 'unsafe-inline';` 如果确实需要支持某些页面上的少量内联样式,并且能够接受一定的安全妥协,则可以在服务器端响应头中加入如下声明[^1]: ```http Content-Security-Policy: style-src 'self' 'unsafe-inline'; ``` 这种方法虽然简单有效,但由于启用了`unsafe-inline`选项,仍然存在一定程度的风险。 #### 方法二: 将CSS提取到外部文件并链接引入 更推荐的做法是将所有的样式规则移动至单独的`.css`文件中,并通过标准方式将其链接入HTML文档: ```html <link rel="stylesheet" href="/styles.css"> ``` 这样不仅提高了代码可维护性和性能表现,同时也完全遵循了最佳实践中的分离关注点原则[^2]。 #### 方法三: 利用哈希或非ces加密签名验证机制 对于那些必须保留原位定义的小范围样式变更需求而言,可以通过计算相应部分的具体SHA-256/384/512摘要值来实现白名单授权访问控制。例如,在HTTP头部添加如下内容即可生效: ```http Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'sha256-BASE64_ENCODED_HASH_OF_YOUR_INLINE_STYLE' ``` 此方案既保持了较高的灵活性又兼顾到了必要的防护措施。 #### Python示例 - 计算内联样式的SHA-256散列值 ```python import base64 from hashlib import sha256 def get_inline_style_hash(style_content): hash_object = sha256() encoded_bytes = style_content.encode('utf-8') hash_object.update(encoded_bytes) digest = hash_object.digest() return "sha256-" + base64.b64encode(digest).decode() inline_style = "body { background-color: red; }" print(get_inline_style_hash(inline_style)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值