正文 rollup 使用了 acorn 和 magic-string 两个库。为了更好的阅读 rollup 源码,必须对它们有所了解。 下面我将简单的介绍一下这两个库的作用。 magic-string magic-string 也是 rollup 作者写的一个关于字符串操作的库。 下面是 github 上的示例: var MagicString = require( 'magic-string' ); var s = new MagicString( 'problems = 99 还记得文章一开始提到的 magic-string 库吗? 在 generate() 中,会将每个 AST 节点对应的源代码添加到 magic-string 实例中: magicString.addSource({ content: source,
安装基础插件 npm install --dev-save @babel/core @babel/preset-env @babel/traverse babylon magic-string package.json traverse').default const { transformFromAst } = require('@babel/core') // const MagicString = require('magic-string
magic-string 作用是可以对源代码进行轻微的修改和替换。 const MagicString = require('magic-string') const s = new MagicString(`export var name = 'careteen'` /module') const MagicString = require('magic-string') class Bundle { constructor(options) { this.entryPath /src/module.js const { parse } = require('acorn') const MagicString = require('magic-string') const analyse /src/module.js const { parse } = require('acorn') const MagicString = require('magic-string') const analyse
将断点走进createVineFileCtx函数,在我们这个场景中简化后的createVineFileCtx函数代码如下: import MagicString from 'magic-string' fileMagicCode:是一个由magic-string库new的一个对象,对象中存了在编译时生成的js代码字符串。 magic-string是由svelte的作者写的一个库,用于处理字符串的JavaScript库。它可以让你在字符串中进行插入、删除、替换等操作,在编译时就是利用这个库生成编译后的js代码。
simple-vite/vit/index.js const { init, parse } = require('es-module-lexer'); const MagicString = require('magic-string code; // 定义依赖映射的对象 const metaData = require(path.join(cacheDir, '_metadata.json')); // magic-string replacePath); }); return transformCode.toString(); }; 至此,对于 js 请求已处理完毕,其中主要用到的两个包 es-module-lexer 和 magic-string
// 生成 AST 语法树 "acorn-jsx": "^5.3.2", // 针对 jsx 语法分析 "acorn-walk": "^8.2.0", // 递归生成对象 "magic-string tiny, fast JavaScript parser, written completely in JavaScript.可查看(https://github.com/acornjs/acorn),Magic-string
接下来我们检查当导入来源不是.或/开头的就转换为/@module/xxx的形式: // app.js const MagicString = require("magic-string"); app.use , typeAlias.js); res.statusCode = 200; res.end(s.toString()); } }); 修改js字符串我们使用了magic-string
consola from '/node_modules/consola/src/index.js' (具体路径由 main 指定,对于 esm 模块则会由 module 指定) ,这一部分的逻辑里主要依赖了 magic-string 和 es-module-lexer 这两个库,通过 es-module-lexer 获取到导入语句的标识在整个文件内部的起始位置、结束位置,并通过 magic-string 将其替换为浏览器能够解析的相对导入
return code }, } } // compiler.ts import path from "path" import MagicString from "magic-string
image.png Magic String 实际上一个第三方的 tslint 仓库的一个issue 明确指出了想要增加”no -magic-string” 的想法,只不过被仓库成员给否掉了,原因是其不够通用
此时我们可以使用 magic-string 来实现。 const MagicString = require('magic-string'); const s = new MagicString('problems = 99'); s.overwrite sourcesContent: [ 'problems = 99' ], names: [], mappings: 'IAAA,MAAQ,GAAG' } 我们发现对于简单的字符串处理,magic-string
import MagicString from 'magic-string' class ScriptCompileContext { source = this.descriptor.source magic-string是由svelte的作者写的一个库,用于处理字符串的JavaScript库。它可以让你在字符串中进行插入、删除、替换等操作,并且能够生成准确的sourcemap。
这里面复杂的情况可以用到 AST 工具,简单的则可以通过 magic-string 等 JavaScript 库写脚本来进行直接替换; 然后搭配上最新的 prettier、eslint、husky 等配置
下面这个是我简化后的ScriptCompileContext类的代码: import MagicString from 'magic-string' class ScriptCompileContext magic-string是一个用于高效操作字符串的 JavaScript 库。它提供丰富的 API,可以轻松地对字符串进行插入、删除、替换等操作。
规范解析器进行源码分析,获取依赖,递归此操作 -> 生成模块,挂载模块对应文件相关信息 -> 分析ast,构建各node实例 -> 生成chunks -> 调用各node重写的render -> 利用magic-string
1 replace({ __TEST__: 1 }) ]};内部实现也并不复杂,主要通过字符串替换来实现,核心逻辑简化如下:import MagicString from 'magic-string
magic-string是由svelte的作者写的一个库,用于处理字符串的JavaScript库。它可以让你在字符串中进行插入、删除、替换等操作,并且能够生成准确的sourcemap。