webpack基础入门

webpack定义

webpack 是一种前端资源构建工具,一个静态模块打包器(module bundler)。 在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/…)都会作为模块处理。 它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。

webpack五个核心概念

1.Entry

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

通俗来说,就是告诉webpack应该从项目的哪个文件着手对整个项目进行打包。

2.Output

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

3.Loader

Loader 让 webpack 能 够 去 处 理 那 些 非 JavaScript 文 件 (webpack 自 身 只 理 解 JavaScript,所以loader可以理解为webpack的扩展,不同的文件处理需要不同的loader)

(可以理解为一个翻译官,不同的语言需要不同的翻译官)

4.Plugins

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

5.Mode

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

开发模式和生产模式:

标题 描述 特点
development 会将 DefinePlugin 中 process.env.NODE_ENV 的值设置 为 development。启用 NamedChunksPlugin 和 NamedModulesPlugin。 能让代码本地调试 运行的环境
production 会将 DefinePlugin 中 process.env.NODE_ENV 的值设置 为 production。启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 TerserPlugin。 能让代码优化上线 运行的环境

webpack练手

新建一个文件夹在vscode中打开

初始化pakage.json文件

终端输入npm init,起个名字然后剩下默认回车,生成package.json文件。

安装需要的第三方包

先全局安装webpack和webpack-cli

npm i webpack@4.41.6 webpack-cli -g

webpack是运行在node环境中的,我们需要安装以下两个npm包:

npm i webpack@4.41.6 webpack-cli -D

-D是–save-dev的简写表示添加到开发依赖,webpack里所有东西都是开发依赖。安装完成后会出现node_moudel依赖包,然后就可以写代码了。

编写程序

新建src文件夹与build文件夹

src文件夹用来放置我们编写的代码,build文件夹用来放置webpack打包完成的文件。

webpack使用测试

在src下新建index.js写一点简单的js代码:

function add(x, y) {
    return x+y
}

console.log(add(1, 2));
复制代码

在终端中执行:
webpack ./src/index.js -o ./build/built.js --mode=development

这句命令意思是:

webpack会以./src/index.js为入口文件进行打包,打包后输出到./build/built.js;整体打包环境是开发环境。

(如果是webpack5版本的,命令改为:

webpack --entry ./src/index.js -o ./build/built.js --mode=development )

可以看到build/built.js下多了一个main.js文件。
——————————————————————————————-在终端中执行:
webpack ./src/index.js -o ./build/built.js --mode=production

这句命令意思是:

webpack会以./src/index.js为入口文件进行打包,打包后输出到./build/built.js;整体打包环境是生产环境。
看看这次的main.js就知道,生产环境下会压缩代码。

运行代码

1.node环境运行:

node ./build/built.js/main.js

2.新建一个html页面,src引入built.js/main.js文件,在浏览器控制台查看结果。

结论:

1.webpack能处理js/json资源,不能处理css/img等其他资源
2.生产环境和开发环境将ES6模块化编译成浏览器能识别的模块化
3.生产环境比开发环境多一个压缩js代码
复制代码

webpack打包样式资源

新建一个文件夹在vscode中打开,

因为webpack不能打包样式资源,所以需要借助loader,loader需要借助配置文件,新建一个配置文件,与src文件夹同级:webpack.config.js

webpack配置文件

作用:指示webpack干哪些活,当运行webpack时会加载里面的指令

image.png

配置内容:

const { resolve } = require('path')
module.exports = {
    // webpack配置

    // 入口起点
    entry: './src/index.js',
    // 输出
    output: {
        // 输出文件名
        filename: 'built.js',
        // 输出路径
        // __dirname node.js的变量,代表当前文件根目录的绝对路径
        // resolve 路径拼接
        path: resolve(__dirname, 'build')
    },
    // loader的配置
    module: {
        rules: [
            // 详细的loader配置
            {
              // 匹配哪些文件
              test: /\.css$/,
              // 使用哪些loader进行处理
              use: [
                  // use数组中loader执行顺序:从右到左,从下到上依次执行
                  // 创建style标签,将js中的样式资源插入进去,添加到head中生效
                  'style-loader',
                  // 将css文件变为common.js模块加载到js中,里面是样式字符串
                  'css-loader'

              ]
            }
        ]
    },
    // plugins的配置
    plugins: [
        // 详细的plugins配置
    ],
    // 模式
    mode: 'development' // 可选值: development、production
}
复制代码

在终端中:

npm init

npm i webpack webpack.cli -D

npm i css-loader style-loader
复制代码

运行:

webpack

新建index.html,浏览器运行测试一下:
image.png

打包

webpack

解析less文件

/* 
webpack.config.js:
    webpack的配置文件
    作用:指示webpack干哪些活,当运行webpack时会加载里面的指令

    所有构建工具(webpack就是其中一种)都是基于node.js运行的,模块化默认采用common.js

*/
const { resolve } = require('path')
module.exports = {
    // webpack配置

    // 入口起点
    entry: './src/index.js',
    // 输出
    output: {
        // 输出文件名
        filename: 'built.js',
        // 输出路径
        // __dirname node.js的变量,代表当前文件根目录的绝对路径
        // resolve 路径拼接
        path: resolve(__dirname, 'build')
    },
    // loader的配置
    module: {
        rules: [
            // 详细的loader配置
            {
              // 匹配哪些文件
              test: /\.css$/,
              // 使用哪些loader进行处理
              use: [
                  // use数组中loader执行顺序:从右到左,从下到上依次执行
                  // 创建style标签,将js中的样式资源插入进去,添加到head中生效
                  'style-loader',
                  // 将css文件变为common.js模块加载到js中,里面是样式字符串
                  'css-loader'

              ]
            },
            {
                test: /\.less$/,
                use: [
                    'style-loader',
                    'css-loader',
                    // 将less文件变为css文件,需要安装less-loader@7.3.0
                    'less-loader'
                ]
            }
        ]
    },
    // plugins的配置
    plugins: [
        // 详细的plugins配置
    ],
    // 模式
    mode: 'development' // 可选值: development、production
}
复制代码

测试:
image.png

image.png

webpack打包html资源–使用插件

/*
loader: 1.下载 2.配置使用
plugin: 1.下载 2.引入 3.配置使用 
 */
// 引入html-webpack-plugin插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {resolve} = require('path')

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'built.js',
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
        ]
    },
    // plugins的配置
    plugins: [
        // 详细的plugins配置
        // html-webpack-plugin插件作用:默认创建一个空的html文件,自动引入我们要打包的所有资源
        new HtmlWebpackPlugin()

    ],
    // 模式
    mode: 'development' // 可选值: development、production
}
复制代码

webpack打包图片资源

const {resolve} = require('path')
const HtmlWebpackLoader = require('html-webpack-plugin')
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'built.js',
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.less$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },
            {   // 问题: 默认处理不了html中img图片
                // 处理图片资源的loader
                test: /\.(png|jpg|gif)$/,
                // 使用多个loader用use数组,只有一个loader用loader属性
                // url-loader依赖于file-loader,所以要下载两个 
                loader: 'url-loader',
                options: {
                    // 设置在XKB大小以下的图片使用base64处理
                    // base64优点:减轻服务器压力
                    // base64缺点:会使图片体积变大,所以小图片用base64
                    limit: 12*1024
                }
            }
        ]
    },
    plugins: [
        new HtmlWebpackLoader({
            template: './src/index.html'
        })
    ],
    mode: 'development'
}
复制代码

webpack打包其他资源

其他资源比如字体图标这些…不需要做任何处理,原封不动的输出。

module: {
        rules: [
            {
                // 打包其他资源
                exclude: /\.(css|js|less|html|img)$/,
                loader: 'file-loader'
            },
         }
复制代码

webpack中的自动编译自动打包(webpack-dev-serve)

在webpack.config.js中进行配置:

写在webpack五个核心模块的下面,加一个devServer对象。

webpack-将css单独抽离出一个打包后的css文件

防止打包后的js文件过大。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享