@RaDir

Как отрендерить статический HTML в webpack с шаблонизатором Handlebars?

Всем добрый день.

Начал изучать webpack. Решил использовать принципы bem от яндекса. Каким образом реализовать подключение блоков, которые содержат в себе .scss, .hbs, .js (в данном случае только .js и .hbs)?
Структура тестового проекта:
package.json:
{
  "name": "idea.test",
  "version": "1.0.0",
  "description": "Webpack test theme",
  "main": "index.js",
  "scripts": {
    "devw": "npm run clean && webpack -d",
    "devs": "webpack-dev-server",
    "prod": "npm run clean && webpack -p",
    "clean": "rimraf ./www/*"
  },
  "author": "RA.Dir",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.24.0",
    "babel-loader": "^6.4.1",
    "babel-preset-es2015": "^6.24.0",
    "handlebars": "^4.0.6",
    "handlebars-loader": "^1.4.0",
    "html-webpack-plugin": "^2.28.0",
    "lodash": "^4.17.4",
    "rimraf": "^2.6.1",
    "webpack": "^2.3.3",
    "webpack-dev-server": "^2.4.2"
  }
}


webpack.config.js:
var path = require("path");
var HtmlWebpackPlugin = require('html-webpack-plugin');

// Plugins options array - BEGIN
var pluginsOptions = [];
// Plugins options array - END

// HtmlWebpackPlugin options - BEGIN
var titles = {
    home: "iDea | Home",
    shop: "iDea | Shop",
    cart: "iDea | Cart"
};

for (var title in titles) {
    pluginsOptions.push(
        new HtmlWebpackPlugin({
            title: titles[title],
            template: './' + title + '/' + title + '.hbs',
            chunks: [title],
            filename: title + '.html'
        })
    );
};
// HtmlWebpackPlugin options - END

module.exports = {
    //context: __dirname + '/bundles',
    context: path.join(__dirname, '/bundles'),
    entry: {
        home: './home/home.js',
        shop: './shop/shop.js',
        cart: './cart/cart.js'
    },
    output: {
        path: path.resolve(__dirname, "www"),
        filename: '[name].js'
    },

    watch: false,

    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: [/node_modules/],
                use: [{
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015']
                    }
                }]
            },
            {
                test: /\.hbs$/,
                use: ['handlebars-loader']
            }
        ]
    },

    devServer: {
        contentBase: path.join(__dirname, "www"),
        compress: false,
        port: 8080,
        open: true
    },

    plugins: pluginsOptions
};


Директории и файлы:
idea.test (root)
-www (output, public)
-blocks
--logo
---logo.js
---logo.hbs
-bundles
--home
---home.js
---home.hbs
--shop
---shop.js
---shop.hbs
--cart
---cart.js
---cart.hbs

logo.hbs:
<div class="logo">Logo goes here.</div>

home.hbs:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{htmlWebpackPlugin.options.title}}</title>
</head>
<body>
    {{logo}}
    <hr>
    <p>Custom content goes here.</p>
</body>
</html>


Хотелось бы собирать проект по методологии bem. Т. е. подключать блоки, элементы, модификаторы со всеми зависимостями и рендерить бандлы в html.

Подскажите, пожалуйста, как это реализовать на webpack?

Заранее благодарен.
  • Вопрос задан
  • 1900 просмотров
Пригласить эксперта
Ответы на вопрос 1
ozknemoy
@ozknemoy
яваскриптист
Handlebars рендерится либо сервером , либо самим браузером
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы