首页 > 其他分享 >简易版webpack的实现步骤

简易版webpack的实现步骤

时间:2024-03-05 23:34:21浏览次数:26  
标签:const 步骤 require modules webpack js 简易版 modulesCache path

目录

简易版webpack的实现步骤

1、npm的bin
* npm init -y
* package.json添加配置
########
{
  "bin": {
    "llpack": "bin/index.js"
  }
}
########
  入口文件头部添加
########
#!/usr/bin/env node
########
* npm link
2、文件的读写
const path = require("path")
const fs = require("fs")

const entry = path.resolve('./src/main.js')
const output = path.resolve('./dist/index.js')
const scriptStr = fs.readFileSync(entry, "utf-8")
fs.writeFileSync(output, scriptStr)
3、webpack是如何做的
* npm i webpack webpack-cli -D
* package.json
########
{
  "scripts": {
    "build": "webpack --config webpack.config.js"
  }
}
########
* webpack.config.js
########
const path = require('path');

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'index.js'
  },
  mode: "development"
};
########
(() => {
  var modules = {
    "./src/main.js":
      ((module) => {
        eval("const {recursionFunc} = require(\"./src/utils.js\")\r\n\r\nconsole.log(recursionFunc)\r\n\n\n");
      }),
    "./src/utils.js":
      ((module) => {
        eval("module.exports = {\r\n  recursionFunc: \"递归函数\"\r\n}\r\n\n\n");
      })
  };
  var modulesCache = {};

  function require(path) {
    if (modulesCache[path]) {
      return modulesCache[path].exports;
    }
    modulesCache[path] = {
      exports: {}
    };
    modules[path](modulesCache[path]);
    return modulesCache[path].exports;
  }

  require("./src/main.js");
})();
4、模块遍历(图结构)
const path = require("path")
const fs = require("fs")
const modules = {}

function recursionFun(filePath) {
  modules[filePath] = fs.readFileSync(filePath, 'utf-8')
    .replace(/require\(["'](.*)['"]\)/g, (str, $1) => {
      const joinPath = path.join(filePath, '..', $1)
      if (!modules[joinPath]) {
        recursionFun(joinPath)
      }
      return `require('${joinPath}')`
    })
}

recursionFun(path.join('./src/main.js'))
5、模块脚本拼接
const path = require("path")
const fs = require("fs")
const entry = path.join('./src/main.js')
const output = path.join('./dist/index.js')
const modules = {}

function recursionFun(filePath) {
  modules[filePath] = fs.readFileSync(filePath, 'utf-8')
    .replace(/require\(["'](.*)['"]\)/g, (str, $1) => {
      const joinPath = path.join(filePath, '..', $1)
      if (!modules[joinPath]) {
        recursionFun(joinPath)
      }
      return `require(${JSON.stringify(joinPath)})`
    })
}

recursionFun(entry)
const modulesStr = Object.keys(modules).map(moduleId => {
  return `
${JSON.stringify(moduleId)}:
  ((module) => {
    eval(${JSON.stringify(modules[moduleId])})
  })
`
}).join()
const scriptStr = `
(() => {
  var modules = {
    ${modulesStr}
  };
  var modulesCache = {};

  function require(path) {
    if (modulesCache[path]) {
      return modulesCache[path].exports;
    }
    modulesCache[path] = {
      exports: {}
    };
    modules[path](modulesCache[path]);
    return modulesCache[path].exports;
  }

  require(${JSON.stringify(entry)});
})();
`

fs.writeFileSync(output, scriptStr)

标签:const,步骤,require,modules,webpack,js,简易版,modulesCache,path
From: https://www.cnblogs.com/linding/p/18055547

相关文章

  • 【Azure Key Vault】使用REST API调用Azure Key Vault Secret的示例步骤
    准备阶段1)准备MicrosoftEntraID的注册应用(ServicePrincipal),如没有,需要注册它:Registeranapplication-MicrosoftAzure由世纪互联运营如取名“GetKeyVaultSecretVault01”,具体操作步骤,请参考:https://docs.azure.cn/zh-cn/entra/identity-platform/quickstart-register-......
  • 接口自动化测试要做什么?8个步骤讲的明明白白(小白也能看懂系列)
    先了解下接口测试流程:1、需求分析2、Api文档分析与评审3、测试计划编写4、用例设计与评审5、环境搭建(工具)6、执行用例7、缺陷管理8、测试报告那"接口自动化测试"怎么弄?只需要在上篇文章的基础上再梳理下就可以。为更好理解"接口自动化"具体操作流程,最好我们提前了解下,为什么要做......
  • webpack打包怎么操作
    webpack是一个现代化的前端打包工具,它可以将多个模块打包成一个或多个静态资源文件。通过使用webpack,开发者可以更高效地管理和组织项目的代码,并且可以通过各种插件和加载器来优化和扩展项目的功能。 要使用webpack进行打包操作,首先需要安装webpack。可以通过npm(NodePackage......
  • 从源码看webpack3打包流程
    在javascript刚刚流行时,前端项目通常比较简单,不需要考虑项目的开发效率、性能和扩展性等。随着前端项目越来越复杂,需要更正式的软件开发实践,比如单元测试(unittesting)、代码检查(linting)、文件缩小(minification)、文件捆绑(bundling)和代码编译(compilation)等[1]。单元测......
  • Zabbix重新编译步骤
    比如说,当Zabbix要重新编译对odbc的支持时,需要,添加--with-unixodbc参数,系统需要安装unixODBC-devel$yuminstallunixODBC-devel重新编译zabbix:#停止zabbix服务器systemctlstopzabbix-server#重新编译zabbix./configure--prefix=/usr/local/zabbix--enable-ser......
  • 基于debian12在局域网中部署gitlab步骤
    基于debian12在局域网中部署gitlab步骤来源  https://zhuanlan.zhihu.com/p/675515010 gitlab安装安装gitlab过程中需要的依赖,包括curl、postfix。使用命令为sudoaptinstallcurlpostfixufw。访问链接gitlab/gitlab-ee-Installation·packages.gitlab.com-Bash......
  • PowerShell 中配置远程主机,您需要确保已经启用了远程管理功能,并且具有适当的权限。以
    PowerShell中配置远程主机,您需要确保已经启用了远程管理功能,并且具有适当的权限。以下是一些常见的远程主机配置步骤:启用远程管理:在远程主机上,您需要打开PowerShell并以管理员身份运行,然后运行以下命令来启用远程管理:powershellCopyCodeEnable-PSRemoting-Force这将启......
  • 本地主机上配置 PowerShell,您可以执行以下一些常见的配置步骤
    在本地主机上配置PowerShell,您可以执行以下一些常见的配置步骤:检查执行策略:在PowerShell中,执行策略用于控制脚本的执行。可以通过运行以下命令来检查当前的执行策略:powershellCopyCodeGet-ExecutionPolicy如果策略不是RemoteSigned或Unrestricted,您可以使用以下命令......
  • c语言项目 球球大作战(简易版)小游戏的二次开发
    引言《球球大作战》虽然在玩法上类似于大球吃小球的模式看起来很单薄,但是在游戏过程中会出现无数种意外情况,这就需要玩家运用一系列策略来达到不被吃和吃掉别人球的目的,大大增加了游戏的耐玩性。游戏彻底抛弃了枯燥无味的单机模式,采取全球玩家联网实时对战。当竞技在PC端打的火热......
  • webpack5多入口的时候HtmlWebpackPlugin怎么处理多个html文件
    constHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={entry:{app1:'./src/app1.js',app2:'./src/app2.js'},output:{filename:'[name].bundle.js',path:path.resolve......