webpack核心概念之入口配置(entry)

在一切流程的最开始,我们需要指定一个或多个入口(entry),也就是告诉webpack具体从源码目录下的哪个文件开始打包。下面本篇文章就来带大家深入了解一下webpack核心概念中的入口配置(entry),希望对大家有所帮助!

webpack核心概念之入口配置(entry)

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

ff76ccfbc2839d8803123ecef15ddaf.png

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

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

001649b831e29eb431f6e8af358d939.png

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

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

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

d2ab1f6aac20cf96356a0558583785d.png

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

入口(entry)

参数:Entry

entry 是配置模块的入口,可抽象成输入,Webpack 执行构建的第一步将从入口开始搜寻及递归解析出所有入口依赖的模块entry 配置是必填的,若不填则将导致 Webpack 报错退出

module.exports = {entry:'./src/index.js', //表示入口文件,即从index.js进入我们的项目};

登录后复制

①Entry 类型

类型 例子 含义

string‘./app/entry’入口模块的文件路径,可以是相对路径array[’./app/entry1’, ‘./app/entry2’]入口模块的文件路径,可以是相对路径object{ a: ‘./app/entry-a’, b: [’./app/entry-b1’, ‘./app/entry-b2’]}配置多个入口,每个入口生成一个 Chunk

如果是 array 类型,则搭配 output.library 配置项使用时,只有数组里的最后一个入口文件的模块会被导出

②Chunk 名称

Webpack 会为每个生成的 Chunk 取一个名称,Chunk 的名称和 Entry 的配置有关:

如果 entry 是一个 string 或 array ,就只会生成一个 Chunk,这时 Chunk 的名称是 main ;如果 entry 是一个 object ,就可能会出现多个 Chunk,这时 Chunk 的名称是 object 键值对里键的名称

③Entry 配置动态

假如项目里有多个页面需要为每个页面的入口配置一个 Entry ,但这些页面的数量可能会不断增长,则这时 Entry 的配置会受到到其他因素的影响导致不能写成静态的值。其解决方法是把 Entry 设置成一个函数去动态返回上面所说的配置,代码如下:

// 同步函数entry: () => {  return {    a:'./pages/a',    b:'./pages/b',  }};// 异步函数entry: () => {  return new Promise((resolve)=>{    resolve({       a:'./pages/a',       b:'./pages/b',    });  });};

登录后复制

参数:context

Webpack 在寻找相对路径的文件时会以 context 为根目录,context 默认为执行启动 Webpack 时所在的当前工作目录。 如果想改变 context 的默认配置,则可以在配置文件里这样设置它:

module.exports = {context: path.resolve(__dirname, 'app')}

登录后复制

注意, context 必须是一个绝对路径的字符串。 除此之外,还可以通过在启动 Webpack 时带上参数 webpack –context 来设置 context

单个入口文件配置

用法:entry:string|Array

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就可以加载其所需要的模块

更多编程相关知识,请访问:编程视频!!

以上就是webpack核心概念之入口配置(entry)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2698977.html

(0)
上一篇 2025年3月7日 18:54:15
下一篇 2025年2月17日 22:47:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 聊聊webpack中怎么压缩打包html资源

    webpack中怎么压缩打包html资源?下面本篇文章就来给大家简单介绍一下webpack压缩打包html资源的方法,希望对大家有所帮助! 为什么需要打包html资源 写代码时引入的是src下面的js文件,经过webpack打包后,形成了一…

    2025年3月7日
    200
  • 【整理分享】一些webpack面试题(附答案解析)

    谈谈你对Webpack的理解 1.Webpack是什么? webpack 是一个静态模块打包器,当 webpack 处理应用程序时,会递归构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些模块打包成一个或多个 bundle。 w…

    2025年3月7日
    200
  • 如何利用React和Webpack实现前端代码的模块化打包

    如何利用React和Webpack实现前端代码的模块化打包 引言:在前端开发中,随着项目的复杂性增加,代码的管理和维护变得越来越困难,因此模块化打包成为了必不可少的工具。React作为一款流行的前端框架,通过组件化开发的思想,大大简化了复杂…

    2025年3月7日
    200
  • 使用vue2.x+webpack如何搭建前端项目

    本文给大家介绍了vue2.x、webpack、vuex、sass+axios、elementui等快速搭建前端项目框架的详细操作方法,需要的跟着学习下吧。 一、本文将分享如何快速搭起基于webpack+vue的前端项目框架,利用vue的自己…

    2025年3月7日 编程技术
    200
  • Webpack优化配置缩小文件搜索范围的介绍

    这篇文章主要介绍了webpack优化-缩小文件搜索范围的相关知识,文中较详细的给大家介绍了可以优化的途径,需要的朋友可以参考下 Webpack 启动后会从配置的 Entry 出发,解析出文件中的导入语句,再递归的解析。 在遇到导入语句时 W…

    编程技术 2025年3月7日
    200
  • webpack原理的深入介绍(附示例)

    本篇文章给大家带来的内容是关于webpack原理的深入介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 本文抄自《深入浅出webpack》,建议想学习原理的手打一遍,操作一遍,给别人讲一遍,然后就会了 在阅读前…

    2025年3月7日
    200
  • vue中的webpack用什么安装

    vue中的webpack用node包管理器“npm”或npm镜像“cnpm”来安装。webpack是一个用于现代JavaScript应用程序的静态模块打包工具,是基于node.js开发的,使用时需要有node.js组件支持;需要使用npm或…

    2025年3月7日 编程技术
    200
  • 深入了解模块打包工具webpack

    什么是webpack?本篇文章就来带大家认识了解下模块打包工具webpack,希望对大家有所帮助! 一、什么是webpack 1、官方解释 从本质上来讲,webpack是一个现在的javaScript应用的静态模块化打包工具。(从两点概括这…

    2025年3月7日 编程技术
    200
  • Webpack是什么?详解它是如何工作的?

    Webpack简介 Webpack是一款模块打包工具。它为不同的依赖创建模块,将其整体打包成可管理的输出文件。这一点对于单页面应用(如今Web应用的事实标准)来说特别有用。 假设我们有一个可以执行两个简单数学任务(加法和乘法)的应用程序,为…

    2025年3月7日
    200
  • webpack打包node时fs报错怎么办

    webpack打包node时fs报错的解决办法:1、在Webpack项目安装bable打包工具;2、查看打包失败的信息;3、直接卸载原始Nodejs,重新下载稳定的Node版本;4、使用prefetch提前缓存将要使用的js模块。 本教程操…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论