Передать переменные из html-webpack-plugin в шаблон pug

Можно ли передать переменную в шаблон .pug, загруженный «pug-html-loader», который я ранее определил в «html-webpack-plugin»?

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 и файлах? Предполагается, что приложение представляет собой простой процесс создания простых веб-страниц, состоящих из нескольких статических страниц.


person Sascha    schedule 27.07.2017    source источник


Ответы (5)


Для тех, у кого проблемы с этим ответом. Решение состоит в том, чтобы создать 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(),
    };
  }
}

Где globals — это функция, которая возвращает простой объект, прикрепленный к вашей глобальной области мопса.

person Kevin Upton    schedule 03.01.2020

Аргумент pug-html-loader options принимает свойство data, в которое вы можете передать свои переменные конфигурации. Глянь сюда:

Передать данные мопсу с помощью pug -html-loader (невозможно прочитать свойство undefined)

{
  loader: 'pug-html-loader',
  options: {
    data: {
      title: 'Hello World'
    }
  }
}
person Robert    schedule 16.09.2019

Вы можете заменить теги из вашего HTML-файла с помощью InterpolateHtmlPlugin.

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

конфигурация веб-пакета: 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.json: https://github.com/jquintozamora/react-typescript-webpack2-cssModules-postCSS/blob/master/package.json#L55

person José Quinto Zamora    schedule 27.07.2017

Я пытался использовать templateParameters в HtmlWebpackPlugin, похоже, он не работает.

Но найдите образец здесь https://github.com/jantimon/html-webpack-plugin/tree/main/examples/template-parameters, и это пример передачи переменных в файлы шаблонов ejs.

Затем я получил ответ на pug-html-loader, он может передавать данные в файлы мопса, просто используйте свойство «данные» в параметрах, как показано ниже, я добавляю в него «IMG_PREFIX».

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

тогда вы можете получить переменную в файле мопса и использовать ее - var imgPrefix = IMG_PREFIX

div.avatar-block
  img.avatar(src=imgPrefix+'xxx.jpg')
person Soar Lin    schedule 06.04.2021

ваш код должен работать.

Есть ли какая-то конкретная причина, по которой вы используете html-loader?

Хотя ничто не мешает вам использовать несколько шаблонов в вашем приложении или даже загружать их по цепочке, если они хорошо конвертируются; мы обычно используем один механизм шаблонов. Теперь я не смотрел исходный код html-загрузчика, но из комментария, опубликованного по ссылке, приведенной ниже, html-загрузчик не поддерживает параметры шаблона. Он не использует их, не передает их другим загрузчикам в той же цепочке.

Короче говоря, параметры шаблона не работают в html-загрузчике, и это может быть причиной этой проблемы.

Попробуйте удалить html-загрузчик и посмотрите, исправит ли это проблему.

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

person Mr. Kone    schedule 25.07.2021
comment
Пожалуйста, предоставьте подробное объяснение вашего ответа, чтобы следующий пользователь лучше понял ваш ответ. Кроме того, обеспечьте базовое покрытие содержимого вашей ссылки на случай, если она перестанет работать в будущем. - person Elydasian; 26.07.2021