模块打包工具Webpack之模块加载器

280 阅读3分钟

模块打包工具

为什么使用模块打包工具?

  • ES Modules存在环境兼容问题
  • 模块文件过多,网络请求频繁
  • 所有的前端资源都需要模块化
    • 新特性代码编译

      编译代码.png

    • 模块化JavaScript打包

      模块打包.png

    • 多类型模块支持

      多类型模块支持.png

Webpack

模块加载器(Loader)

代码拆分(code Splitting)

资源模块(Asset Module)

Webpack快速上手

初始化项目,生成package.json

  • yarn init --yes

安装webpack

  • yarn add webpack webpack-cli --dev

安装webpack4出现问题

  • 在webpack 3中,webpack本身和它的CLI以前都是在同一个包中,但在第4版中,他们已经将两者分开来更好地管理它们。
  • 解决方法:尝试全局安装npm install -g webpack-cli
  • 执行webpack -v成功执行 不再提示安装webpack-cli

查看webpack版本

  • yarn webpack --version

创建入口文件 main.js

  • 将多个模块导入到这一个模块中

打包js代码

  • yarn webpack

webpack配置文件(webpack.config.js)

项目根目录下新建webpack.config.js文件

  • 默认输出:dist / main.js

自定义输出和输入

  • 代码展示
// webpack.config.js文件-----------------
const path = require('path');
module.exports = {
    // 需要打包的入口文件
    // 可以写相对路径
    entry: './src/main.js',
    // 需要输出的指定文件夹和文件名
    output: {
        filename:"bundle.js",
        // 只能写绝对路径
        path:path.join(__dirname,'output')
    }
}

注意

  • 打包的入口文件,可以使用相对路径.
  • 导出的path只能写绝对路径.

webpack工作模式(3种)

命令行举例: yarn webpack --mode none

  • 传入--mode的参数,有三个取值
    • production 生产模式
    • development 开发模式,wepack会自动优化打包的速度.
    • none webpack 运行最原始的打包,不会做任何的优化.
  • 这三种模式的差异,可以在webpack.js.org/configurati…

配置文件中设置工作模式

const path = require('path');
module.exports = {
    // 添加工作模式,那么命令行中只需要输入: yarn webpack
    mode:'development',
    // 需要打包的入口文件
    // 可以写相对路径
    entry: './src/main.js',
    // 需要输出的指定文件夹和文件名
    output: {
        filename:"bundle.js",
        // 只能写绝对路径
        path:path.join(__dirname,'output')
    }
}

webpack打包结果运行原理

  • 打包到一个文件中,还要保持每个模块有自己单独的作用域.
  • 将多种文件打包到一个文件中去,并加密

小技巧

  • ctrl+k -> ctrl+0 折叠所有的代码
  • webpack -w 实时监听,打包新的文件

webpack资源模块加载

  • Loader是Webpack的核心特性
  • 借助于Loader就可以加载任何类型的资源

打包css文件

  • 执行yarn webpack 会报错,因为默认认为是js文件
  • 不同的loader处理不同的文件

1.安装loader模块加载器

  • 处理css,执行: yarn add css-loader --dev

2.修改配置文件中的module

  • 修改配置文件(添加module)
const path = require('path');
module.exports = {
    // 添加工作模式,那么命令行中只需要输入: yarn webpack
    mode:'development',
    // 需要打包的入口文件
    // 可以写相对路径
    entry: './src/main.css',
    // 需要输出的指定文件夹和文件名
    output: {
        filename:"bundle.css",
        // 只能写绝对路径
        path:path.join(__dirname,'output')
    },
    // 新添加的
    module: {
        rules: [
            {
                //指定匹配什么后缀的文件,使用正则表达式
                test:/.css$/,
                //指定:要使用的loader
                use:'css-loader'
            }
        ]
    }
}

3.安装另一个loader

  • 执行命令:yarn webpack,打包成功,但是在浏览器,发现页面并没有效果
  • 还需要添加执行loader , yarn add style-loader --dev

4.配置文件中添加需要使用的加载器名称

  • 修改配置文件,给module中的rules中的use添加
// 注意loader是从后往前执行的,因此,一定要将css写在后面
use:[
    'style-loader',
    'css-loader'
]
  • 总结:样式是通过head的style标签运行的
  • css-loader是将css装载到javascript
  • style-loader是让javascript认识css

webpack导入资源模块

  • webpack的入口文件,一般都是js文件
  • 在入口文件中,导入想要打包的资源(例如:css等)

js驱动整个前端应用

  • 逻辑合理,JS确实需要这些资源文件。
  • 确保上线资源不缺失,都是必要的。

Webpack文件资源加载器

  • 大多数加载器,都是像css-loader那样,将资源模块转换为js代码的实现方式工作。

File-loader

文件加载器.png

步骤(07_file-loader)

  • 1.安装File-loader文件加载器: yarn add url-loader --dev
  • 2.入口函数中引入资源
  • 3.执行wepack命令
  • 4.在浏览器查看效果
    • 如果没有效果,打开控制台查看错误
    • 发现图片的路径不对
  • 源代码
//-----------main.js入口文件-----------
// 引用的是图片的地址
import icon from './编译代码.png';

var img = new Image();
img.src = icon;

document.body.append(img);

// ---------webpack-config.js-----------
// webpack配置文件
const path = require('path');

module.exports = {
    mode:'none',
    entry:'./img/main.js',
    output:{
        path:path.join(__dirname,'dist'),
        filename:'bundle.js',
        publicPath:'dist/'
    },
    module:{
        rules:[
            {
                test:/.png$/,
                use:[
                    'file-loader'
                ]
            }
        ]
    }
}

图片路径不对的原因

  • webpack默认是将打包后的文件放置在项目的根目录下面
  • 但是此时,我们修改了配置文件中的path路径,将其放在了dist目录下,因此找不到
  • 那么此时,只需要修改配置文件中publicPath
    • 注意:千万不要忘记最后的**/**,因为打包后的js文件中,是将图片的路径直接拼接在后面的。
  • 再次运行,就可以成功显示了。

Webpack URL加载器

Webpack 常见加载器分类

编译转换加载器

  • css-loader: 将css代码转化成为bundle.js中的一个模块,从而实现通过js运行css。

文件操作类型加载器

  • file-loader: 会把就加载到的资源模块,拷贝到输出的目录,同时将文件的路径向外导出。

代码检查类型加载器

  • 目的:统一代码风格,提高代码质量。
  • eslint-loader