webpack打包原理的思考

2020-07-25  本文已影响0人  秘果_li

webpack 是一个前端资源加载/打包的工具。 其根据模块的依赖关系进行静态分析,找到js模块以及一些浏览器不能直接运行的语言(less sass TypeScript等)将这些模块转化打包成合适的格式供浏览器使用


几个关键词

Webpack 的构建流程:

  1. 初始化:启动构建,读取与合并配置参数,加载 Plugin,实例化 Compiler。
  2. 编译:从 Entry 发出,针对每个 Module 串行调用对应的 Loader 去翻译文件内容,再找到该 Module 依赖的 Module,递归地进行编译处理。
  3. 输出:对编译后的 Module 组合成 Chunk,把 Chunk 转换成文件,输出到文件系统。

loader

loader是用来处理各种形式的资源,本质上是一个函数, 接受文件作为参数,返回转化后的结构

一个loader只做一种转换,比如解析less文件,less建立在css基础上,先解析less,再转为css,再插入到head

注意:loader 的调用是链式调用,从后往前,所以先写 style-loader 再写 css-loaderless-loader 在最后,执行时先用less-loader将less文件转化为css,再由 css-loader 解析css文件转成对象,传递给 style-loader 插入到 head
配置如下

module.exports={
    entry:{...},
    outpath:{path:...,filename:...},
    mode:'production',
    module:{
        rules:[
            {
                test:/\.less$/,
                use:[
                'style-loader',
                'css-loader',
                'less-loader'
                ]
            },
        ]
    }
}

Plugin

plugin 可以监听 webpack 处理过程中的关键事件,深度集成进 webpack 的编译器,可以说 plugin 的执行层面是整个构建过程。用户也可以自定义插件。

比如在webpack4中可以使用 mini-css-extract-plugin 插件来分离css文件,此插件为每个包含 CSS 的 JS 文件(打包之后的js文件)创建一个单独的 CSS 文件,并支持 CSS 和 SourceMap 的按需加载

MiniCssExtractPlugin和style-loader对比

MiniCssExtractPlugin 提取 JS 中引入的 CSS 打包到单独文件中,然后通过标签 <link>添加到头部;style-loader 则是通过 <style> 标签直接将 CSS 插入到 DOM 中

注意:此插件适用于没有 style-loader 的生产模式中,如果配置同时使用了style-loaderMiniCssExtractPlugin 的话 style-loader 不会起作用

根据特性可以选择开发模式中使用 style-loader,生产模式中使用 MiniCssExtractPlugin,各取所需

上一篇 下一篇

猜你喜欢

热点阅读