返回顶部
首页 > 资讯 > 前端开发 > JavaScript >浅谈Webpack是如何打包CommonJS的
  • 760
分享到

浅谈Webpack是如何打包CommonJS的

2024-04-02 19:04:59 760人浏览 安东尼
摘要

目录一、书写代码二、使用webpack打包编译三、解析Commonjs 是 node 中的一种模块化规范,其是一种运行在 Node 环境下的代码,这种代码是不能直接运行到浏览器环境中

Commonjsnode 中的一种模块化规范,其是一种运行在 Node 环境下的代码,这种代码是不能直接运行到浏览器环境中的。但是在日常使用 WEBpack 的项目中不用做额外的处理,我们也能使用 CommonJS 来书写代码,那么 webpack 在这背后做了什么呢?

我们这里不看编译时,只看运行时

一、书写代码

使用yarn init -y命令初始化一个package.JSON文件。 接着yarn add webpack安装一下webpack。 目录下创建一个index.js内容如下:

const sum = require('./sum')

console.log(sum(1, 2))

sum.js文件内容如下:

module.exports = (...args) => args.reduce((x, y) => x + y, 0)

二、使用webpack打包编译

这里不想写webpack的配置文件然后再通过 webpack-cli 来打包,就直接写一个打包的文件。

// build.js
const webpack = require('webpack')

function f1() {
	return webpack({
		entry: './index.js',
		mode: 'none',
		output: {
			iife: false,
			pathinfo: 'verbose' // verbose: 冗余;尽可能的详细
		}
	})
}

f1().run((err, stat) => {
	console.log('打包')
})

接着在终端跑一下这个文件

node build.js

如果成功的话就会出来一个dist目录,里面有个main.js总共就是50行代码,其中大部分都是注释,代码如下

var __webpack_modules__ = ([
,
  
  
  
  
  
  ((module) => {
    module.exports = (...args) => args.reduce((x, y) => x + y, 0)
  })
]);

// The module cache
var __webpack_module_cache__ = {};

// The require function
function __webpack_require__(moduleId) {
  // Check if module is in cache
  var cachedModule = __webpack_module_cache__[moduleId];
  if (cachedModule !== undefined) {
    return cachedModule.exports;
  }
  // Create a new module (and put it into the cache)
  var module = __webpack_module_cache__[moduleId] = {
    // no module.id needed
    // no module.loaded needed
    exports: {}
  };

  // Execute the module function
  __webpack_modules__[moduleId](module, module.exports, __webpack_require__);

  // Return the exports of the module
  return module.exports;
}


var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
  
  
  
  const sum = __webpack_require__( 1)

  console.log(sum(1, 2))
})();

三、解析

我们再把代码精简一下,并加上注释

// 存放的模块,是一个数组
const __webpack_modules__ = [
  ,
  ((module) => {
    // sum.js 中的内容
    module.exports = (...args) => args.reduce((x, y) => x + y, 0)
  })
]

// 模块缓存(也就是说如果模块已经被引用过了就直接从这儿拿)
const __webpack_module_cache__ = {}

// moduleId 为 __webpack_modules__ 的下标
function __webpack_require__(moduleId) {
  // 如果能从缓存里面拿到,则直接返回
  const cachedModule = __webpack_module_cache__[moduleId]
  if (cachedModule !== undefined) return cachedModule.exports
  
  // 缓存内拿不到,则创建一个对象同时内部包含一个 exports 对象并存入到缓存内
  const module = __webpack_module_cache__[moduleId] = {
    exports: {}
  }
  
  // 接着通过执行 __webpack_modules__  中的moduleId对应函数并传入 module 对象
  // 通过函数内赋值 module.exports 获得 sum 函数
  __webpack_modules__[moduleId](module, module.exports, __webpack_require__)
  
  // 最后返回 module 中的 exports 对象
  return module.exports
}

(() => {
  // index.js 中的内容
  const sum = __webpack_require__(1)

  console.log(sum(1, 2))
})();

我们通过注释配合来解析一下

  • 首先执行立即执行函数(L32)中的__webpack_require__函数,并传入moduleId 为 1
  • __webpack_require__函数中尝试在__webpack_module_cache__中获取moduleId为 1 的模块(L16)
  • __webpack_module_cache__中获取失败之后创建一个object,同时内部有属性exports = {},并同时将其赋值给__webpack_module_cache__[moduleId](L20)
  • 执行对应的moduleId的函数__webpack_modules__[moduleId],同时将module对象作为入参,在函数内将sum函数赋值给参数module.exports对象(L6),如此module.exports就是sum函数了
  • 然后在__webpack_require__中返回 module.exports
  • 执行完__webpack_require__(1)以后将其返回值赋值给sum(L34)
  • 最后就可以调用sum函数了(L36)

到此这篇关于浅谈Webpack是如何打包CommonJS的的文章就介绍到这了,更多相关Webpack打包CommonJS内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈Webpack是如何打包CommonJS的

本文链接: https://lsjlt.com/news/149557.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈Webpack是如何打包CommonJS的
    目录一、书写代码二、使用webpack打包编译三、解析CommonJS 是 Node 中的一种模块化规范,其是一种运行在 Node 环境下的代码,这种代码是不能直接运行到浏览器环境中...
    99+
    2024-04-02
  • Webpack打包ES6和CommonJs的方法
    今天小编给大家分享一下Webpack打包ES6和CommonJs的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最开始我...
    99+
    2023-06-17
  • Webpack如何打包
    这篇文章给大家分享的是有关Webpack如何打包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。准备工作mkdir webpack_demo &&...
    99+
    2024-04-02
  • webpack如何打包js
    这篇文章主要为大家展示了“webpack如何打包js”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“webpack如何打包js”这篇文章吧。Webpack 是一个...
    99+
    2024-04-02
  • 浅谈QT打包的两种方式
    目录QT打包的两种方式具体步骤QT打包的两种方式 一个是QT5自带的windeployqt(不需要下载安装),它可以找到程序(exe)用到的所有库文件,并且都拷贝到exe程序的当前文...
    99+
    2023-03-10
    QT打包
  • webpack-cli在webpack打包中的作用是什么
    这篇文章主要讲解了“webpack-cli在webpack打包中的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“webpack-cli在webpack打包中的作用是什么”吧!web...
    99+
    2023-06-30
  • webpack+vue-cli项目如何打包
    小编给大家分享一下webpack+vue-cli项目如何打包,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.设置config文...
    99+
    2024-04-02
  • webpack中如何安装与打包
    小编给大家分享一下webpack中如何安装与打包,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一步、安装webpack新建文件...
    99+
    2024-04-02
  • webpack打包过程如何调试?
    本文适用于已经会使用webpack的前端开发人员,但是想进一步了解webpack细节和进阶。首先请读者按照我前一篇文章 Webpack 10分钟入门介绍的步骤,在本地搭建一个webpack的hello world项目。搭好之后的项...
    99+
    2023-06-03
  • webpack如何打包node.js后端项目
    这篇文章主要为大家展示了“webpack如何打包node.js后端项目”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“webpack如何打包node.js后端项目...
    99+
    2024-04-02
  • webpack如何打包less或sass资源
    这篇文章主要讲解了“webpack如何打包less或sass资源”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“webpack如何打包less或sass资源”...
    99+
    2024-04-02
  • webpack如何打包非模块化js
    小编给大家分享一下webpack如何打包非模块化js,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本文主要记录了非模块化js如何...
    99+
    2024-04-02
  • 如何使用webpack打包ts代码
    今天小编给大家分享一下如何使用webpack打包ts代码的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用 webpack ...
    99+
    2023-07-02
  • webpack如何创建项目并打包
    这篇文章主要介绍“webpack如何创建项目并打包”,在日常操作中,相信很多人在webpack如何创建项目并打包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”webpack如何创建项目并打包”的疑惑有所帮助!...
    99+
    2023-07-05
  • CommonJS是怎么导致打包后体积增大的
    本篇内容主要讲解“CommonJS是怎么导致打包后体积增大的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CommonJS是怎么导致打包后体积增大的”吧!什么是 CommonJSCommonJS...
    99+
    2023-06-15
  • webpack中如何压缩打包html资源
    本篇内容主要讲解“webpack中如何压缩打包html资源”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“webpack中如何压缩打包html资源”吧!为什么需要...
    99+
    2024-04-02
  • webpack如何实现拆分、打包、压缩
    这篇文章主要介绍webpack如何实现拆分、打包、压缩,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!步骤1.传统项目中的问题在不依赖任何自动化、模块化工具的项目中,通常我们的代码是这...
    99+
    2024-04-02
  • 浅谈React中的浅比较是如何工作的
    React 中浅比较的概念无处不在,它在不同的流程中起着关键的作用,也可以在React组件的多个生命周期中找到。比如,React Hooks中的依赖数组,通过React.memo进行...
    99+
    2024-04-02
  • webpack的打包流程和原理是什么
    这篇文章主要介绍“webpack的打包流程和原理是什么”,在日常操作中,相信很多人在webpack的打包流程和原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”webp...
    99+
    2024-04-02
  • webpack如何独立打包和缓存处理
    这篇文章将为大家详细讲解有关webpack如何独立打包和缓存处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。webpack最基本的配置文件来打包压缩我们的代码:var&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作