Webpack详细配置打包原生js项目

2,342 阅读3分钟

Webpack详细配置打包原生js/html/css项目

安装webpack:npm i webpack webpack-cli -D
  • webpack:是webpack工具的核心包
  • webpack-cli:提供了一些在终端中使用的命令
  • -D(--save-dev):表示项目开发期间的依赖,也就是:线上代码中用不到这些包了
创建webpack.config.js 文件
// 引入path模块

const path = require("path");

const htmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {

    // 入口【写绝对路径】
    //多入口
    entry: { 
        './js/index': path.join(__dirname, "./src/utils/index.js"),
        './js/active': path.join(__dirname, "./src/utils/active.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,
        },
        // 出口目录
        path: path.join(__dirname, "./dist"),
        // 出口文件
        filename: "[name].js",
    },

    // 开发模式
    mode: "development",
    
    // 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: [
        // 配置html-webpack-plugin插件;需要实例出一个模板文件
        new htmlWebpackPlugin({
            template: path.join(__dirname, "./src/html/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']
        }),
        
         new htmlWebpackPlugin({
            template: path.join(__dirname, "./src/html/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']
        })
        
    ],
};
项目中 npm init -y 初始化package.json文件 scripts中配置启动
//打包 npm run build
"build": "webpack --mode=development",
//启动  npm run dev   端口号可随意配置   
"dev": "webpack-dev-server --open --port 3001"
打包完成后的目录

image.png