原生js+多个静态页面打包(webpack)

最近做了一个仿阿里的页面,想要试试打包,结果由于html页面比较多,每个html页面引入的css,js各有不同,不能只引入一个index.js打包,因为一个index.js会导致命名冲突,样式覆盖

解决方案:

1.建立多个入口文件,不同的html引入各自的js和css文件即可,如下:

在这里插入图片描述
2.入口这些js文件都要自己创建的,路径可以跟我不一样,但是不要搞错了,如下图,这是我们首页需要引入的css和js,要先写css文件,再写js文件,不要css和js混写在一起,容易出现问题

在这里插入图片描述
3.改变输出文件的文件名,既然我们的输入文件有很多了,那自然打包的输出文件不能全都在一起
在这里插入图片描述

4.最后配置html的时候要注意,需要添加chunk的选项
在这里插入图片描述
注意注意注意:一定要打中括号,不然所有的入口文件都会引入到单独的html页面中,重要的事情说三遍,为了这个中括号,我花了半小时找bug

最后,希望大家顺利打包

源码也贴出来(webpack.config.js的配置)

// webpack.config.js是webpack的配置文件
// resolve是path模块中内置的一个用来拼接绝对路径的方法
const { resolve } = require("path");

// 注意注意注意, 需要引入插件
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { options } = require("less");
/* 
    loader的使用步骤:  1. 下载 2. 配置
    plugins的使用步骤: 1. 下载 2. 引入  3.使用
*/

module.exports = {
    // 入口
    entry:{
       './js/index': "./src/nav/index.js",
       './js/icon': "./src/nav/icon.js",
       './js/resource': "./src/nav/resource.js",
       './js/help': "./src/nav/help.js",
       './js/inbetweening': "./src/nav/inbetweening.js",
       './js/active':'./src/nav/active.js',
       './js/help_other':'./src/nav/help-other.js',
       './js/font':'./src/nav/font.js'
    },
    // 输出
    output:{
        environment: {
            // The environment supports arrow functions ('() => { ... }').
            // 环境支持箭头函数('()=>{…}”)。
            arrowFunction: false,
            // The environment supports BigInt as literal (123n).
            // 该环境支持将BigInt作为文字(123n)。
            bigIntLiteral: false,
            // The environment supports const and let for variable declarations.
            // 环境支持使用const和let声明变量。
            const: false,
            // The environment supports destructuring ('{ a, b } = obj').
            destructuring: false,
            // The environment supports an async import() function to import EcmaScript modules.
            // 该环境支持async import()函数来导入EcmaScript模块。
            dynamicImport: false,
            // The environment supports 'for of' iteration ('for (const x of array) { ... }').
            // 该环境支持'for of' iteration ('for (const x of array){…}”)
            forOf: false,
            // The environment supports ECMAScript Module syntax to import ECMAScript modules (import ... from '...').
            // 该环境支持ECMAScript Module语法来导入ECMAScript模块
            module: false,
        },

        // 输出文件名
        //filename:"built.js",
       
        // 输出路径
        // __dirname是nodejs中的变量,代表当前文件所在目录对应的绝对路径
       //path: resolve(__dirname, "build")
       filename: "[name].js",
       path: resolve(__dirname, "build")
    },

    // loader的配置
    module:{
        rules:[
            // 详细的loader配置

            // 加载css资源文件
            {
                // test属性表示匹配哪些文件,属性取值一般是一个正则表达式
                test:/\.css$/,
                // use表示使用哪些loader进行处理
                use:[
                    // use数组中的loader执行顺序是: 从右到左或从下到下,依次执行的
                    // 创建style标签,将js中的样式资源插入这个style标签中,再把style标签添加到页面head标签中生效
                    "style-loader",
                    // 将css文件变成commonjs模块加载到js文件中,里面内容是样式字符串
                    "css-loader",
                    // 配置postcss自动添加css的兼容前缀
                     "postcss-loader"
                ]
            },



            // 处理CSS中的背景图片资源
            {
                test: /\.(jpg|jpeg|png|gif|bmp|webp)$/,
                type:"asset",
                //解析
                parser: {
                    // 转base64的条件
                    // 图片大小如果小于8kb,就会被base64处理
                    // base64的优点:减少请求数量,减轻服务器压力
                    // base64的缺点:图片体积会更大,文件请求速度更慢
                    dataUrlCondition: {
                        maxSize: 8 * 1024, // 8kb
                    }
                },
                generator:{ 
                    //与output.assetModuleFilename是相同的,这个写法引入的时候也会添加好这个路径
                    // 给图片进行重命名 [hash:10]取图片的hash的前10为,[ext]取文件原来的扩展名
                    filename:'img/[hash:10][ext]',
                    //打包后对资源的引入,文件命名已经有/images了
                    publicPath:'./'
                },
            }, 


            // 专门处理html文件中的img图片(负责引入img,从而能被asset资源模块进行图片资源处理)
            {
                test: /\.(html)$/,
                // 需要安装html-loader 命令: npm i html-loader -D
                loader:'html-loader'
                
            },

            // 处理字体文件资源
            {
                test: /\.(ttf|eot|svg|woff|woff2)$/,
                type:"asset",
                //解析
                parser: {
                    // 转base64的条件
                    // 字体文件大小如果小于1kb,就会被base64处理
                    // base64的优点:减少请求数量,减轻服务器压力
                    // base64的缺点:图片体积会更大,文件请求速度更慢
                    dataUrlCondition: {
                        maxSize: 1 * 1024, // 1kb
                    }
                },
                generator:{ 
                    //与output.assetModuleFilename是相同的,这个写法引入的时候也会添加好这个路径
                    // 给字体文件进行重命名 [hash:10]取字体文件的hash的前10为,[ext]取文件原来的扩展名
                    // [name]表示原来的文件名字
                    filename:"fonts/[name]_[hash:10][ext]",
                    //打包后对资源的引入,文件命名已经有/fonts了
                    publicPath:"./"
                }
            },


            // 处理js文件的loader
            {
                test: /\.js$/,
                // exclude 表示哪些目录中的.js文件不要进行 babel-loader
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: ["@babel/preset-env"]
                    }
                }
            }
            // {
            //     test:/\.(png|svg|jpg|gif)$/,
            //     use: [{
            //         loader:'file-loader',
            //         loader:'url-loader',
            //         options: {
            //             outputPath: './images',
            //             publicPath: './img',
            //         }
            //     }]
            // }

        ]
    },

    // plugins的配置
    plugins:[
        // 详细plugins的配置

        // 使用html-webpack-plugin插件,默认会创建一个空的HTML文件,"自动引入"打包输出的所有资源资源,比如js,css等
        //index
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/index.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "index.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/index']
        }),
        //icon
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/icon.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "icon.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/icon']

        }),
        //resource
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/resource.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "resource.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/resource']

        }),
        //help
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/help.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "help.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/help']
        }),
        //inbetweening
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/inbetweening.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "inbetweening.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/inbetweening']
        }),
        // active
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/active.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "active.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/active']
        }),
        // help-chahua
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/help-other.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "help-other.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/help_other']
        }),
        // font
        new HtmlWebpackPlugin({
            // template可以指定复制 "./src/index.html" 的页面结构 , 并自动引入打包输出的所有资源资源
            // 特别说明,  这个src目录下的index.html是需要我们自己手动创建的
            template:"./src/font.html",

             // 所有JavaScript资源插入到body元素的底部
            inject: "body",

            // filename: 输出模板名称, 默认为index.html
            filename: "font.html",

            // 通过minify属性可以压缩html文件
            minify:{
                // 移除空格
                collapseWhitespace:true,
                // 移出注释
                removeComments:true,
            },

            // 设置favicon.icon文件(其实就是告诉我们,favicon.ico源文件所在路径)
            favicon: "./src/favicon.ico",
            chunks: ['./js/font']
        })
    ],
    // 开发模式
    mode:"development",

    // 生成模式,就可以把打包好的js文件代码压缩成一行
    mode:"production",
    
    // devServer的配置
    devServer: {
        // 项目构建后的路径
        static: {
            directory: resolve(__dirname, 'build'),
        },
        // 启动gzip压缩 可以加速
        compress: true,
        // 端口号
        port: 9000,
        // 自动打开系统默认浏览器
        open:true
    }
}
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 webpack打包多个 HTML 页面。以下是一种常见的配置方法: 1. 首先,安装必要的 webpack 插件: ``` npm install html-webpack-plugin --save-dev ``` 2. 在 webpack.config.js 文件中配置多个页面: ```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { page1: './src/page1.js', page2: './src/page2.js', }, output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), }, plugins: [ new HtmlWebpackPlugin({ filename: 'page1.html', template: './src/page1.html', chunks: ['page1'], }), new HtmlWebpackPlugin({ filename: 'page2.html', template: './src/page2.html', chunks: ['page2'], }), ], }; ``` 在上述示例中,我们配置了两个入口文件(page1.js 和 page2.js),分别对应两个 HTML 页面(page1.html 和 page2.html)。每个 HtmlWebpackPlugin 实例都指定了生成的 HTML 文件名称、模板文件路径以及关联的入口文件。 3. 创建对应的 HTML 模板文件: 在 src 目录下创建 page1.html 和 page2.html 文件,可以在这里编写对应页面的 HTML 结构。 4. 运行打包命令: ``` npx webpack ``` 运行以上命令后,webpack 将会根据配置生成多个 HTML 文件,并将对应的 JavaScript 文件注入到相应的 HTML 页面中。最终打包好的文件将存储在 dist 目录下。 这样,你就可以通过配置多个 HtmlWebpackPlugin 实例来打包多个 HTML 页面。每个 HTML 页面可以关联不同的入口文件,实现灵活的页面打包配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值