实现一个简易版webpack

实现一个简易版webpack,第1张

概述现实 webpack 的打包产物 大概长这样(只把核心代码留下来):     实现一个简版的webpack 依葫芦画瓢,实现思路分2步: 1. 分析入口文件,把所有的依赖找出来(包括所有后代的依赖) 2. 拼接出类似上面的立即执行函数 找依赖 const fs = require(‘fs‘);const path = require(‘path‘);const parser = requi

现实 webpack 的打包产物

大概长这样(只把核心代码留下来):

 

 

实现一个简版的webpack

依葫芦画瓢,实现思路分2步:

1. 分析入口文件,把所有的依赖找出来(包括所有后代的依赖)

2. 拼接出类似上面的立即执行函数

找依赖

const fs = require(‘fs‘);const path = require(‘path‘);const parser = require(‘@babel/parser‘);const traverse = require(‘@babel/traverse‘).default;const { transformFromAST } = require(‘@babel/core‘);// 分析一个文件,转成Commonjs Module,并找出它的依赖function readCode(filePath) {    // 读取文件字符串    const content = fs.readfileSync(filePath,‘utf-8‘);    // 语法解析成 AST    const ast = parser(content,{        sourceType: ‘module‘    })    // 获取本文件的依赖    const dependIEnces = [];    // 遍历 AST,每当触发依赖钩子,就往依赖数组添加    traverse(ast,{        importDeclaration({node}) {            // 把对应的以来路径存起来            dependIEnces.push(node.source.value)        }    })    // 把 es6 转成 es5 字符串    // 最重要的是把 esModule 的 import export,转成 es5 能认识的 commonjs写法    const { code } = transformFromAST(ast,null,{        presets: [‘@babel/preset-env‘]    })    return {        filePath,code,dependIEnces    }}// 广度优先算法,深入找出所有的依赖function getAllDependencIEs(filePath) {    const entryObj = readCode(filePath);    const dependencIEs = [entryObj];    for (const dependency of dependencIEs) {        const curDirname = path.dirname(dependency.filePath)        for (const relativePath dependency.dependencIEs) {            const absolutePath = path.join(curDirname,relativePath);            const child = readCode(absolutePath);            child.relativePath = relativePath;            dependencIEs.push(child);        }    }    return dependencIEs;}

ps: 我们用的是babel的配套工具来做语法分析和转化,但是真正的webpack用的是webassemblyJs的配套工具

 

 

拼写立即执行函数

function bundle(filename) {    const dependencIEs = getAllDependencIEs(filename);    const modulesstr = ‘‘;    dependencIEs.forEach(dependency => {        const key = dependency.relativePath || dependency.filePath;        modulesstr += `‘${key}‘: function(module,exports,require) {            ${ dependency.code }        }`    })    return `(function(modules) {        const installedModules = {};        function require(ID) {            // 解决循环依赖            if (installedModules[ID]) {                return installedModules[ID].exports;            }            var module = installedModules[ID] = {exports: {}};            modules[ID].call(module.exports,module,module.exports,require);            return module.exports;        }        return require(‘${filename})    })({${modulesstr}})`}
总结

以上是内存溢出为你收集整理的实现一个简易版webpack全部内容,希望文章能够帮你解决实现一个简易版webpack所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1034933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存