6

是否可以将变量传递给我之前在“html-webpack-plugin”中定义的“pug-html-loader”加载的 .pug 模板?

webpack.config.babel.js

...

{
  test: /\.pug$/,
  use: [
      {
          loader: 'html-loader'
      },
      {
          loader: 'pug-html-loader',
          options: {
              self: true
          }
      }]
}


...

 plugins: [

        new HtmlWebpackPlugin({
            chunks: ['index'],
            filename: 'index.html',
            template: './src/templates/layout.pug',
            title: 'Welcome',
            file: 'index'
        }),

        new HtmlWebpackPlugin({
            chunks: ['index', 'contact'],
            filename: 'contact.html',
            template: './src/templates/layout.pug',
            title: 'Contact us',
            file: 'contact'
        }),

]

layout.html我定义如下:

<!doctype html>
<html class="no-js" lang="en">
<head>
    <meta charset="utf-8">
    <title><%= htmlWebpackPlugin.options.title %></title>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>

<main>
    ${ require('html-loader!../partials/' + htmlWebpackPlugin.options.file + '.html' ) }
</main>

</body>
</html>

我如何使用它来传递所有变量 - 在 Webpack 插件中定义以在我的 PugTemplates 和文件中使用?该应用程序应该是一个创建简单网页的简单过程,它由几个静态页面组成。

4

5 回答 5

2

对于那些对此答案有疑问的人。解决方案是创建一个templateGenerator

例子:

new HTMLWebpackPlugin({
   inject: true,
   templateParameters: paramGenerator(globals), // <--- Here
   template: '/mytemplate.pug',
}),
import { environment } from '../environment';

export function paramGenerator(globals: () => {[key: string]: any}) {
  return (compilation, assets, assetTags, options) => {
    return {
      compilation: compilation,
      webpackConfig: compilation.options,
      htmlWebpackPlugin: {
        tags: assetTags,
        files: assets,
        options: options
      },
      environment,
      ...globals(),
    };
  }
}

Whereglobals是一个函数,它返回一个附加到全局 pug 范围的简单对象。

于 2020-01-03T08:20:35.187 回答
0

我曾尝试templateParameters在 HtmlWebpackPlugin 上使用,它似乎不起作用。

但是在这里找到一个示例https://github.com/jantimon/html-webpack-plugin/tree/main/examples/template-parameters,这是一个将变量传递到ejs模板文件中的示例

然后我在pug-html-loader得到了答案,它可以将数据传递到 pug 文件中,只需在选项中使用“数据”属性,如下所示,我在其中添加了一个“IMG_PREFIX”。

module.exports = {
  rules: [
    loaders: [{
      include: /\.pug/,
      loader: ['pug-html-loader'],
      options: {
        data: {
          IMG_PREFIX: '/'
        }
      }
    }]
  ]
};

然后您可以在 pug 文件中接收变量并使用它

- var imgPrefix = IMG_PREFIX

div.avatar-block
    img.avatar(src=imgPrefix+'xxx.jpg')
于 2021-04-06T15:58:41.533 回答
0

pug-html-loaderoptions参数接受一个data可以传递配置变量的属性。看这里:

使用 pug-html-loader 将数据传递给 pug(无法读取未定义的属性)

{
  loader: 'pug-html-loader',
  options: {
    data: {
      title: 'Hello World'
    }
  }
}
于 2019-09-16T11:52:35.673 回答
0

您可以使用 InterpolateHtmlPlugin 替换 HTML 文件中的 TAG。

plugins: [

        // Makes some environment variables available in index.html.
        // The public URL is available as %PUBLIC_URL% in index.html, e.g.:
        // <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
        // In development, this will be an empty string.
        new InterpolateHtmlPlugin({
            PUBLIC_URL: publicUrl
        }),
...
}

您可以从react-dev-utils npm 包安装插件

const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');

您可以在此处查看完整示例:

HTML 文件https ://github.com/jquintozamora/react-typescript-webpack2-cssModules-postCSS/blob/master/public/index.html#L8

webpack 配置https ://github.com/jquintozamora/react-typescript-webpack2-cssModules-postCSS/blob/master/webpack/webpack.config.dev.js#L9和https://github.com/jquintozamora/react -typescript-webpack2-cssModules-postCSS/blob/master/webpack/webpack.config.dev.js#L80-L82

package.jsonhttps ://github.com/jquintozamora/react-typescript-webpack2-cssModules-postCSS/blob/master/package.json#L55

于 2017-07-27T10:44:35.027 回答
-1

您的代码应该可以工作。

您使用 html-loader 有什么特别的原因吗?

尽管没有什么能阻止您在应用程序中使用多个模板,或者如果它们转换得很好,甚至可以链式加载它们;我们通常使用一个模板引擎。现在,我还没有看 html-loader 源代码,但是从下面提供的链接中发布的评论来看,html-loader 不支持模板参数。它不使用它们,将其向下或向上传递给同一链中的其他加载器。

简而言之,模板参数在 html-loader 中不起作用,这可能是您遇到此问题的原因。

尝试删除 html-loader 并查看是否可以修复它。

https://github.com/jantimon/html-webpack-plugin/issues/1400

于 2021-07-25T10:50:11.157 回答