webpack-扫盲

63 阅读2分钟

image.png

webpack是什么

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

webpack五个核心概念

Entry

用来指定webpack的打包入口

Output

Output 用来告诉webpack如何将编译后文件输出到磁盘,输出到哪

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
};

Loaders

webpack开箱即用只支持js和json两种文件类型,通过Loaders去支持其他文件类型并且把它们转化为有效的模块,并添加到依赖图中; Loaders本身是一个函数,接口源文件作为参数,返回转换后的结果;

在webpack配置中,loader有两个属性:

1. test 属性, 识别哪些文件会被转换
2. use 属性, 定义在转换时应该使用哪个loader
// webpack.config.js
module.exports = {
 output: {
   filename: 'my-first-webpack.bundle.js',
 },
 module: {
   rules: [{ test: /.txt$/, use: 'raw-loader' }],
 },
};

Plugin

loader用于转换某些类型的模块,而插件则可以用于执行范围更广的任务,例如:打包优化、资源管理压缩、环境变量注入等

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // 用于访问内置插件

module.exports = {
 module: {
   rules: [{ test: /.txt$/, use: 'raw-loader' }],
 },
 plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};

Mode

Mode用来指定当前的构建环境是:production、development还是none;设置mode可以使用webpack内置的函数,默认值为production

资源解析

解析ES6

解析es6需要借助于babel-loader,同时也需要配置.babelrc文件

首先,在项目根目录下创建.babelrc文件

// .babelrc
{
    "presets": ["@babel/preset-env"],
    "plugins": []
}

@bebel/preset-env的作用是通过其包含的插件将一些高级特性如ES6语法解析成ES5代码 其次,在webpack.config.js文件中配置:

// webpack.config.js
const path = require('path')

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js'
    },
    mode: 'production',
    module: {
        rules: [
            {
                test: /.js$/,
                use: 'babel-loader'
            }
        ]
    }
}

解析css、less、sass

解析css

// webpack.config.js
const path = require('path')

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js'
    },
    mode: 'production',
    module: {
        rules: [
            {
                test: /.js$/,
                use: 'babel-loader'
            }, {
                test: /.css$/,
                use: ["style-loader", "css-loader"]
            }
        ]
    }
}

需要注意的是: 因为loader加载是从右往左的,所以在配置规则的时候,先加载css-loader,然后加载style-loader

解析less

// webpack.config.js
const path = require('path')

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js'
    },
    mode: 'production',
    module: {
        rules: [
            {
                test: /.js$/,
                use: 'babel-loader'
            }, 
            {
                test: /.css$/,
                use: ["style-loader", "css-loader"]
            },
            {
                test: /.less$/,
                use: ["style-loader", "css-loader", "less-loader"]
            }
        ]
    }
}

解析sass

同less,只需要将less-loader修改成sass-loader即可,同时将test修改成/.sass$/

解析图片和字体资源

解析图片需要使用到file-loader,配置如下:

const path = require('path')

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js'
    },
    mode: 'production',
    module: {
        rules: [
            {
                test: /.js$/,
                use: 'babel-loader'
            },
            {
                test: /.css$/,
                use: ["style-loader", "css-loader"]
            },
            {
                test: /.less$/,
                use: ["style-loader", "css-loader", 'less-loader']
            },
            {
                test: /.(png|gif|jpg|jpeg)$/,
                use: "file-loader"
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/,
                use: "file-loader"
            }
        ]
    }
}

以上关于webpack扫盲部分就告一段落了,最后附上源代码