【webpack20210627-0】webpack 资源打包详解

webpack 资源打包详解

一、webpack 五大核心概念

1.1、Entry

入口(Entry)指示Webpack以哪个文件为入口起点开始打包,分析构建内部依赖图。

1.2、Output

输出(Output)指示Webpack打包后的资源bundles输出到哪里去,以及如何命名。

1.3、Loader

Loaderi Webpack能够去处理那些非Javascript文件(webpack 自身只理解JavaScript)

1.4、Plugins

插件(Plugins)可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等。

1.5、Mode

模式(Mode)指示Webpack使用相应模式的配置。

选项 描述 特点
development 会将process.env.NODEENV的值设为development。 启用NamedchunksPlugin和NamedModulesPlugin。 能让代码本地调试运行的环境
production 会将process.env.NODE_ENV的值设为production 启用FlagDependencyUsagePlugin,FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin,SideEffectsFlagPlugin和UglifysPlugin. 能让代码优化上线运行的环境

二、webpack的初体验

1.1、初始化环境

> npm init

1.2、安装 webpack

//  全局安装
//  npm i  webpack webpack-cli -g 
//  本地安装
> npm i  webpack webpack-cli -D

1.3、运行指令

1.3.1、创建入口js文件

// index. js: webpack入口起点文件
// 路径: ./src/index.js
function add(x, y){
    return x + y;
}
console.log(add(1, 2));

1.3.2、开发环境运行

// 开发环境
// webpack会以./src/index.js为入口文件开始打包,打包后输出到./build/built.js整体打包环境,是开发环境
> webpack ./src/index.js -o./build/built.js--mode-development

1.3.3、生产环境运行

// 生产环境
// webpack会以./src/index.js为入口文件开始打包,打包后输出到./build/built.js整体打包环境,是生产环境
> webpack ./src/index.js -o ./build/built.js--mode-production
  • 结论:

    1、 webpack能处理js/json资源,不能处理css/img等其他资源

    2、生产环境和开发环境将ES6模块化编译成浏览器能识别的模块化

    3、生产环境比开发环境多一个压缩js代码

三、打包样式资源

3.1、创建html文件、 css 文件或 less 文件

<!-- 文件路径 ./src/index.htmnl -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>webpack 学习</title>
</head>
<body>
    <h1 id="title">hello webpack</h1>
</body>
</html>
/* 路径: ./src/index.css */

html, body{
    margin: 0;
    padding: 0;
    height: 100%;
    background-color: Dpink;
}
// 路径: ./src/index.less

#title{
    color: #fff;
}

3.2、引入 css 文件或 less 文件

在 index.js 文件中引入 css 文件

// index. js: webpack入口起点文件
// 路径: ./src/index.js


// 引入样式资源
import ../index.css';
import ../index.less';

//……

3.3、配置 webpack配置文件

// webpack.config.js webpack的配置文件 
// 作用:指示webpack干哪些活(当你运行webpack指令时,会加载里面的配置)所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs.
// loader: 1.下载 2.使用(配置loader)
// plugins: 1.下载2. 引入 3.使用

// 路径: ./webpack.config.js


// resolve用来拼接绝对路径的方法
const { resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
        // webpack配置
        // 入口起点文件
        entry: './src/index.js',
        // 输出
        output: {
            //输出文件名
            filename: 'built.js',
            //输出路径
            //__dirname nodejs的变量,代表当前文件的目录绝对路径
            path: resolve(__dirname, 'build')
        },
        // loader的配置
        module: {
            rules: [
                //打包 css 文件的详细loader配置
                {
                    //匹配哪些文件
                    test: /\.css$/,
                    //使用哪些loader进行处理
                    use: [
                        // use数组中loader执行顺序:从右到左,从下到上依次执行
                        //创建style标签,将js中的样式资源插入进行,添加到head中生效
                        'style-loader',
                        //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                        'css-loader'
                    ]
                },
                //打包less 文件的详细loader配置
                {
                    //匹配哪些文件
                    test: /\.less$/,
                    //使用哪些loader进行处理
                    use: [
                        // use数组中loader执行顺序:从右到左,从下到上依次执行
                        //创建style标签,将js中的样式资源插入进行,添加到head中生效
                        'style-loader',
                        //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                        'css-loader',
                        //将less文件编译成css文件
                        //需要下载less-loader和less
                        'less-loader'
                    ]
                }
            ]
        },
        // plugins的配置
        plugins: [
            //详细的plugins配置
            //html-webpack-plugin
            //功能:默认公创建一个空的HTML, 自动引入打包输出的所有资源(JS/CSS)
            //需求:需要有结构的HTML文件
            new HtmlWebpackPlugin({
                //复制../src/index.html'文件,并自动引入打包输出的所有资源(JS/CS5)
                template: './src/index.html'
            })
        ],
        //模式  development  开发环境,production 生产环境
        mode: 'development',
        // mode: 'production'
    }

3.4、打包 css 文件的核心配置

// webpack.config.js webpack的配置文件
// 路径: ./webpack.config.js

//……

// loader的配置
    module: {
        rules: [
            //打包 css 文件的详细loader配置
            {
                //匹配哪些文件
                test: /\.css$/,
                //使用哪些loader进行处理
                use: [
                    // use数组中loader执行顺序:从右到左,从下到上依次执行
                    //创建style标签,将js中的样式资源插入进行,添加到head中生效
                    'style-loader',
                    //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                    'css-loader'
                ]
            },
        ]
    },

//……

3.5、打包 less 文件的核心配置

// webpack.config.js webpack的配置文件
// 路径: ./webpack.config.js

//……

// loader的配置
    module: {
        rules: [
            //打包less 文件的详细loader配置
            {
                //匹配哪些文件
                test: /\.less$/,
                //使用哪些loader进行处理
                use: [
                    // use数组中loader执行顺序:从右到左,从下到上依次执行
                    //创建style标签,将js中的样式资源插入进行,添加到head中生效
                    'style-loader',
                    //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                    'css-loader',
                    //将less文件编译成css文件
                    //需要下载less-loader和less
                    'less-loader'
                ]
            }
        ]
    },

//……

3.6、安装对应 loader

// 安装 style-loader和css-loader
> npm i css-loader style-loader -D
// 安装 less-loader 和 less
> npm i less less-loader -D

3.7、运行

> webpack
  • 结论: > 1、打包css 文件样式资源主要使用 style-loadercss-loader
    > 2、打包less 文件样式资源主要使用 style-loadercss-loaderless-loader
    > 3、多个 loader 时执行顺序是从右往左,从下往上。
    > 4、样式文件在处理后会以字符串的形式整合输出到 built.js文件当中。

四、打包 html 资源

4.1、打包 html文件的核心配置

// webpack.config.js webpack的配置文件
// 路径: ./webpack.config.js

//……

const HtmlWebpackPlugin = require('html-webpack-plugin');

//……

    // plugins的配置
    plugins: [
        //详细的plugins配置
        //html-webpack-plugin
        //功能:默认公创建一个空的HTML, 自动引入打包输出的所有资源(JS/CSS)
        //需求:需要有结构的HTML文件
        new HtmlWebpackPlugin({
            //复制../src/index.html'文件,并自动引入打包输出的所有资源(JS/CS5)
            template: './src/index.html'
        })
    ],

//……

4.2、安装对应插件

//安装 html-webpack-plugin 插件
> npm i html-webpack-plugin -D

4.3、运行

> webpack
  • 结论: > 1、打包 html 文件需要使用html-webpack-plugin插件
    > 2、html-webpack-plugin需要复制一个有结构的HTML文件,否则默认会创建一个空的HTML
    > 3、html-webpack-plugin会自动在打包的html文件中引入打包输出的所有资源(JS/CSS)

五、打包图片资源

5.1、打包图片的核心配置

// loader的配置
    module: {
        rules: [
            //打包 css 文件的详细loader配置
            {
                //匹配哪些文件
                test: /\.css$/,
                //使用哪些loader进行处理
                use: [
                    // use数组中loader执行顺序:从右到左,从下到上依次执行
                    //创建style标签,将js中的样式资源插入进行,添加到head中生效
                    'style-loader',
                    //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                    'css-loader'
                ]
            },
            //打包less 文件的详细loader配置
            {
                //匹配哪些文件
                test: /\.less$/,
                //使用哪些loader进行处理
                use: [
                    // use数组中loader执行顺序:从右到左,从下到上依次执行
                    //创建style标签,将js中的样式资源插入进行,添加到head中生效
                    'style-loader',
                    //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                    'css-loader',
                    //将less文件编译成css文件
                    //需要下载less-loader和less
                    'less-loader'
                ]
            },
            {
                //问题:默认处理不了 html 中的 img 图片
                //处理图片资源
                test: /\.(jpg|png|gif)$/,
                //使用一个loader
                //下载url-loader file-loader
                loader: 'url-loader',
                options: {
                    //图片大小小于8kb,就会被base64处理
                    //优点:减少请求数量(减轻服务器压力)
                    //缺点:图片体积会更大(文件请求速度更慢)
                    limit: 8 * 1024,
                    //问题:因为url-loader默认使用es6模块化解析, 而html-loader默认引入图片是commonjs
                    //解析时会出问题: [object Module]
                    //解决:关闭url-loader的es6模块化,使用commonjs解析
                    esModule: false,
                    // 给图片进行重命名
                    //[hash:10]取图片的hash的前10位
                    // [ext]取文件原来扩展名
                    name: '[hash:10].[ext]'
                }
            },
            {
                test: /\.html$/,
                //处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
                loader: 'html-loader',
                options:
                {
                    //默认情况下,生成使用ES块语法的Js模块
                    //问题:生成的图片显示错误
                    //解决: esModule改为false
                    esModule: false,
                },
            }
        ]
    },

5.2、样式文件中使用图片(less场景,css 类似)

#box1{
    width: 100px;
    height: 100px;
    background-image: url('./logo1.png');
    background-repeat: no-repeat;
    background-size: 100% 100%;
}

#box2{
    width: 200px;
    height: 200px;
    background-image: url('./logo2.png');
    background-repeat: no-repeat;
    background-size: 100% 100%;
}

#box3{
    width: 300px;
    height: 300px;
    background-image: url('./logo3.png');
    background-repeat: no-repeat;
    background-size: 100% 100%;
}

5.2.1、样式文件中使用图片时用到的配置

// loader的配置
    module: {
        rules: [
            //打包 css 文件的详细loader配置
            {
                //匹配哪些文件
                test: /\.css$/,
                //使用哪些loader进行处理
                use: [
                    // use数组中loader执行顺序:从右到左,从下到上依次执行
                    //创建style标签,将js中的样式资源插入进行,添加到head中生效
                    'style-loader',
                    //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                    'css-loader'
                ]
            },
            //打包less 文件的详细loader配置
            {
                //匹配哪些文件
                test: /\.less$/,
                //使用哪些loader进行处理
                use: [
                    // use数组中loader执行顺序:从右到左,从下到上依次执行
                    //创建style标签,将js中的样式资源插入进行,添加到head中生效
                    'style-loader',
                    //将css文件变成commonjs模块加载js中,里面内容是样式字符串
                    'css-loader',
                    //将less文件编译成css文件
                    //需要下载less-loader和less
                    'less-loader'
                ]
            },
            {
                //问题:默认处理不了 html 中的 img 图片
                //处理图片资源
                test: /\.(jpg|png|gif)$/,
                //使用一个loader
                //下载url-loader file-loader
                loader: 'url-loader',
                options: {
                    //图片大小小于8kb,就会被base64处理
                    //优点:减少请求数量(减轻服务器压力)
                    //缺点:图片体积会更大(文件请求速度更慢)
                    limit: 8 * 1024,
                    //问题:因为url-loader默认使用es6模块化解析, 而html-loader默认引入图片是commonjs
                    //解析时会出问题: [object Module]
                    //解决:关闭url-loader的es6模块化,使用commonjs解析
                    esModule: false,
                    // 给图片进行重命名
                    //[hash:10]取图片的hash的前10位
                    // [ext]取文件原来扩展名
                    name: '[hash:10].[ext]'
                }
            }
    
        ]
    },

5.2.2、安装对应 loader

//安装 url-loader 和 file-loader 
> npm i url-loader file-loader  -D
  • 结论

1、先配置 css 或 less 文件的打包配置
2、在配置 图片打包配置,配置使用 url-loader 和 file-loader
3、为了兼容 html 中的图片打包配置需要关闭url-loader的es6模块化,使用commonjs解析防止解析完后出现解析时会出问题: [object Module]

5.3、html中使用图片

<!-- 文件路径 ./src/index.htmnl -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>webpack 学习</title>
</head>
<body>
    <h1 id="title">hello webpack</h1>
    <div id="box1"></div>
    <div id="box2"></div>
    <div id="box3"></div>
    <img src="./logo2.png" alt="html中引用图片" />
</body>
</html>

5.3.1、html中使用图片时用到的配置

// loader的配置
    module: {
        rules: [
            {
                test: /\.html$/,
                //处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
                loader: 'html-loader',
                options:
                {
                    //默认情况下,生成使用ES块语法的Js模块
                    //问题:生成的图片显示错误
                    //解决: esModule改为false
                    esModule: false,
                },
            }
        ]
    },

5.3.2、安装对应 loader

//在安装 url-loader 和 file-loader 的基础上安装 html-loader
> npm i html-loader -D
  • 结论

1、配置图片打包配置,配置使用 url-loader 、file-loader 和 html-loader
3、为了兼容 html 中的图片打包配置需要关闭html-loader的es6模块化,防止生成的图片显示错误

5.4、自定义打包图片名称

// 注意loader中以下的配置
    ……
         // 给图片进行重命名
         //[hash:10]取图片的hash的前10位
         // [ext]取文件原来扩展名
         name: '[hash:10].[ext]'
    ……

项目中使用 logo1.png、logo2.png、logo3.png 等3张图片

最终显示效果如下:

image-20210627221608989

六、打包其他资源

posted @ 2021-06-27 22:34  Eword  阅读(190)  评论(0编辑  收藏  举报