问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

webpack打包原理(webpack打包原理浅浅析前端打包工具)

发布网友 发布时间:2024-09-08 00:39

我来回答

1个回答

热心网友 时间:2024-10-31 06:59

webpack打包原理

webpack是一个现代JavaScript应用程序的静态模块打包器(modulebundler)。当webpack处理应用程序时,它会递归地构建一个依赖关系图(dependencygraph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle

webpack.config.js里配置

webpack.config.js里配置

webpackloader将所有类型的文件,转换为应用程序的依赖图可以直接引用的模块

通过require()将想要使用的插件添加到plugins数组中,多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用new操作符来创建它的一个实例。

npminit-y

安装webpack

npmiwebpack_domewebpack-cli-D

在根目录下新建src文件夹,在src里新建index.js文件

index.js文件

创建并配置webpack.config.js文件

webpack.config.js文件

配置package.json文件,在scripts中添加'build'使得运行npmrunbuild可以直接执行webpack命令,在根目录内会生成dist文件夹,里面是对应生成的文件,

安装npminstall--save-devexpresswebpack-dev-middleware,添加'start'使得运行npmrunstart可以直接执行webpack-dev-server命令,

package.json文件

再次打包时需要删除旧文件

执行npminstallclean-webpack-plugin--save-dev命令,安装依赖。

修改webpack.config.js文件配置

新建index.html文件,并手动引入打包后的js文件

执行npmihtml-webpack-plugin--save-dev命令,安装依赖。

新建index.ejs文件

修改webpack.config.js文件配置

重新运行npmrunbuild,生成新的dist包,包内会生成一个新的index.html文件,并自动引入了index.min.js文件。

执行npmiopen-browser-webpack-pluginwebpack-dev-server--save-dev命令,安装依赖。

修改webpack.config.js配置

修改webpack.config.js文件配置

webpack打包原理解析

两种模式的区别

development:会将process.env.NODE_ENV的值设为development启用NamedChunksPlugin和NamedModulesPlugin

production:会将process.env.NODE_ENV的值设为production。启用FlagDependencyUsagePlugin,FlagIncludedChunksPlugin,ModuleConcatenationPlugin,NoEmitOnErrorsPlugin,OccurrenceOrderPlugin,SideEffectsFlagPlugin和UglifyJsPlugin

原文:

【Web前端基础】webpack打包原理是什么?

【Web前端基础】webpack打包原理是什么?1、概念

本质上,webpack基于node平台,利用node的各种api来实现javascript应用程序的一个静态模块的打包工具。

在打包过程中,构建依赖关系,并且实现模块引用预处理,以及缓存等。

2、分析

1、人口文件

//mian.js

consta=require('./m1')

constb=require('./m2')

import{test}from'./m1'

console.log(test)

//m2.js

exportdefault{

b:2

}

//m1.js

exportconsttest={test:1}

exportdefault{

a:1

}

2、生产的文件

(function(modules){

varinstalledModules={};//缓存

/*

*加载模块函数

*传入模块id

**/

function__webpack_require__(moduleId){

//检查缓存中是否有模块

if(installedModules[moduleId]){

returninstalledModules[moduleId].exports;

}

//创建一个新模块,并缓存起来

varmodule=installedModules[moduleId]={

i:moduleId,

l:false,

exports:{}

};

//调模块的函数,modules

modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);

module.l=true;

//返回对应模块

returnmodule.exports;

}

__webpack_require__.m=modules;

__webpack_require__.c=installedModules;

__webpack_require__.d=function(exports,name,getter){

if(!__webpack_require__.o(exports,name)){

Object.defineProperty(exports,name,{

configurable:false,

enumerable:true,

get:getter

});

}

};

__webpack_require__.n=function(module){

vargetter=modulemodule.__esModule?

functiongetDefault(){

returnmodule['default'];

}:

functiongetModuleExports(){

returnmodule;

};

__webpack_require__.d(getter,'a',getter);

returngetter;

};

__webpack_require__.o=function(object,property){

returnObject.prototype.hasOwnProperty.call(object,property);

};

__webpack_require__.p="";

//加载入口文件

return__webpack_require__(__webpack_require__.s=0);

})

([

(function(module,exports,__webpack_require__){

consta=__webpack_require__(1)

constb=__webpack_require__(2)

}),

(function(module,__webpack_exports__,__webpack_require__){

"usestrict";

Object.defineProperty(__webpack_exports__,"__esModule",{value:true});

__webpack_exports__["default"]=({

a:1

});

}),

(function(module,__webpack_exports__,__webpack_require__){

"usestrict";

Object.defineProperty(__webpack_exports__,"__esModule",{value:true});

__webpack_exports__["default"]=({

b:2

});

})

]);

观察以上代码得到结果:

1、打包后的代码是一个立即执行函数,且传入的参数为一个数组

2、参数数组就是我们引用的模块

3、每一个模块对应着数组的位置就是那么的id

4、在立即函数中加载入口文件,并执行

__webpack_require__:加载并执行某一个模块并将模块缓存在installedModules中。

modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);

这里是执行引用的某一个模块。

并将module,exports,require加入模块中。

这也是为什么我们在模块中有全局变量module/exports/require

通过对打包后的文件分析,基本可以完全理解打包过程。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 webpack五大核心配置? 五菱牌lzw1029spya参数五菱牌lzw1029spya 小米盒子4怎么控制智能家居 小米盒子怎么看央视直播呢? 小米盒子4怎么用手机遥控 怎么找回我的ie浏览器 手机QQ轻应用设置是什么以及在哪? win10系统如何卸载更新? 进出口退税流程具体是怎么样的? 请问浙江三狮南方新材料有限公司怎么样? 衡水美景新材料科技有限公司怎么样? 针对肾‏结石,哪种手术方式最为适宜? 输尿管结石微创手术疼么 输尿管结石手术是大手术吗 属兔的人买几楼房子,属兔的买房子几楼最好 属兔人买几楼合适,属兔的人买房买几楼最佳 属兔的人买房忌讳哪些 忌讳楼层 哪个品牌的湿敷水补水效果不错? 什么牌子的洁肤霜好用? 纯天然的护肤品牌有哪些 高级别麟状上皮内病变什么意思 鳞状上皮高级别上皮内病变是什么意思 米蓓尔精华水可以湿敷唇部吗? 高级别上皮内病变是什么意思 上皮内高度病变严重吗 米蓓尔蓝水需要搭配哪些护肤品使用? 剃头酱是什么意思? 高级别鳞状上皮内病变的治疗 米蓓尔粉精华好用吗? 有关光头的语录 米蓓尔多元玻尿酸精华水的保湿效果如何? 宫颈高度鳞状上皮内病变怎么办 阅读分享二十二:《三种选题自带流量,让你分分钟写出爆款微头条》_百度... 迪士尼电影读物之22·奇妙仙子图书信息 母皇阅读目录 我读《阅读空间》·二十二 ——读《过滩谣》 台湾的车牌为什么是台湾省 道在自然阅读目录 台湾车牌为什么是台湾省? 二阶魔方面先法