首页 > 其他分享 >Webpack实现多页面打包

Webpack实现多页面打包

时间:2023-02-09 12:01:43浏览次数:38  
标签:index const webpack loader Webpack entry 打包 页面


1. 多页面应用(MPA)概念

单页面在开发时会把所有的业务放在一个大的入口里面去,不同的子业务还是同一个URL地址,只不过后面的hash会有所不同。

多页面相对于单页面的区别在于,项目发布上线以后,有多个入口文件,每一次页面跳转的时候,后台服务器都会返回一个新的html文档,这种类型的网站也就是多页面网站,也叫多页应用。

多页面有什么优势呢?主要有以下两点:

1. 多个页面之间是解耦的,利于维护;

2. 多页面对SEO更加友好;

2. 多页面打包基本思路

多页面打包的基本思路在于,每个页面对应一个entry,每个页面对应一个html-webpack-plugin,但这种方式每次在新增或删除页面时需要修改webpack配置,相当麻烦。

Webpack实现多页面打包_css

3. 多页面打包通用方案

1. 多个页面的文件名统一取名index,通过不同的文件夹来区分;

2. 动态获取 entry 和设置 html-webpack-plugin 数量;

Webpack实现多页面打包_html_02

4. 多页面打包实现

4.1. 安装插件;

npm i glob -D

4.2. 配置Webpack文件;

'use strict';
// 引入插件
const glob = require('glob');
const path = require('path');
const webpack = require('webpack');

// 页面打包插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 自动清理插件
const CleanWebpackPlugin = require('clean-webpack-plugin');
// 优化控制台输出
const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');

// 动态计算多页面打包
const setMPA = () => {
const entry = {};
const htmlWebpackPlugins = [];
// 获取本地按规则修改好的文件
const entryFiles = glob.sync(path.join(__dirname, './src/*/index.js'));

Object.keys(entryFiles).map((index) => {

const entryFile = entryFiles[index];

// 'my-project/src/index/index.js'

const match = entryFile.match(/src\/(.*)\/index\.js/);
// 获取页面文件名
const pageName = match && match[1];

entry[pageName] = entryFile;
// 根据本地定义的页面文件数量来定义htmlWebpackPlugin
htmlWebpackPlugins.push(
new HtmlWebpackPlugin({
template: path.join(__dirname, `src/${pageName}/index.html`),
filename: `${pageName}.html`,
chunks: [pageName],
inject: true,
minify: {
html5: true,
collapseWhitespace: true,
preserveLineBreaks: false,
minifyCSS: true,
minifyJS: true,
removeComments: false
}
})
);
});

return {
entry,
htmlWebpackPlugins
}
}

const { entry, htmlWebpackPlugins } = setMPA();

module.exports = {
// 入口文件
entry: entry,
// 输出文件
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].js'
},
// 开发模式
mode: 'development',
module: {
rules: [
{
test: /.js$/,
use: 'babel-loader'
},
{
test: /.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /.less$/,
use: [
'style-loader',
'css-loader',
'less-loader'
]
},
{
test: /.(png|jpg|gif|jpeg)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 10240
}
}
]
},
{
test: /.(woff|woff2|eot|ttf|otf)$/,
use: 'file-loader'
}
]
},
plugins: [
// 热更新插件
new webpack.HotModuleReplacementPlugin(),
// 自动清理插件
new CleanWebpackPlugin(),
// 简化打包控制台输出
new FriendlyErrorsWebpackPlugin()

].concat(htmlWebpackPlugins),

// 热更新相关配置
devServer: {
// 基本目录
contentBase: './dist',
// 热更新
hot: true,
// 只输出报错
stats: 'errors-only'
},
devtool: 'cheap-source-map'
};

标签:index,const,webpack,loader,Webpack,entry,打包,页面
From: https://blog.51cto.com/u_15959833/6046623

相关文章

  • Webpack实现将CSS中的px转换为rem
    由于现在众多移动设备的兴起,各种手机厂商推出了许多不同屏幕尺寸大小的手机型号,前端人员在编写代码时就需要适配各种手机屏幕。传统的样式适配是利用CSS的媒体查询,但是这种......
  • Webpack中给CSS自动添加前辍
    由于现在主流的浏览器有好几种,在编写CSS样式时,需要对各种浏览器作兼容处理,导致在写一些新的CSS样式时需要针对不同的浏览器加上不同的前辍,如果每个前辍都手动来加的话会相当......
  • Webpack提取页面公共资源
    1.利用html-webpack-externals-plugin分离基础库在做React开发时,经常需要引入react和react-dom基础库,这样在打包的时候速度就会比较慢,这种情况下我们可以将这些基础库忽略......
  • Webpack自动清理打包目录
    Webpack在打包的时候,会在指定输出文件夹下面生成打包文件,但是上次打包的文件不会自动清理掉,每次手动删除会比较麻烦,为此,我们需要有一个自动清理的功能。常见的自动清理方式......
  • activity向上/向下一个页面发送数据
    向下一个活动发送数据一般使用bundle(捆)使用方法创建并准备发送数据//这里是上一个页面Intentintent=newIntent(this,class);//新建意图Bundlebundle=ne......
  • 前端页面分页算法 js+php
    实现效果: 实现思路:通过当前选中页码数值和总页码数量,计算返回结果,以数组的形式返回。遍历数组内容,完成页面渲染。 php算法:/***getNavigatePage**@......
  • js实现页面窗口录制
    一、在线demo1、在线demo地址:http://www.lb0125.com/videoRecord.html 注:目前测试发现只有在chrome浏览器里可以使用二、直接上代码<!DOCTYPEhtml><html><head>......
  • C#如何打包EXE程序生成setup安装文件
    项目结束之后,有需要将winForm程序打包成.exe文件提供给用户。这里记录一下打包过程。1:首先获取打包插件,如果你的VS已经安装,忽略此步骤。点击工具->扩展和更新,选择联机,......
  • 关于webpack 开启代理proxy后,接口看不到代理地址的问题。
    今天在项目中发现,  明明在proxy里代理了 接口地址确不是10.10.11.106/front/xxxxxx。这是为啥呢?changeOrigin的修改也是一样,在网络请求中发现host还是没改。这又......
  • [jQuery]判断页面是否滚动到底部
     $(this).scroll(function(){varviewHeight=document.body.clientHeight;//可见高度varcontentHeight=$(".container").get(0).scrollH......