javascript - 使用 webpack 从 dist 文件夹构建后如何加载车把模板?
问题描述
我正在使用 express 和车把构建单页节点应用程序,但我是 node 新手,在使用 webpack 构建车把时卡住了。我的文件夹结构是这样的:https ://imgur.com/JXbIe1S
我正在使用“express-handlebars”(https://github.com/ericf/express-handlebars),我需要在服务器上渲染一些模板来处理构建标准布局(带有页眉、页脚和内容面板)。
视图/布局/main.hbs:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Node with Webpack</title>
</head>
<body>
<main>
<header>
{{> header}}
</header>
{{{body}}}
<footer>
{{> footer}}
</footer>
</main>
</body>
</html>
意见/home.hbs:
Home
<a href="employees">employees</a>
使用 'handlebars-loader' ( https://github.com/pcardune/handlebars-loader ) 部分在 dist 文件夹中正确加载,但 'home.hbs' 没有加载到 'main.hbs' 中,这应该正如我在快速路线中提到的那样,默认加载。
服务器/express.js:
const express = require('express');
const db = require('./database');
const server = express()
const path = require('path')
const router = require('./router');
//WEBPACK CONFIGURATION
const webpack = require('webpack')
const config = require('../../config/webpack.config')
const compiler = webpack(config)
const webpackHotMiddleware = require('webpack-hot-middleware')(
compiler
)
const webpackDevMiddleware = require('webpack-dev-middleware')(
compiler,
config.devServer
)
server.use('/', router) //express route
server.use(webpackDevMiddleware)
server.use(webpackHotMiddleware)
//VIEW ENGINE SETUP
const hbs = require( 'express-handlebars');
server.set('views', path.resolve(__dirname, '../views/'));
server.engine( 'hbs', hbs({
extname: '.hbs',
defaultView: 'main',
layoutsDir: path.resolve(__dirname, '../views/layouts/'),
partialsDir: path.resolve(__dirname, '../views/partials/')
}));
server.set('view engine', 'hbs');
db.connect(() => {
server.listen(3000, () => {
console.log('Server is listenig with mongoose.')
})
})
服务器/路由器.js:
const express = require('express');
const router = express.Router();
const employeeController = require('../controllers/employeeController');
router.get('/', (req, res) => {
console.log('home')
res.render('home', {
layout: 'main'
});
})
router.get('/employees', employeeController.index);
module.exports = router;
配置/webpack.config.js:
const path = require('path')
const HTMLWebpackPlugin = require('html-webpack-plugin')
const webpack = require('webpack')
module.exports = {
mode: 'development',
entry: {
main: ['@babel/polyfill', './src/index.js']
},
output: {
filename: '[name]-bundle-[hash].js',
path: path.resolve(__dirname, '../dist'),
publicPath: '/' //Absolute path
},
devServer: {
contentBase: 'dist',
hot: true,
overlay: true,
stats: {
colors: true
}
},
resolve: {
extensions: ['*', '.js'],
modules: [
path.resolve(__dirname, '..', 'node_modules'),
],
},
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: 'babel-loader'
}
],
exclude: /node_modules/
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader'
}
]
},
{
test: /\.scss|\.sass$/,
loader: ['style-loader', 'css-loader', 'sass-loader'],
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: 'images/[name].[hash:7].[ext]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 1000,
name: 'fonts/[name].[hash:7].[ext]'
}
},
{
test: /\.(webm|mp4)$/,
loader: 'file-loader',
options: {
name: 'videos/[name].[hash:7].[ext]'
}
},
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: {
attrs: ['img:src']
}
}
]
},
{
test: /\.hbs$/,
use: [
{
loader: 'handlebars-loader',
query: {
partialDirs: [
path.join(__dirname, '../src/views', 'partials')
],
}
}
]
}
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new HTMLWebpackPlugin({
template: './src/views/layouts/main.hbs',
title:'Handlebars vew engine'
})
]
}
我想要一个单独的 html 文件,根据路由加载页面。现在在“npm run build”之后,“index.html”文件看起来像这样:
dist/index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Node with Webpack</title>
</head>
<body>
<main>
<header><h3>header</h3></header>
<footer><h3>footer</h3></footer>
</main>
<script type="text/javascript" src="/main-bundle-55e1587718f042cecfec.js"></script></body>
</html>
我不知道我错过了什么,因为我是新手,这是由 webpack 引起的还是我没有得到路由问题,非常感谢任何帮助。
解决方案
推荐阅读
- python - 使用 django ORM 查询对 jsondata-> 字段进行计数聚合
- python - Apache Beam python fails to parse pubmed XML
- angular - ExpressionChangedAfterItHasBeenCheckedError 与共享服务
- sql - 搜索字符串并有条件地忽略连字符
- r - 优化在 R 中的地图上绘制市政/区域数据的速度
- bdd - squish 有没有办法在同一个 BDD 步骤中使用复数和单数?
- python - python bigquery get external table meta data
- matrix - 并行求解线性方程组
- android - 找不到用户 0 的提供者;期望为此权限找到一个有效的 ContentProvider
- angular - angular6:我希望我继承的组件具有父组件的一些属性