webpack - 我应该在哪里定义 index.html?
问题描述
我正在 Webpack 上构建一个 SPA,以尝试了解其背后的生态系统和理念。需要明确的是 - 可能有一种简单,hacky的方式可以快速做我想做的事;但我不想知道它 - 我想要“正确”的最佳实践方式。
我设法为 Typescript、Sass 等设置了编译;但我无法理解的一件事是 HTML。来自 Gulp.js,我之前有一个gulpfile.js
将src/index.html
它直接放入dist/
.
但是,如果可能的话,我看到的参考资料表明我不应该自己写index.html
:
https://www.npmjs.com/package/html-webpack-plugin:“您可以让插件为您生成 HTML 文件 [...]”
https://github.com/jaketrent/html-webpack-template:“[此插件] 有望减少您必须
index.html
在 webpack 项目中创建自己的文件的可能性。”
我只是不明白我怎么可能没有预定义的 HTML 结构。我在哪里制作导航栏、页脚和页面内容?
我不得不问这个问题,而不是一个明显的答案,这一事实向我表明我正在以错误的方式解决这个问题。例如,如果我使用 Vue CLI 生成一个 Web 应用程序,我注意到它index.html
根本没有被移入dist/
,而是通过public/index.html
.
将我的 HTML 结构放入我构建的发行版中的正确方法是什么?
解决方案
首先,您应该区分带有 Vue/React 的经典 SPA 和带有 Vue/React 的静态 HTML。SPA 在客户端呈现,这意味着或多或少有一个空的 HTML,所有内容都将由 JavaScript 呈现,因此没有理由编写纯 HTML。
但是您可以使用带有html-webpack-plugin
模板的 HTML 引擎,例如 Twig/Nunjucks。您可以从 中了解到https://darvin.dev
,它是一个 HTML Webpack 样板。
const prod = {
module: {
rules: [{
test: /\.njk$/,
use: [{
loader: 'simple-nunjucks-loader',
options: {
searchPaths: [
`${ROOT_PATH}/${global.inputDirs.src}/${global.inputDirs.templates}/`,
],
assetsPaths: [
`${ROOT_PATH}/${global.inputDirs.src}/${global.inputDirs.assets}/`,
],
filters: {
sizes: `${ROOT_PATH}/webpack/settings/html-njk/config/nunjucks.filters.size.js`,
},
globals: {
darvinEnv: `${ROOT_PATH}/webpack/settings/html-njk/config/nunjucks.global.js`,
}
}
}]
}]
},
plugins: [
// loop here for each html file
new HtmlWebpackPlugin({
filename: targetPath + `.html`,
template: `${global.inputDirs.src}/${global.inputDirs.templates}/${targetPath}.${global.template.extIn}`,
hash: true,
inject: `body`,
cache: true,
chunks: [elementObj.chunkName],
templateParameters: {
darvin: elementObj,
sprite: allIconsInDir
},
minify: {
collapseWhitespace: false,
conservativeCollapse: false,
removeComments: false,
removeRedundantAttributes: false,
removeScriptTypeAttributes: false,
removeStyleLinkTypeAttributes: false,
useShortDoctype: false,
removeAttributeQuotes: false,
removeEmptyAttributes: false,
removeEmptyElements: false,
removeOptionalTags: false
}
});
],
};
推荐阅读
- reactjs - 模拟动作和开玩笑地手动调用它们有什么区别?
- oracle - 不使用函数将 LONG 格式转换为 DATE
- javascript - 输入列中的输入填满后如何显示模态框?
- html - 如何禁用 SVG 滚动?
- python - 需要构建 Keras 子模型
- ruby-on-rails - 需要实现#cache!如果你想使用 Cloudinary::CarrierWave::Storage 作为缓存存储
- wordpress - 有没有可以使用Repeater的Advance Custom Field Free版本的替代品?
- android - 在这里直接下载一个国家的地图(不选择它)
- postgresql - pg_dumpall > alldb.sql 输出 bash: alldb.sql: Permission denied
- javascript - 为什么switch语句没有输出?