zoukankan      html  css  js  c++  java
  • webpack核心概念-入口entry

    前言

    该笔记是基于居玉皓老师的《Webpack实战:入门、进阶与调优》与webpack官方文档的内容记录的

    入口起点

    资源处理流程

    在一切流程的最开始,我们需要指定一个或多个入口(entry),也就是告诉Webpack具体从源码目录下的哪个文件开始打包。

    如果把工程中各个模块的依赖关系当作一棵树,那么入口就是这棵依赖树的根

    ff76ccfbc2839d8803123ecef15ddaf.png

    这些存在依赖关系的模块会在打包时被封装为一个chunk。那chunk是什么呢?

    chunk字面的意思是代码块,在Webpack中可以理解成被抽象和包装过后的一些模块。它就像一个装着很多文件的文件袋,里面的文件就是各个模块,Webpack在外面加了一层包裹,从而形成了chunk:

    001649b831e29eb431f6e8af358d939.png

    根据具体配置不同,一个工程打包时可能会产生一个或多个chunk。

    工程中可以定义多个入口,每一个入口都会产生一个结果资源

    比如我们工程中有两个入口src/index.jssrc/lib.js,在一般情形下会打包生成dist/index.jsdist/lib.js

    d2ab1f6aac20cf96356a0558583785d.png

    在一些特殊情况下,一个入口也可能产生多个chunk并最终生成多个bundle

    单个入口文件

    用法:entry:string|Array<string>

    1、简写语法

    webpack.config.js

    //由于是单个,所以可以简写成:
    module.exports = {
      entry: './main.js'
    };
    

    上面的入口配置写法其实是下面的简写

    module.exports = {
      entry: {
        main: './main.js'
      }
    };
    

    2、数组语法

    module.exports = {
      entry: {
        main:['./main.js','./main2.js']
      }
    };
    

    传入一个数组的作用是将多个资源预先合并,在打包时Webpack会将数组中的最后一个元素作为实际的入口路径

    在使用字符串或数组定义单入口时,并没有办法更改chunk name,只能为默认的“main”。

    多个入口文件

    用法:entry: {[entryChunkName: string]: string|Array}

    对象语法

    module.exports = {
      entry: {
        app: './src/app.js',
        vendors: './src/vendors.js'
      }
    };
    

    这会比较繁琐。然而这是应用程序中定义入口的最可扩展的方式。

    “可扩展的 webpack 配置”:可重用并且可以与其他配置组合使用。这是一种流行的技术,用于将关注点从环境(environment)、构建目标(build target)、运行时(runtime)中分离。然后使用专门的工具(如 webpack-merge)将它们合并。

    应用场景

    1、单页应用

    无论是框架、库,还是各个页面的模块,都由app.js单一的入口进行引用。这样做的好处是只会产生一个JS文件,依赖关系清晰

    module.exports = {
      entry: './src/app.js'
    };
    

    这种做法也有弊端,即所有模块都打包到一起,当应用的规模上升到一定程度之后会导致产生的资源体积过大,降低用户的页面渲染速度

    在Webpack默认配置中,当一个bundle大于250kB时(压缩前)会认为这个bundle已经过大了,在打包时会发生警告,如图:

    7cd4894c640a51e80385a65ac753472.png

    2、分离第三方库(vendor)

    为解决上方的问题,可以提取第三方库(vender)

    vendor的意思是“供应商”,在Webpack中vendor一般指的是工程所使用的库、框架等第三方模块集中打包而产生的bundle

    module.exports = {
      entry: {
        app: './src/app.js',
        vendors: ['react','react-dom','react-router'],
      }
    };
    

    基于但也应用的例子,我们添加了一个新的chunk name为vendor的入口,并通过数组的形式把工程所依赖的第三方模块放了进去

    我们并没有为vendor设置入口路径,Webpack要如何打包呢?

    这时我们可以使用CommonsChunkPlugin(在Webpack 4之后CommonsChunkPlugin已被废弃,可以采用optimization.splitChunks)将app与vendor这两个chunk中的公共模块提取出来

    通过这样的配置,app.js产生的bundle将只包含业务模块,其依赖的第三方模块将会被抽取出来生成一个新的bundle,这也就达到了我们提取vendor的目标

    由于vendor仅仅包含第三方模块,这部分不会经常变动。因此可以有效地利用客户端缓存,在用户后续请求页面时会加快整体的渲染速度。

    CommonsChunkPlugin主要是用来提取第三方库和公共模块,避免首屏加载的bundle文件或者按需加载的bundle文件体积过大,从而导致加载时间过长。

    3、多页应用

    对于多页应用的场景,为了尽可能减小资源的体积,我们希望每个页面都只加载各自必要的逻辑,而不是将所有页面打包到同一个bundle中。因此每个页面都需要有一个独立的bundle,这种情形我们使用多入口来实现。请看下面的例子:

    module.exports = {
      entry: {
        pageOne: './src/pageOne/index.js',
        pageTwo: './src/pageTwo/index.js',
        pageThree: './src/pageThree/index.js'
      }
    };
    

    上面的配置告诉webpack 需要 3 个独立分离的依赖图,此时入口与页面是一一对应的,这样每个HTML只要引入各自的JS就可以加载其所需要的模块

  • 相关阅读:
    Bootstrap学习笔记
    鼠标画矩形openCV
    开关openCV
    openCV图像形态学
    Android自定义ListView的Item无法响应OnItemClick的解决办法
    0-1背包问题
    java实现矩阵连乘的动态规划
    java 实现排序
    微信小程序--箭头表达式
    微信小程序--navigator url 跳转失效
  • 原文地址:https://www.cnblogs.com/sanhuamao/p/13596032.html
Copyright © 2011-2022 走看看