【问题标题】:Can Webpack build multiple HTML files from SCSS and Pug?Webpack 可以从 SCSS 和 Pug 构建多个 HTML 文件吗?
【发布时间】:2018-09-05 03:14:52
【问题描述】:

我已经阅读了很多关于 webpack 的教程,但是对于创建 web 应用程序来说似乎更多的是我正在尝试做的事情,所以如果以下内容是不可能的,我不想再浪费时间了。

我正在第三方电子商务系统上创建网站,他们有一个编码模板系统,可用于更改其网站的结构。下面是我将创建的其中一个模板的示例(尽管我需要制作许多类型和变体,而不仅仅是几个)。

我简化这些模板的创建的想法是创建一堆 pug 组件并将它们放在 components/ 目录中。在组件目录之外,我想制作使用组件的更高级别的哈巴狗模板。创建这些后,我将使用 NPM 构建它,并且需要将模板文件转换为 HTML 并放置在 /dist 文件夹中。

用 webpack 很难做到吗?

项目结构:

src/
..components/
....header/
......header1.pug
......header1.scss
..navcustom-template.pug
..customfooter-template.pug
..non-template-specific.scss

一旦建成:

dist/
..navcustom-template.html
..customfooter-template.html
..non-template-specific.css

src/
..components/
....header/
......header1.pug
......header1.scss
..navcustom-template.pug
..customfooter-template.pug
..non-template-specific.scss

模板示例:

<!--
    Section: NavCustom
-->

<style>

    //Template Speific CSS Imports Here

</style>
<script type="text/javascript">

    //Template Speific JS Imports Here

</script>
<header>

    <div class="col-md-4">

        // Social Media Code

    </div>

    <div class="col-md-4">

        // Logo Code

    </div>

    <div class="col-md-4">

        //  Call to Action Code

    </div>

</header>
<nav>

</nav>

【问题讨论】:

    标签: javascript node.js npm webpack pug-loader


    【解决方案1】:

    您可以使用这些包(--save-dev 为所有):

    然后像下面这样配置 Webpack,其中index.js 是一个虚拟文件,如果您还没有条目,则应创建该文件。您需要处理的每个 Pug 模板都写在底部的一个单独的 HtmlWebpackPlugin 对象中。

    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var HtmlWebpackPugPlugin = require('html-webpack-pug-plugin');
    
    module.exports = {
      entry: ['./src/index.js'],
      output: {
        path: __dirname + '/dist',
        publicPath: '/'
      },
      module: {
        rules: [
          {
            test: /\.pug$/,
            use: [
              "raw-loader",
              "pug-html-loader"
            ]
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({
          template: 'src/navcustom-template.pug',
          filename: 'navcustom-template.html'
        }),
        new HtmlWebpackPlugin({
          template: 'src/customfooter-template.pug',
          filename: 'customfooter-template.html'
        }),
        new HtmlWebpackPugPlugin()
      ]
    }
    

    所有 Pug mixin(您的 src/components 文件)都将包含在输出中。此示例已经过测试并且可以正常工作。


    编辑:要动态处理 src 目录中的所有 Pug 文件,请使用以下配置:

    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const HtmlWebpackPugPlugin = require('html-webpack-pug-plugin');
    const fs = require('fs');
    
    let templates = [];
    let dir = 'src';
    let files = fs.readdirSync(dir);
    
    files.forEach(file => {
      if (file.match(/\.pug$/)) {
        let filename = file.substring(0, file.length - 4);
        templates.push(
          new HtmlWebpackPlugin({
            template: dir + '/' + filename + '.pug',
            filename: filename + '.html'
          })
        );
      }
    });
    
    module.exports = {
      entry: ['./src/index.js'],
      output: {
        path: __dirname + '/dist',
        publicPath: '/'
      },
      module: {
        rules: [
          {
            test: /\.pug$/,
            use: [
              "raw-loader",
              "pug-html-loader"
            ]
          }
        ]
      },
      plugins: [
        ...templates,
        new HtmlWebpackPugPlugin()
      ]
    }
    

    这使用fs.readdirSync 来获取目录中的所有 Pug 文件。使用同步版本(而不是 fs.readdir),因为 module.exports 函数将在文件处理之前返回。

    【讨论】:

    • 感谢亚当,这对我来说是一个巨大的帮助,我真的很感激。使用 index.js,您是否认为很难以编程方式将 new HTMLWebpackPlugin({}); 附加到每个模板文件的 webpack.config.js 中,因此它不是硬编码的?我只是不确定在 index.js 中的代码被命中之前配置是否已经被引导;如果这有意义的话。
    • @BlakeBell 我已经更新了我的答案以包含一种动态处理所有 Pug 文件的方法。
    • 谢谢!我没想到将它添加到配置文件中,这很完美。感谢您花时间为我编写一个工作示例。它真的帮助我了解有经验的人如何处理同样的情况。我确实还有一个 SCSS 问题;如果你不介意。在查看 SCSS 上的 tuts 时,他们中的大多数人都在讨论使用外部 SCSS 样式表并将它们构建到外部 CSS 文件中。你知道是否可以在 PUG 模板的样式标签中包含 SCSS,并且一旦处理,它就会成为生成的 HTML 文件中的嵌入 CSS?
    • 据我所知,目前的加载器和插件无法做到这一点。
    • 感谢亚当,我最终找到了看起来很有希望的jstransformer-scss。它允许您从外部文件或 JS 字符串嵌入 SCSS。
    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2017-12-01
    • 2017-01-25
    相关资源
    最近更新 更多