运用webpack构建多页运用

背景

跟着react, vue, angular 三大前端框架在前端范畴职位的稳定,SPA运用正在被运用到越来越多的项目当中。但是在某些特别的运用场景当中,则须要运用到传统的多页运用。在运用webpack举行项目工程化构建时,也须要对应到调解。

与SPA运用区分

在SPA运用中,运用 webpack 构建完成项目以后,会天生一个 html 文件,若干个 js 文件,以及若干个 css 文件。在 html 文件中,会援用一切的 jscss 文件。\
而在多页运用中,运用 webpack 构建完成项目以后,会天生多个 html 文件,多个 js 文件,以及多个 css 文件。在每一个 html 文件中,只会援用该页面所对应的 jscss 文件。

webpack设置

进口设置

多页运用的打包会对应多个进口 js 文件,以及多个 html 模版文件。假定我们的开辟状态下的多页目次是如许:

    |--page1
        |--index.html
        |--index.js
        |--index.less
    |--page2
        |--index.html
        |--index.js
        |--index.less

包含 page1page2 两个页面,以及它们所对应的 jsless 文件。那末在运用 webpack 构建项目时,就有 page1->index.jspage2->index.js 两个进口文件,以及 page1->index.htmlpage2->index.html 两个模版文件。但是在构建项目时,不可能针对每一个页面指定一个进口设置。\
要自动匹配到一切的页面进口及模版文件,有两种要领。\
\
要领一:运用 nodefs 文件体系。来读取父级文件夹下的一切子文件夹。经由过程文件夹称号,来自动匹配到一切的页面。但是,这类体式格局须要坚持父级文件夹下文件的清洁。不然就须要运用详细的推断逻辑来过滤出一切的进口目次。\
\
要领二:经由过程设置文件来设置进口。比方:

    entry: ['page1', 'page2'];

如许便能正确的指定出一切的进口目次。但是却在每次增添页面时,都须要去变动设置文件。\
两种要领个有特性,可依据详细情况挑选。

详细设置

entry

entry的设置须要依据我们获取到的进口数据来轮回增加。

    const entryData = {};
    entry.forEach(function (item) {
        entryData[item] = path.join(__dirname, `../src/pages/${item}/index.js`);
    })
output

output的设置和SPA运用一致,不须要特别设置。

    output: {
        filename: 'public/[name]_[chunkhash:8].js',
        path: path.join(__dirname, `../dist/`),
        publicPath: '/'
    },
HtmlWebpackPlugin

在运用 webpack 构建时。须要运用到 html-webpack-plugin 插件来天生项目模版。关于须要天生多个模版的多页运用来讲,也须要天生多个 html 模版文件。一样的,运用获取到的进口文件数据来轮回增加。

    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const HtmlWebpackPluginData = [];
    entry.forEach(function (item) {
        HtmlWebpackPluginData.push(
            new HtmlWebpackPlugin({
                filename: `${item}.html`,
                template: path.join(__dirname, `../src/pages/${item}/index.html`),
                chunks: [item]
            })
        );
    })      

设置中 chunks 必需设置,假如不设置,会致使每一个模版文件中均引入一切的 jscss 文件。指定为 entry 中的设置 name,则会只引入该进口相干的文件。

设置组合

接下来,就是将前面的entry, output, htmlWebpackPlugin的设置组合起来,除此之外的别的设置,跟SPA运用一致,无需做零丁处置惩罚。组合以下

    modules.exports = {
        entry: { ...entryData },
        output: {
            filename: 'public/[name]_[chunkhash:8].js',
            path: path.join(__dirname, `../dist/`),
            publicPath: '/'
        },
        plugins: [
            ...HtmlWebpackPluginData
        ]
        ...
    }

完全demo可检察多页运用demo

    原文作者:流霜
    原文地址: https://segmentfault.com/a/1190000018805925
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞