首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >express-handlebars & webpack -无法在多个分页的应用程序中导出部分和助手

express-handlebars & webpack -无法在多个分页的应用程序中导出部分和助手
EN

Stack Overflow用户
提问于 2018-03-11 20:10:38
回答 1查看 1.8K关注 0票数 0

我使用车把来满足我的模板需求。我显然需要在服务器上渲染一些模板来处理构建标准布局(具有页眉、页脚、导航栏和内容面板等)。但我还需要一些客户端模板,以便我可以使用ajax来获取数据,然后将其呈现在模板中。

我选择了node中的express-handlebar模块,因为它会自动编译服务器中的模板和布局。

有几篇文章建议我可以配置webpack将我的模板、部分和助手导出到客户端,这样我就可以重用它们。

所以我创建了如下的webpack配置:

代码语言:javascript
复制
et path = require('path');

module.exports = {
    entry: {
    	login: './public/js/users/login.index.js',
        logout: './public/js/users/logout.index.js',
        newListing: './public/js/listing/newListing.index.js',
        listingCollection: './public/js/listing/newListing.index.js',
        listingDetails: './public/js/listing/listingDetails.index.js',
        userRegistration: './public/js/listing/newListing.index.js',
	},
	output: {
        path: path.join(__dirname, '/public/js/bundles'),
        publicPath: "/public/",
		filename: "[name].bundle.js"
	},
    module: {
        rules: [
            {
                test: /\.handlebars$/,
                include: [
                    path.resolve(__dirname, 'views/listing')
                ],
                loader: "handlebars-loader"
            }
        ]
    }
};

我不想要一个分页的应用程序,所以我已经配置为只导出每个页面捆绑的必要的.js文件。

我负责express-handlebars配置的app.js片段如下:

代码语言:javascript
复制
const exphbs = require('express-handlebars');
const routes = require('./app/routes');
const app = express();
const hbs = exphbs.create({
    defaultLayout: 'main',
    partialsDir: [
        'views/partials',
        'views/partials/common',
        'views/partials/listing/paymentsAndExchange'
    ],
    helpers: {
        isListingType: function (v1, v2, options) {
            if (v1 === v2) {
                return options.fn(this);
            }
        }
    }
});
app.engine('handlebars', hbs.engine);
app.set('view engine', 'handlebars');

我的问题是,这些东西都没有导出到客户端/浏览器(部分和助手-我已经检查了导出的捆绑包,它们肯定是不可用的)。

最终,我放弃了让它工作的尝试,并求助于在客户端重新创建部分,通过编写脚本标记内部的标记,如下所示:

代码语言:javascript
复制
<script id="a-template" type="text/x-handlebars-template">
  {{#unless somecondition}}
    Say this
  {{/unless}}
</script>

然后我引用这个脚本,按照通常的方法编译模板和注入数据等。

But...this是不可能的,因为服务器端模板编译将此脚本解析为页面视图的一部分,而当它呈现在客户端时,我已经丢失了所有的handlebars符号{{}}。

理想情况下,我只希望能够配置express-handlebars / webpack组合来为每个页面导出正确的部分和助手,这样我就可以使用它们了。

很多人肯定都为这个用例而苦苦挣扎,因为车把非常流行,我知道它不应该只在SPA中使用。

如果有人能给我任何建议,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-03-11 22:01:40

对于任何一直在与这类问题作斗争的人来说。我需要正确地配置webpack,以便知道在哪里可以找到我的部分和助手(我认为express-handlebar配置做到了这一点,但这只适用于服务器端)。

代码语言:javascript
复制
let path = require('path');

module.exports = {
    entry: {
    	login: './public/js/users/login.index.js',
        logout: './public/js/users/logout.index.js',
        newListing: './public/js/listing/newListing.index.js',
        listingCollection: './public/js/listing/newListing.index.js',
        listingDetails: './public/js/listing/listingDetails.index.js',
        userRegistration: './public/js/listing/newListing.index.js',
	},
	output: {
        path: path.join(__dirname, '/public/js/bundles'),
        publicPath: "/public/",
		filename: "[name].bundle.js"
	},
    module: {
        loaders: [{
            test: /\.handlebars$/,
            loader:  "handlebars-loader",
            query: {
                partialDirs: [
                    path.join(__dirname, 'views', 'partials')
                ],
                helperDirs: [
                    path.join(__dirname, 'views', 'helpers')
                ]
            }
        }]
    }
};

这使得编译后的部分参数和帮助器在客户端可用,但是我仍然需要在客户端代码中注册它们。

代码语言:javascript
复制
let mangaDetailsPartial = require("../../../views/partials/manga_specific_details.handlebars");
let animeDetailsPartial = require("../../../views/partials/anime_specific_details.handlebars");
let itemSpecificsPartial = require("../../../views/partials/listing/itemSpecifics.handlebars");

Handlebars.registerPartial("manga_specific_details", mangaDetailsPartial);
Handlebars.registerPartial("anime_specific_details", animeDetailsPartial);
Handlebars.registerPartial("item_specifics", itemSpecificsPartial);

现在一切都正常了。在npm页面底部的链接中有一些‘handlebars loader’模块的例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49219838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档