webpack5 创建多页面应用配置

简单版webpack创建多页面应用,只要把配置文件复制下来,然后npm安装相应插件,正常是能跑起来了

创建

  1. 初始化
    npm init生成package.json文件
  2. 安装webpack
    npm i -D webpack webpack-cli webpack-dev-server
  3. 创建main.js入口文件和webpack.config.js文件
  4. 安装html-webpack-plugin
    文件打包好之后,我们不可能每次在html文件钟手动引入打包好的js,这时候就需要使用html-webpack-plugin创建html页面,并将打包后的js文件引入到html
  5. scssbootstrap那些按需引入,具体可以直接复制下方的package.json文件,然后直接执行npm i下载相关的插件

配置文件

javascript 复制代码
// webpack.config.js
const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const resolve = dir => path.resolve(__dirname, dir);
module.exports = {
    mode: 'development',
    entry: {	// 入口文件
        main: path.resolve(__dirname, './src/main.js'),
        home: path.resolve(__dirname, './src/js/home.js'),
        aboutus: path.resolve(__dirname, './src/js/aboutus.js')
    },
    output: {	// 出口文件
        path: path.resolve(__dirname, 'dist'),
        filename: "./js/[name].js",
        assetModuleFilename: 'img/[hash][ext][query]'
    },
    devServer: {
        hot: true
    },
    optimization: {
        minimizer: [
            new CssMinimizerPlugin(),
        ],
    },
    module: {
        // webpack 本身只支持处理js, json文件,将其他转换成有效模块
        rules: [
            {
                test: /.html$/,
                loader: 'html-loader',
                options: {
                    esModule: false
                }
            },
            {   // 样式
                test: /\.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    // "style-loader",
                    {
                        loader: 'css-loader',
                        options: {
                            modules: {
                                localIdentName: '[hash:base64:8]',
                            }
                        }
                    }
                ]
            },
            {   // 图片
                test: /\.(png|svg|jpg|jpeg|gif)$/,
                type: 'asset',
                generator: {
                    filename: 'image/[name].[contenthash:8][ext][query]'
                }
            },
            {   // scss
                test: /\.(scss|sass)$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    // "style-loader",
                    "css-loader",
                    {
                        loader: 'postcss-loader',
                        options: {
                            postcssOptions: {
                                plugins: () => [
                                    require('autoprefixer')
                                ]
                            }
                        }
                    },
                    'sass-loader'
                ],
            },
        ],
    },
    resolve: {
        alias: {
            "@": resolve('src')
        }
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new HtmlWebpackPlugin({
            template: path.join(__dirname, './src/pages/index.html'),
            filename: 'index',
            chunks: ['index']
        }),
        new HtmlWebpackPlugin({
            template: path.join(__dirname, "./src/pages/home.html"),
            filename: 'home',
            chunks: ['home']
        }),
        new HtmlWebpackPlugin({
            template: path.join(__dirname, './src/pages/aboutus.html'),
            filename: 'aboutus',
            chunks: ['aboutus']
        }),
        new CleanWebpackPlugin(),
        new MiniCssExtractPlugin({
            filename: 'css/[name].[fullhash].css'
        })
    ]
}
javascript 复制代码
// package.json
{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "dev": "webpack-dev-server --port 3001 --hot --config webpack.config.js",
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "clean-webpack-plugin": "^4.0.0",
    "css-minimizer-webpack-plugin": "^7.0.0",
    "html-loader": "^5.1.0",
    "html-webpack-plugin": "^5.6.0",
    "mini-css-extract-plugin": "^2.9.0",
    "webpack": "^5.93.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.0.4"
  },
  "dependencies": {
    "bootstrap": "^5.3.3",
    "css-loader": "^7.1.2",
    "jquery": "^3.7.1",
    "node-sass": "^9.0.0",
    "postcss-loader": "^8.1.1",
    "sass": "^1.77.8",
    "sass-loader": "^14.2.1",
    "style-loader": "^4.0.0"
  }
}

问题

  1. output配置了一个出口导致报错

    多入口也要多出口,输出的文件也要是多个:
js 复制代码
entry: {
   main: path.resolve(__dirname, './src/main.js'),
   home: path.resolve(__dirname, './src/js/home.js'),
   aboutus: path.resolve(__dirname, './src/js/aboutus.js')
},
output: {
    path: path.resolve(__dirname, 'dist'),
    filename: "./js/[name].js",			// 正确写法
    // filename: './js/bundle.js',		// 错误写法
    assetModuleFilename: 'img/[hash][ext][query]'
},
  1. html-webpack-plugin配置不正确导致页面404

    除了index.html能正常显示外,其他页面都显示404,一开始以为是路由配置或者入口没设置正确,后面发现filename跟其他不一样就试了一下,没想到真是这里的问题
js 复制代码
plugins: [
	new HtmlWebpackPlugin({
	    template: path.join(__dirname, './src/pages/index.html'),
	    filename: 'index',	// 这里必须跟地址一样。如这里写的是 index.html 的话,链接上必须也要带上.html,即 localhost:3001/index.html
	    chunks: ['index']
	}),
]
相关推荐
摇摇奶昔x3 小时前
webpack 学习
前端·学习·webpack
小杨升级打怪中11 小时前
前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
前端·webpack·node.js
Dontla1 天前
Webpack DefinePlugin插件介绍(允许在编译时创建JS全局常量,常量可以在源代码中直接使用)JS环境变量
运维·javascript·webpack
隐含1 天前
webpack打包,把png,jpg等文件按照在src目录结构下的存储方式打包出来。解决同一命名的图片资源在打包之后,重复命名的图片就剩下一个图片了。
前端·webpack·node.js
胡桃夹夹子1 天前
【前端优化】vue2 webpack4项目升级webpack5,大大提升运行速度
前端·javascript·vue.js·webpack·性能优化
GISer_Jing3 天前
编译原理AST&以Babel为例进行解读、Webpack中自定义loader与plugin
前端·webpack·node.js
GISer_Jing3 天前
Webpack中Compiler详解以及自定义loader和plugin详解
前端·webpack·node.js
cdcdhj4 天前
vue用通过npm的webpack打包编译,这样更适合灵活配置的项目
vue.js·webpack·npm
augenstern4165 天前
webpack重构优化
前端·webpack·重构
Dontla5 天前
何时需要import css文件?怎么知道需要导入哪些css文件?为什么webpack不提示CSS导入?(导入css导入规则、css导入规范)
前端·css·webpack