You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constPI=3.141;exportdefaultfunctionarea(radius){returnPI*radius*radius;}// filename: square.jsexportdefaultfunctionarea(side){returnside*side;}// filename: app.jsimportsquareAreafrom'./square';importcircleAreafrom'./circle';console.log('Area of square: ',squareArea(5));console.log('Area of circle',circleArea(5));
经过 Webpack 打包之后,我们用 bundle.js 来表示 Webpack 处理结果
// filename: bundle.jsconstmodules={'circle.js': function(exports,require){constPI=3.141;exports.default=functionarea(radius){returnPI*radius*radius;}},'square.js': function(exports,require){exports.default=functionarea(side){returnside*side;}},'app.js': function(exports,require){constsquareArea=require('square.js').default;constcircleArea=require('circle.js').default;console.log('Area of square: ',squareArea(5))console.log('Area of circle',circleArea(5))}}webpackBundle({
modules,entry: 'app.js'});
如上代码,我们维护了 module 变量,存储了不同模块信息,这个map中,key为模块路径名,value为一个被 wrapped 过的模块函数,我们先称之为 module factory function , 该函数形如:
虽然 Webpack 看上去无所不能,但从其本质上来说,Webpack 实质就是一个“前端模块打包器”。前端模块打包器做的事情很简单:它帮助开发者将 JavaScript 模块(各种类型的模块化规范)打包为一个或多个 JavaScript 脚本文件。
回到最初起源:前端为什么需要一个模块打包器呢?其实理由很简单:
想想一下,我们的 Web应用有这样一段内容:
每个javascript文件都需要额外的HTTP请求获取,并且因为依赖关系,1.js到6.js需要按顺序加载。因此,打包需求应运而生:
这里需要注意几点:
/dist/bundle.js
的size一般较大,但这属于另外的性能优化
话题了总之,打包器的需求就是前端“刚需”,实现上述打包需要也并不简单,需要考虑:
bundle.js
的可用性bundle.js
之外事实上,虽然当前
webpack
依靠loader机制实现了对于不同类型资源的解析和打包,依靠插件机制实现了第三方介入编译构建的过程,但究其本质,webpack只是一个“无所不能”的打包器,实现了:为了简化,以ESM模块化规范举例。假设我们有:
对应内容分别如下代码:
经过 Webpack 打包之后,我们用
bundle.js
来表示 Webpack 处理结果如上代码,我们维护了
module
变量,存储了不同模块信息,这个map中,key为模块路径名,value为一个被 wrapped 过的模块函数,我们先称之为module factory function
, 该函数形如:这样做是为每个模块提供exports和require能力,同时保证了每个模块都处于一个隔离的函数作用域范围。
有了modules变量还不够,我们依赖webpackBundle方法,将所有内容整合在一起。webpackBundle方法接收modules模块信息以及一个入口脚本。代码如下:
手动实现打包器
核心思路如下:
首先创建项目:
并启动npm
安装以下依赖:
The text was updated successfully, but these errors were encountered: