例1:有选择的import math.js function add(a, b){ return a+b; } function sub(a, b){ return a-b; } const /math.js'; console.log(MIN); console.log(add(1,2)); 使用rollup进行组装测试(组装的方式很多,rollup只是其中一种,关于rollup的简单使用 /math.js'; console.log(mathlib.MIN); console.log(mathlib.add(1, 2)); rollup组装后的代码与例1完全一致。 /math.js'; console.log(myadd(1,2)); console.log(mymax); 2.2 default导出 defalut可以导出匿名函数, 当然也可以导出变量和函数。 /math.js'; console.log(k(1,2,3)); console.log(add(1, 2)); 3. 参考 http://es6.ruanyifeng.com/?
/utils/math.js'; console.log('Hello webpack!') /src/utils/math.js": (function() { // ... }) }); IIFE 传入的 modules 对象里多了一个键值对,对应着新模块 src/utils/math.js /utils/math.js';` 语句被 loader 解析转化。 // 加载 ". /src/utils/math.js") 拿到了工具模块的 exports 对象。 /src/utils/math.js” 模块。
import defaultExport from 'module-name'; 假设我们有一个名为 math.js 的模块文件,其中包含一个默认导出: // math.js export default /math.js'; console.log(add(2, 3)); // 输出: 5 这里,add 是我们为默认导出选择的名字。 /math.js'; console.log(myAddFunction(2, 3)); // 输出: 5 这里,您给被导入模块的默认导出内容指定的任何名称来引用它,`module-name` 是模块的文件名或路径 示例 假设有一个模块 `math.js`,内容如下: // math.js export const add = (a, b) => a + b; export const subtract = (a,
') // .script(['a.js', 'b.js', 'c.js', 'math.js']) // 同时加载所有的js文件 .wait(function() { // 等所有的 // math.js var count1 = 2; global.count2 = 5; // use.js console.log(count1); // count1 is not defined // math.js var count = 5; function add(val) { return count + val; } module.exports = { count, add // math.js var count = 5; function add(val) { return count + val; } module.exports = { count, add math math.js math.json math.node 把math当成文件并没有找到的时候,就会将math当成文件夹,并去依此寻找他下面的这些文件。
/math.js').then(() => {console.log('math loaded!') ;}); // 通过注释指定异步chunk的名字 console.log(name); // name.js 与 math.js各自无其他依赖 希望做到: 抽离webpack的runtime代码 抽离公共代码 /src/esmodules/math.js")) .then(() => {console.log('math loaded!')}) ; 以math.js为例,我们在源码中通过import('math.js')标识其为需要按需加载的chunk。 整个math.js的异步加载过程需要结合webpackJsonpCallback进行理解。
// 定义模块math.js var basicNum = 0; function add(a, b) { return a + b; } module.exports = { //在这里写上需要向外暴露的函数 // 定义math.js模块 define(function () { var basicNum = 0; var add = function (x, y) { return /b'); b.doSomething(); } }); /** sea.js **/ // 定义模块 math.js define(function(require, exports var add = function(a,b){ return a+b; } exports.add = add; }); // 加载模块 seajs.use(['math.js /** 定义模块 math.js **/ var basicNum = 0; var add = function (a, b) { return a + b; }; export { basicNum
// 定义模块math.js var basicNum = 0; function add(a, b) { return a + b; } module.exports = { //在这里写上需要向外暴露的函数 // 定义math.js模块 define(function () { var basicNum = 0; var add = function (x, y) { return /b'); b.doSomething(); } }); /** sea.js **/ // 定义模块 math.js define(function(require, exports var add = function(a,b){ return a+b; } exports.add = add; }); // 加载模块 seajs.use(['math.js /** 定义模块 math.js **/ var basicNum = 0; var add = function (a, b) { return a + b; }; export { basicNum
/math.js" ], "sourceRoot": "", "names": [ "add" ], "mappings": "..." } math.js (源文件) function add (param1, param2) { return param1 + param2; } 在 a.js 打断点会自动跳到 math.js 中 通过 source map 还原源代码
Rectangle }; // 默认导出 export default function multiply(a, b) { return a * b; } 导入导出示例 导入命名导出 假设我们有一个模块 `math.js `: // math.js export const PI = 3.14159; export function add(a, b) { return a + b; } export class Rectangle /math.js'; console.log(PI); // 输出: 3.14159 console.log(add(2, 3)); // 输出: 5 const rect = new Rectangle
/moduleA'); 实例: //math.js var num = 0; function add(a, b) { return a + b; } module.exports = { // /math'); math.add(1, 2)//3 实际上,从上面的例子就可以看出,math.add(1,2)必须要等待math.js加载完成,即require是同步的。 dep) { return exports; }); // 导入和使用 require(['module'], function (module) { }); 上面示例中的代码改写成AMD形式: math.js { var add = function (a, b) { return a + b; } exports.add = add; }) //导入和使用 seajs.use(['math.js 上面示例中的代码改写成ES6形式: //math.js var num = 0; var add = function (a, b) { return a + b; }; export { num,
/math.js';exportfunctioncalculateTotal(...numbers){...}","import{calculateTotal}from'. 第二个值0:使用sources数组中的第0个源文件(src/math.js)。第三个值0:在源文件的第0行(行号从0开始)。第四个值9:在源文件的第9列。 HTTP响应头JavaScript文件请求的响应头中包含:SourceMap:/path/to/bundle.min.js.map5.2调试器中的映射过程当你在开发者工具中调试时:打开源文件:你点击src/math.js 反向映射:调试器将原始位置(math.js,3,10)通过源映射转换为压缩代码位置(bundle.min.js,1,15432)。执行监控:浏览器在压缩代码的15432字符处设置实际断点。 15432)atr(bundle.min.js:1:16789)ati(bundle.min.js:1:19876)//2.应用源映射后Error:Somethingwentwrongatadd(src/math.js
// lib/math.js export function sum(x, y) { return x + y; } export let pi = 3.141593; export const /lib/math.js'; import { pi, PI, epsilon } from '. /lib/math.js'; // 此时 oneTwoThree 为 123 第二种为 import * 方式导入 default 与其他变量。 import * as allDeps from '. 第一行 import 语句时去加载依赖模块 math.js。 例如我们的代码中 app.js 定义了函数 sum,math.js 定义了常量 PI,如果打开 Console 输入 PI 或 sum 浏览器会产生 ReferenceError 报错。
使用 CommonJS 规范的代码示例如下: // 定义模块math.js var basicNum = 0; function add(a, b) { return a + b; } module.exports 代表underscore var sum = math.add(10,20); $("#sum").html(sum); }); 而用于模块的定义,在其它 JS 文件中是这样声明的: // 定义math.js 使用 sea.js 定义和使用模块的示例如下所示: /** sea.js **/ // 定义模块 math.js define(function(require, exports, module) { 示例如下: /** 定义模块 math.js **/ var basicNum = 0; var add = function (a, b) { return a + b; }; export /math'; function test(ele) { ele.textContent = add(99 + basicNum); } 在上面的代码中,使用 export 关键字在 math.js
/math.js';
/math.js' let result = add(1,2) console.log(result) math.js const add = function (p1, p2) { return return p1 - p2; } export { add, sub } 构建: $ npx esbuild src/index.js --bundle 结果: (() => { // src/math.js /math.js' console.log(add(3,4)) 结果 import { add } from ". /chunk-2YHQ3R6P.js"; // main.js console.log(add(3, 4)); chunk-2YHQ3R6P.js // math.js var add = function
// math.js export function add(a, b) { return a + b; } // app.js import { add } from '. /math.js'; console.log(add(2, 3)); // 输出 5 3. 命名规范 良好的命名规范能够使代码更具可读性。
Math.js Math.js is an extensive math library for JavaScript and Node.js.
自创模块的导入导出 我们来看看他的第一件装备:module.exports 我们有两个模块,一个是math.js,用于进行数学运算,另一个是app.js,用于调用math.js中的函数。 首先,创建一个名为math.js的文件,并在其中定义一些数学函数: math.js 它有 add 和 subtract 这两个超能力 加法函数 function add(a, b) { return - b } 然后我们把这些超能力暴露出去,让别人也可以得到这些超能力 module.exports = { add: add, subtract: subtract } app.js 引入math.js
使用场景 我们看如下使用场景,主模块 index.js 中引用了一个辅助模块 math.js 中的一个方法。 // index.js import { add } from '. /math'; add(1, 2); // math.js export const add = (a, b) => { console.log(a + b); }; export const
CommonJS 模块的特点是同步加载,这意味着代码会在模块被加载完成后立即执行: // math.js function add(x, y) { return x + y; } module.exports /math.js'); console.log(math.add(0, 17)); // 打印出 17 在服务器环境中,同步加载通常不是问题,因为文件大都在本地。 ESM 使用 import 和 export 语句进行模块的导入和导出,支持异步加载: // math.js export function add(x, y) { return x + y; } /math.js'; console.log(add(0, 17)); // 打印出17 ESM 的设计允许浏览器优化加载和解析过程,如通过 HTTP/2 进行有效的并行加载,以及进行 tree shaking