加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

浅谈 Webpack 背后的运行机制

发布时间:2019-08-15 21:36:41 所属栏目:优化 来源:Alan
导读:副标题#e# 在平时开发中我们经常会用到 Webpack这个时下最流行的前端打包工具。它打包开发代码,输出能在各种浏览器运行的代码,提升了开发至发布过程的效率。 我们知道一份 Webpack配置文件主要包含入口( entry)、输出文件( output)、模式、加载器( Loader
副标题[/!--empirenews.page--]

在平时开发中我们经常会用到 Webpack这个时下最流行的前端打包工具。它打包开发代码,输出能在各种浏览器运行的代码,提升了开发至发布过程的效率。

我们知道一份 Webpack配置文件主要包含入口( entry)、输出文件( output)、模式、加载器( Loader)、插件( Plugin)等几个部分。但如果只需要组织 JS 文件的话,指定入口和输出文件路径即可完成一个迷你项目的打包。下面我们来通过一个简单的项目来看一下 Webpack是怎样运行的。

浅谈 Webpack 背后的运行机制

同步加载

本文使用 webpack ^4.30.0 作示例.为了更好地观察产出的文件,我们将模式设置为 development 关闭代码压缩,再开启 source-map 支持原始源代码调试。除此之外。我们还简单的写了一个插件 MyPlugin来去除源码中的注释。

新建 src/index.js

  1. console.log( Hello webpack! ); 

新建 webpack配置文件 webpack.config.js

  1. const path = require( path ); 
  2. const MyPlugin = require( ./src/MyPlugin.js ) 
  3.  
  4. module.exports = { 
  5. mode: development , 
  6. devtool: source-map , 
  7. entry: ./src/index.js , 
  8. output: { 
  9. path: path.resolve(__dirname, dist ) 
  10. }, 
  11. plugins:[ 
  12. new MyPlugin() 
  13. }; 

新建 src/MyPlugin.js。

  1. class MyPlugin { 
  2. constructor(options) { 
  3. this.options = options 
  4. this.externalModules = {} 
  5. apply(compiler) { 
  6. var reg = /("([^"]*(.)?)*")|( ([^ ]*(.)?)* )|(/{2,}.*?( 
  7. ))|(/*( 
  8. |.)*?*/)|(/******/)/g 
  9. compiler.hooks.emit.tap( CodeBeautify , (compilation)=> { 
  10. Object.keys(compilation.assets).forEach((data)=> { 
  11. let content = compilation.assets[data].source() // 欲处理的文本 
  12. content = content.replace(reg, function (word) { // 去除注释后的文本 
  13. return /^/{2,}/.test(word) || /^/*!/.test(word) || /^/*{3,}//.test(word) ? "" : word; 
  14. }); 
  15. compilation.assets[data] = { 
  16. source(){ 
  17. return content 
  18. }, 
  19. size(){ 
  20. return content.length 
  21. }) 
  22. }) 
  23. module.exports = MyPlugin 

现在我们运行命令 webpack --config webpack.config.js ,打包完成后会多出一个输出目录 dist: dist/main.js。 main 是 webpack 默认设置的输出文件名,我们快速瞄一眼这个文件:

  1. (function(modules){ 
  2. // ... 
  3. })({ 
  4. "./src/index.js": (function(){ 
  5. // ... 
  6. }) 
  7. }); 

整个文件只含一个立即执行函数 (IIFE),我们称它为 webpackBootstrap,它仅接收一个对象 —— 未加载的 模块集合( modules),这个 modules 对象的 key 是一个路径, value 是一个函数。你也许会问,这里的模块是什么?它们又是如何加载的呢?

在细看产出代码前,我们先丰富一下源代码:

新文件 src/utils/math.js:

  1. export const plus = (a, b) => {  
  2. return a + b;  
  3. }; 

修改 src/index.js:

  1. import { plus } from ./utils/math.js ; 
  2. console.log( Hello webpack! ); 
  3.  
  4. console.log( 1 + 2: , plus(1, 2)); 

我们按照 ES 规范的模块化语法写了一个简单的模块 src/utils/math.js,给 src/index.js 引用。Webpack 用自己的方式支持了 ES6 Module 规范,前面提到的 module 就是和 ES6 module 对应的概念。

接下来我们看一下这些模块是如何通 ES5 代码实现的。再次运行命令 webpack --config webpack.config.js后查看输出文件:

  1. (function(modules){ 
  2. // ... 
  3. })({ 
  4. "./src/index.js": (function(){ 
  5. // ... 
  6. }), 
  7. "./src/utils/math.js": (function() { 
  8. // ... 
  9. }) 
  10. }); 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读