前端进阶-精通webpack构建工具(一)

556 阅读4分钟

"从一无所知,再到精熟技术。"本内容会在所有的打包知识点上会加入源码讲解。

image.png

1.webpack是什么

(a) webpack简介

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

image.png

(b) webpack打包流程概述

如下图所示,index.js为打包入口文件,webpack打包工具会以入口文件为起点,会将入口文件中的所有依赖记录好,形成依赖树状结构图;在index.js文件中,webpack会将jqueryless作为引入形成chunk(代码块);

image.png

形成chunk之后,chunk会被打包成浏览器可以识别的代码,例如less会被打包编译为css,es6以上的js语法会被编译为浏览器可识别语法,等等。打包完之后,文件就会得到输出,这个输出就叫bundle

image.png

3.webpack五个核心概念

(a) Entry

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

(b) Output

输出output指示webpack打包后的资源bundles输出到哪里去,以及如何命名.

(c) Loader

loader让webpack能够去处理那些非javascript文件(webpack自身只能识别js/json)

(d) Plugins

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

(e) Mode

模式mode指示webpack使用响应模式的配置

image.png

4.webpack的限制以及dev/pro环境的区别

1.运行指令:

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

生产环境:webpack ./src/index.js -o ./build/built.js --mode=production
webpack会以 ./src/index.js 为入口文件进行打包,输出到./build/built.js 
整体打包环境是开发环境

2.总结:

  • 1.webpack能处理js/json资源,不能处理css/img等其他资源
  • 2.生产环境和开发环境将es6转译成浏览器识别的模块化
  • 3.生产环境打包后的代码时压缩的

5.webpack loader 详解

loader让webpack能够去处理那些非javascript文件,loader必须要先定义配置文件然后再去配置,如我们想打包样式资源,首先创建webpack.config.js文件(名字随便取).

image.png

入口index.js文件:

//引入样式
import './index.css'
import './index.less'

//load必须要定义配置文件去配置

webpack.config.js文件内容:

/*
    webpack.config.js webpack配置文件

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

    所有构建工具是都基于nodejs平台运行的,模块化默认采用commonjs
*/
//resolve 用来拼接绝对路径的方法
const {resolve} = require('path')

module.exports = {
    //入口起点
    entry:'./src/index.js',
    //输出
    output:{
        //输出文件名称
        filename:'built.js',
        //输出路径
        //__dirname nodejs的变量,代表当前文件的绝对路劲
        path:resolve(__dirname,'build')
    },
    //loader的配置
    module:{
        rules:[
            //详细loader配置
            //不同的文件必须配置不同loader
            {
                //匹配哪些文件
                test:/\.css$/,
                //使用哪些loader进行处理
                use:[
                    //use数组的执行顺序:从右到左
                    //创建style标签,将js中的样式资源插入到html header中
                    'style-loader',
                    //将css文件变成commonjs模块加载到js中,内容为样式字符串
                    'css-loader'
                ]
            },
            {
                //匹配哪些文件
                test:/\.less$/,
                //使用哪些loader进行处理
                use:[
                    //use数组的执行顺序:从右到左
                    //创建style标签,将js中的样式资源插入到html header中
                    'style-loader',
                    //将css文件变成commonjs模块加载到js中,内容为样式字符串
                    'css-loader',
                    //将less文件编译成css文件
                    'less-loader'
                ]
            }
        ]
    },
    plugins:[
        //详细plugins配置
    ],
    //模式
    mode:"development", //开发模式
    // mode:"production" //生产模式
}

6.webpack plugin 详解

插件plugins可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等等;plugins的使用步骤跟loader类似,但是plugins需要先下载然后再引入最后才使用;这里使用了一个打包html资源作为一个案例:

image.png

webpack.config.js文件:

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

module.exports = {
    //入口起点
    entry:'./src/index.js',
    //输出
    output:{
        //输出文件名称
        filename:'built.js',
        //输出路径
        //__dirname nodejs的变量,代表当前文件的绝对路劲
        path:resolve(__dirname,'build')
    },
    //loader的配置
    module:{
        rules:[
            //详细loader配置
        ]
    },
    plugins:[
        //详细plugins配置
        //功能:默认会创建一个空html,自动引入打包输出的所有资源
        new HtmlWebpackPlugin({
            //template::复制 './src/index.html'文件,并自动引入打包输出的所有资源
            template:'./src/index.html'
        })
    ],
    //模式
    mode:"development", //开发模式
    // mode:"production" //生产模式
}