浏览器同步不重新呈现 EJS 部分文件

Browser sync not re-rendering EJS partial files

我正在使用 Webpack 和 Express 的浏览器同步来开发一个使用 EJS 模板的简单网站。除了浏览器同步在重新加载浏览器时似乎没有呈现新更新的 EJS 部分之外,一切都工作正常。

但是,它确实注意到部分文件发生了变化,当我保存更改时,它会重新加载浏览器 window。

我尝试使用多个路径,从 **/*.ejs 到使用数组直接设置文件夹,如下所示:

        new BrowserSyncPlugin({
            files: ['src/views/pages/index.ejs', 'src/views/pages/partials/header.ejs'],
            proxy: `https://localhost:${process.env.PORT}`
        }),

我感觉这可能与浏览器同步、Html Webpack 插件或 EJS Webpack 加载器存在某种冲突。相关配置行如下:

        new BrowserSyncPlugin({
            files: ['src/views/pages/index.ejs', 'src/views/pages/partials/header.ejs'],
            proxy: `https://localhost:${process.env.PORT}`
        }),
        new HtmlWebpackPlugin({
            template: 'ejs-webpack-loader!src/views/pages/index.ejs',
            filename: 'index.html',
            domain: process.env.DOMAIN
        }),

并且,为了提供一些上下文,header.ejs 文件包含如下:

        <%- include partials/header.ejs %> 

我认为这与其中一个加载程序有关,因为浏览器同步实际上是在注意到更改并重新加载页面。加载器根本不重新渲染包含。但是,如果我直接更改 index.ejs 它实际上会重新呈现更改。

提前谢谢你。

编辑:

我的 Express 服务器配置如下:

require('dotenv').config({path: './.env'});
const express = require('express');
const app = express();
const WebpackDevMiddleware = require('webpack-dev-middleware');
const https = require('https');
const fs = require('fs');
const config = require('../webpack.dev');
const helmet = require('helmet');
const webpack = require('webpack');
const compiler = webpack(config);

const {
    SSL_CERT,
    SSL_KEY,
    SSL_PW,
    PORT
} = process.env;
const httpsOptions = {
    key: fs.readFileSync(SSL_KEY),
    cert: fs.readFileSync(SSL_CERT),
    passphrase: SSL_PW
};
const secureServer = https.createServer(httpsOptions, app);
app.use(helmet());

app.use(WebpackDevMiddleware(compiler, {
    publicPath: config.output.publicPath,
    reload: true
}));

const listener = secureServer.listen(PORT, () => console.log(`Connected on ${listener.address().port}`));

另一个注意事项,如果我保存 index.ejs 它将呈现对子项所做的更改。

这里'devServer'的配置请参考:

 devServer: {
        open: true,
        contentBase: path.resolve(`src`), // Specify your source path
        inline:true,
        watchContentBase: true, // Must be true
        port: 4000,
        host: "127.0.0.1",
        overlay: {
            errors: true,
            warnings: false
        },
    },

问题在于 ejs-webpack-loader 插件未处理包含文件的重新呈现。

为了解决这个问题,有必要使用标准的 webpack require() 方法。

所以,我的 index.ejs 文件现在看起来如下:

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en-GB"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <%- include partials/head.ejs %> 
        <title>Making Stuffs | Coming Soon Boilerplate</title>
    </head>
    <body>
        <!--[if lt IE 7]>
            <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="#">upgrade your browser</a> to improve your experience.</p>
        <![endif]-->
        <%- require ('ejs-webpack-loader!./partials/navbar.ejs')() %>
        <%- require ('ejs-webpack-loader!./partials/intro.ejs')() %> 
        <%- require ('ejs-webpack-loader!./partials/about.ejs')() %> 
        <%- require ('ejs-webpack-loader!./partials/portfolio.ejs')() %> 
        <%- require ('ejs-webpack-loader!./partials/contact.ejs')() %> 
        <%- require ('ejs-webpack-loader!./partials/blog.ejs')() %> 
    </body>
</html>