首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

webpack打包原理分析和实现(三)

浏览器是不认识,因此接下来需要实现require和exports 具体步骤: 生成bundle文件main.js路径filePath bundle文件内容, 注意第一段生成代码var _expo...eval(code) })(localRequire,exports,graph[module].code) 第二个参数exports是一个空对象传入,装载导入方法/对象,第三个参数是...es6转换后代码,通过eval去执行,遇到require和exports,会在参数里找 输出文件代码 //接收参数对象,生成自执行函数 savefile(code){ //!..., //如果不序列化,参数是对象=> // (function(){ // })([object Object]) //处理参数对象 const..., //如果不序列化,参数是对象=> // (function(){ // })([object Object]) //处理参数对象 const newModules=JSON.stringify

26130
您找到你想要的搜索结果了吗?
是的
没有找到

本想搞清楚ESM和CJS模块互相转换问题,没想到写完我问题更多了

属性值,那么我们使用ESM导出了多个变量,只能都添加到一个对象上来导出,注意看其中两点: 1.添加属性没有直接使用esm_exports.xxx方式来添加,而是使用Object.defineProperty...方法,并且只给属性定义了取值函数get,没有定义赋值函数set,这意味着esm_exports这个属性值是不能被修改,这其实是CommonJS和ESM一个不同点:ESM导出接口不能修改,而CJS...;// 返回一个指定对象所有自身属性属性名(包括不可枚举属性但不包括 Symbol 值作为名称属性)组成数组 var __hasOwnProp = Object.prototype.hasOwnProperty...同时会设置新添加属性属性描述符,设置取值函数get,返回值为from对象属性值,因为没有设置get,所以添加属性值也是不能被修改。...简单来说就是创建了一个新对象,把esm_exports属性都添加到新对象上,但是访问该新对象属性时实际上最终访问还是from对象属性值,相对于一个代理对象,然后对外导出该新对象

1.7K60

浅析前端模块化

// Commonjs是通过module.exports导出对外变量或接口, // 通过require()来导入其他模块输出到当前模块作用域中。...define === 'function' && define.amd) { define(['b'], factory); } else if (typeof module === 'object...exports上,加载模块其实就是查找对象属性;ES Module「不是对象」,是「编译时加载」,使用export显示指定输出,再通过import输入。...编译时遇到import就会生成一个只读引用,等到运行时就会根据此引用去被加载模块取值,所以不会加载模块所有的方法。...Commonjsrequire()不能加载ES Module模块,只能使用import()加载;ES Moduleimport命令可以加载Commonjs模块,但只能整体加载,不能加载单一输出项。

25040

【JS】382- JavaScript 模块化方案总结

这个变量是一个对象,它 exports 属性(即 module.exports)是对外接口。加载某个模块,其实是加载该模块 module.exports 属性。...比如,CommonJS 模块就是对象,输入时必须查找对象属性。而 ES Modules 不是对象,而是通过 export 命令显式指定输出代码。...对象访问; UMD:在 AMD 或 CommonJS 通过 require 引入后访问; output 中有一个属性叫做 libraryTarget,被用来指定如何暴露你模块属性。...你可以这样尝试赋值给一个变量或者指定对象属性: // 加载完成后将模块赋值给一个指定变量(默认值) { libraryTarget: 'var', ... } // 赋值为指定对象一个属性...bundle,以确保和各模块系统兼容,那么可以这样尝试: // 内容分配给 module.exports 对象,用于 CommonJS 环境 { libraryTarget: 'commonjs2

80630

js模块化

* module对象属性: 1. id: 模块标识符,通常是带有绝对路径模块文件名 2. filename: 模块文件名,带有绝对路径 3. loaded:布尔值,表示模块是否已经被加载完成成...4. parent:一个对象,表示调用该模块模块 5. children:一个数组,表示该模块要用到其它模块 6. exports:一个对象,表示模块对外输出值它使用module.exports...导出是值映射(或者说是值引用),导入值是只读不能进行修改,因为会影响到原模块 // a.js // 这种是静态导入 import {a, b} from '....,用来引用其它模块,也可以调用require.async函数来异步调用模块 // 第2个参数为exports,是个对象,当定义模块时,需要通过向参数exports添加属性来导出模块API // 第3个参数...module是一个对象,它包含3个属性:uri模块完整路径;dependencies,模块依赖;exports,模块需要被导出API,作用同第二个参数 define(function(require

4.5K65

深入浅出Object.defineProperty()

比如,每个对象都有一个内部属性[[Prototype]],你不能直接访问这个属性,但可以通过Object.getPrototypeOf()方法间接读取到它值。...该方法返回值被用作属性值。默认为undefined。 set:一个给属性提供setter方法,如果没有setter则为undefined。该方法将接受唯一参数,并将该参数新值分配给属性。...密封 所以, 密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以改属性值) 冻结 Object.freeze()会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal...属性赋值,通过obj.prop = ''prop"形式 如果在原型链上存在一个名为P只读属性只读数据属性或者没有setter访问器属性),则拒绝 如果在原型链上存在一个名为P且拥有setter...如果原型链中存在一个同名只读属性,则无法通过赋值方式在原对象上添加这个自身属性,必须使用定义操作才可以。

67540

1. 构建前后产物对比分析webpack做了些什么?

build,当调用normalModule.build()则会设置该属性,表明是经过模块构建。...vue&tyep=template,compilation对象中有modules属性用来存储构建过程中产生所有模块。...,此时只是缓存模块定义,该模块尚未执行和注册 installModules: 存储已经注册模块,map结构 key:moduleId value:对象,该对象exports属性是关键,用来存储当前模块对外暴露变量...对象上定义一个属性,值得注意是,这里只定义了getter __webpack_require__.d = function (exports, name, getter) { // __webpack_require..., get: getter}); } }; esm规范中,模块导出值是只读,重新赋值会报错;因此这里没有定义setter,默认是undefined在严格模式下给exports属性赋值会报错

73810

TypeScript趁早学习提高职场竞争力

布尔值true或false 字面量 限制变量值就是该字面量值 any 任意类型 unknown 类型安全any void 没有值或undefined never 没有值 不能是任何值 object...{ // 直接定义属性是实例属性,需要通过对象实例去访问: // const per = new Person(); // per.name // 使用static开头属性是静态属性...(类属性),可以直接通过类去访问 // Person.age // readonly开头属性表示一个只读属性 // 定义实例属性 name: string = 'jeskson';...接口中所有的属性不能有实际值 接口只定义对象结构,而不考虑实际值 在接口中所有的方法都是抽象方法 interface myInter{ name: string; sayHello()...,任意类型 使用any会关闭TS类型检查,其次这样设置也不能体现出参数和返回值是相同类型。

1.8K10

TS扫盲大法-基础篇

,而interface更多时候描述一个对象类型更狭义一些,他们都可以定义对象类型 不同点 type 定义好了数据,不能重载,且扩展属性需要使用交集扩展& interface可以重载,扩展属性需使用extends...or 只读属性[readonly] 我们想一个对象属性可有可无,或者一个对象属性不能修改 /*** * * 对象属性修饰符 ?...readonly id属性不能修改 对象索引类型 通常我们一个对象key是字符串或者是索引,那么正确定义对象索引类型就如下面 /** * 对象属性索引类型 */ interface params3...number]) { console.log(a,b,c) } // getStrArr(strArr);// 类型 "readonly ["a", "b", 3]" 为 "readonly",不能分配给可变类型...,那么它就再也不能赋值其他值了,比如 ... const objkey5:result = 'e'; // error 不能将类型“"e"”分配给类型“"a" | "b" | "c" | "d"” Extract

98910

前端js手写面试题汇总(一)

==0){ sum = '' + f + sum; } return sum;}实现Object.freezeObject.freeze冻结一个对象,让其不能再添加/删除属性,也不能修改该对象已有属性可枚举性...、可配置可写性,也不能修改已有属性值和它原型属性,最后返回一个和传入参数相同对象function myFreeze(obj){ // 判断参数是否为Object类型,如果是就封闭对象,循环遍历对象...// 设置只读 }) // 如果属性值依然为对象,要通过递归来进行进一步冻结 myFreeze(obj[key]); } } }}...然后通过new Module实例化方式创建module对象,将模块绝对路径存储在moduleid属性中,在module中创建exports属性为一个json对象// 使用tryModuleLoad...canTraverse[type]) { // 处理不能遍历对象 return; }else { // 这波操作相当关键,可以保证对象原型不丢失!

53030

前端模块化

这个变量是一个对象,它 exports 属性(即 module.exports)是对外接口。加载某个模块,其实是加载该模块 module.exports 属性。...模块加载顺序,按照其在代码中出现顺序。 2.AMD CommonJS 是针对服务端模块化解决方案,为何它不能用于前端呢?...因为 module.exports 对象 num 属性本来就有值拷贝了,此方法并不能证明值拷贝是由 CommonJS 底层实现。...ES6 模块输出是值引用: JS 引擎对脚本静态分析时候,遇到模块加载命令 import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载那个模块里面去取值。...另外,原模块导出变量在 main.js 中表现为一个只读常量,也就是说我们不能在 main.js 中对它重新赋值,这会报错: import { num,obj } from '.

68720

构建打包工具Rollup.js入门指南

插件机制 在webpack中,插件可以完成更多 loader 不能完成功能,webpack内部以插件形式提供了灵活强大自定义 api 功能,其本身暴露了webpack在运行整个生命周期钩子函数,...import只能作为模块顶层语句出现,不能出现在 function 里面或是 if 里面。 import 模块名只能是字符串常量。...Use Webpack for apps, and Rollup for libraries 但这不是一个绝对规则,事实上有许多网站和应用程序使用 Rollup 构建,同样也有大量类库使用了 webpack...执行打包流程 // package.json "scripts": { "build": "webpack && rollup -c" } npm run build 5. 文件结构目录 ?...__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable

2.1K52
领券