You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Pug+Sass+Gulp项目中的CSP(内容安全策略)错误

问题描述

我的项目结构如下:
项目结构图

我的gulpfile.js代码:

const gulp = require("gulp");
const pug = require("gulp-pug");
const sass = require('gulp-sass')(require('sass'));
const browserSync = require("browser-sync").create();
const htmlPrettify = require('gulp-html-prettify');

//  Pug -> HTML
gulp.task("pug", () => {
    return gulp
        .src("src/pug/pages/*.pug")
        .pipe(pug())
        .pipe(htmlPrettify())
        .pipe(gulp.dest("dist/html"))
        .pipe(browserSync.stream());
});

//  SCSS -> CSS
gulp.task("sass", () => {
    return gulp
        .src("src/assets/sass/main.scss")
        .pipe(sass().on("error", sass.logError))
        .pipe(gulp.dest("dist/css"))
        .pipe(browserSync.stream());
});

// BrowserSync
gulp.task("serve", () => {
    browserSync.init({
        server: "./dist",
    });

    gulp.watch("src/pug/**/*.pug", gulp.series("pug"));
    gulp.watch("src/assets/sass/**/*.scss", gulp.series("sass"));
});

// task
gulp.task("default", gulp.parallel("pug", "sass", "serve"));

运行gulp后,浏览器打开localhost:3000但崩溃,控制台报错:

Content-Security-Policy: The page's settings blocked the loading of a resource at inline (“default-src”)。

怀疑是Gulp中的BrowserSync导致的,因为运行时能看到内联脚本,尝试修改但无效,求解决方法。


解决方法

这个问题确实是BrowserSync注入的内联脚本触发了页面的CSP(内容安全策略)限制导致的,给你两种实用的解决思路:

方法1:修改BrowserSync配置,禁用内联脚本注入

直接改serve任务里的browserSync.init配置,让它用外部脚本替代内联注入,避开CSP限制:

// BrowserSync
gulp.task("serve", () => {
    browserSync.init({
        server: "./dist",
        injectChanges: false, // 关闭内联注入逻辑
        scriptPath: function(path) {
            return "/browser-sync/browser-sync-client.js"; // 指定外部脚本路径
        }
    });

    gulp.watch("src/pug/**/*.pug", gulp.series("pug"));
    gulp.watch("src/assets/sass/**/*.scss", gulp.series("sass"));
});

方法2:放宽页面CSP规则(仅开发环境用)

如果不想改BrowserSync的注入方式,可以在项目HTML的<head>里加个CSP meta标签,允许内联脚本运行:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline';">

注意这种方式会降低页面安全限制,只适合开发阶段使用,上线前记得移除。

另外还要检查下入口HTML的路径:你的编译后HTML在dist/html目录下,但BrowserSync默认找dist根目录的index.html,如果找不到会加载默认页面,也可能引发异常。可以在配置里指定入口文件路径:

browserSync.init({
    server: {
        baseDir: "./dist",
        index: "/html/index.html" // 对应你的实际入口文件位置
    }
});

内容的提问来源于stack exchange,提问作者Cloly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:32:44