webpack打包后运行时文件分析(webpack5)

webpack打包,生命周期回调插件 webpack打包,生命周期回调,打包过程回调、结束回调,webpack自定义插件 阅读详情

本文基于webpack5,分析打包后的文件,参考了网上的资料,同时加上了个人的理解,欢迎讨论。
代码已经关联到github: 链接地址 觉得不错可以顺手点个star,这里会持续分享自己的开发经验(:

简单打包

文件介绍
//index.js 入口
import { cc } from './Test'
cc()

//Test.js
function cc(){}
export {cc}
运行时分析

webpack执行打包后生成的js文件是一个立即执行函数,其参数modules为一个对象{},包含我们所有要打包的文件。
这个立即执行函数主要分为以下部分:

  1. webpack_modules:保存webpack已经注册的模块,一个键值对的对象
  2. webpack_require:对应import(es6),实现模块加载和缓存,模块管理核心
  3. webpack_module_cache:模块缓存
  4. webpack_require.o:工具函数,判断是否有某属性
  5. webpack_require.d:对应export,用来定义导出变量对象
  6. webpack_require.r:区分是否es模块,给导出导出变量对象添加__esModule:true属性,用来兼容es和commonJS等模块的

模块加载执行流程:

  1. 模块使用 __webpack_require__ 加载模块,接受的参数是 moduleId (文件路径),返回的是模块的exports
  2. 首先会判断是否存在缓存,存在则返回模块的 exports ,不存在则创建一个模块并缓存
  3. 接着按照文件路径执行 __webpack_modules__ 中模块函数
  4. 执行完毕后返回模块的 exports
(() => { // webpackBootstrap
  "use strict";
  var __webpack_modules__ = ({

    "./src/web/Test.js":
      /*!*************************!*\
        !*** ./src/web/Test.js ***!
        \*************************/
      ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

        eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"cc\": () => (/* binding */ cc)\n/* harmony export */ });\nfunction cc(){\n\n}\n\n\n\n//# sourceURL=webpack://webpack_step1/./src/web/Test.js?");

      }),

    "./src/web/index.js":
      /*!**************************!*\
        !*** ./src/web/index.js ***!
        \**************************/
      ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

        eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Test */ \"./src/web/Test.js\");\n// import { count } from './Count'\n\n\n// count()\n(0,_Test__WEBPACK_IMPORTED_MODULE_0__.cc)()\n\n// // 异步加载\n// import('./Number').then(({number}) => {\n//     number()\n// });\n\n// if(module.hot){\n//     module.hot.accept('./Number',()=>{\n//         const numberDiv = document.getElementById('mynumber')\n//         document.body.removeChild(numberDiv)\n//         number()\n//     })\n// }\n\nconsole.log('web!!!333')\n\n//# sourceURL=webpack://webpack_step1/./src/web/index.js?");

      })

  });
  /************************************************************************/
  // The module cache
  var __webpack_module_cache__ = {};

  // The require function 加载函数
  function __webpack_require__(moduleId) {
    // Check if module is in cache
    if (__webpack_module_cache__[moduleId]) {
      return __webpack_module_cache__[moduleId].exports;
    }
    // Create a new module (and put it into the cache)__webpack_exports__
    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;
  }

  /************************************************************************/
  /* webpack/runtime/define property getters */
  (() => {
    // define getter functions for harmony exports
    __webpack_require__.d = (exports, definition) => {
      for (var key in definition) {
        if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
          Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
        }
      }
    };
  })();

  /* webpack/runtime/hasOwnProperty shorthand */
  (() => {
    __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
  })();

  /* webpack/runtime/make namespace object */
  (() => {
    // define __esModule on exports
    __webpack_require__.r = (exports) => {
      if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
        Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
      }
      Object.defineProperty(exports, '__esModule', { value: true });
    };
  })();

  /************************************************************************/

  // startup
  // Load entry module and return exports
  // This entry module can't be inlined because the eval devtool is used.
  var __webpack_exports__ = __webpack_require__("./src/web/index.js");

})();

打包后模块解析
__webpack_require__.r(__webpack_exports__);//es模块
__webpack_require__.d(__webpack_exports__, {//定义模块,并将导出的函数定义到模块的导出变量export当中
    "cc": () => ( /* binding */ cc)
});

function cc() {} //# sourceURL=webpack://webpack_step1/./src/web/Test.js?

含有异步加载的打包

文件介绍
//index.js 入口
import { cc } from './Test'
cc()
// 异步加载
import('./Number').then(({ number }) => {
    number()
});
console.log('web!!!333')

//Test 省略

//Number.js
export function number(){
    const div = document.createElement('div')
    div.innerHTML = 100
    div.setAttribute('id','mynumber')
    document.body.appendChild(div)
}
运行时分析

异步打包的模块,多出了以下方法

  1. installedChunks:缓存异步加载的模块键值对集合,内部存的模块有未加载,加载中,加载完毕几种形式。
  2. webpack_require.e:加载异步模块的入口方法,使用 __webpack_require__.f.j 方法加载模块。
  3. webpack_require.f:异步加载方法集,方便后续添加其他异步加载方法。
  4. webpack_require.f.j :异步加载js的方法,主要是将js异步的Promise设置到installedChunks 中(webpackJsonpCallback会调用),还处理其他拦截相同文件加载、加载文件的url、加载异常回调的等,最后会调用 __webpack_require__.l 加载js文件。
  5. webpack_require.l::动态创建script标签去加载js文件。
  6. webpackJsonpCallback:异步js文件内部执行方法,主要是 1.将installedChunks 中的对应模块的Promise fullfill掉,执行引入异步加载import().then的代码 2.将异步模块存到 __webpack_modules__ 这个全局注册模块集合中。
  7. webpack_require.p:获得公共路径
  8. webpack_require.g:全局this

模块加载执行流程:

// 引入异步js模块
__webpack_require__.e("src_web_Number_js").then(
    __webpack_require__.bind(__webpack_require__,"./src/web/Number.js")//注意这里注入了一个加载js的函数
  ).then(
    ({number}) => {
      number()//执行异步函数
    }
);
  1. 异步加载时,从入口文件出发,发现有异步加载的js则调用 __webpack_require__.e -> __webpack_require__.f.j -> __webpack_require__.l , 使用动态创建script标签的形式 下载模块文件,下载完毕后最终 __webpack_require__.e 的会返回一个的promise的实例(Promise.all)
  2. 下载完毕的js会自动执行self["webpackChunkwebpack_step1"].push 方法,该方法已经在入口文件加载时重置成为了 webpackJsonpCallback 函数,用来触发引入该异步模块的回调(将第一步的Promise.all状态修改成fullfilled)和缓存该异步模块。
  3. 如果在我们的js代码中,如果是 import('').then() 格式,则在__webpack_require__.e 执行完毕返回,会执行 __webpack_require__ 去引入对应的异步模块文件
  // expose the modules object (__webpack_modules__)
  __webpack_require__.m = __webpack_modules__; 

	/* webpack/runtime/ensure chunk */
  (() => {
    __webpack_require__.f = {};
    // This file contains only the entry chunk.
    // The chunk loading function for additional chunks
    __webpack_require__.e = (chunkId) => {
      return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
        __webpack_require__.f[key](chunkId, promises);
        return promises;
      }, []));
    };
  })();

	/* webpack/runtime/global 获得this*/
	(() => {
		__webpack_require__.g = (function() {
			if (typeof globalThis === 'object') return globalThis;
			try {
				return this || new Function('return this')();
			} catch (e) {
				if (typeof window === 'object') return window;
			}
		})();
	})();

  /* webpack/runtime/get javascript chunk filename */
  (() => {
    // This function allow to reference async chunks
    __webpack_require__.u = (chunkId) => {
      // return url for filenames based on template
      return "" + chunkId + ".js";
    };
  })();

	/* webpack/runtime/load script JSONPscript标签的方式异步模块加载函数,真正动态去加载js文件*/
	(() => {
		var inProgress = {};
		var dataWebpackPrefix = "webpack_step1:";
		// loadScript function to load a script via script tag
		__webpack_require__.l = (url, done, key, chunkId) => {
			//存在正在加载相同的模块则存入回调函数,待js文件加载完再执行
			if(inProgress[url]) { inProgress[url].push(done); return; }
			var script, needAttach;
			//判断是否该模块的js文件已经加载过,加载过则重新
			if(key !== undefined) {
				var scripts = document.getElementsByTagName("script");
				for(var i = 0; i < scripts.length; i++) {
					var s = scripts[i];
					if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; }
				}
			}
			// 动态创建srcipt标签,使用jsonp的模式异步加载
			if(!script) {
				needAttach = true;
				script = document.createElement('script');
		
				script.charset = 'utf-8';
				script.timeout = 120;
				if (__webpack_require__.nc) {
					script.setAttribute("nonce", __webpack_require__.nc);
				}
				script.setAttribute("data-webpack", dataWebpackPrefix + key);
				script.src = url;
			}
			// js加载的处理:1.js加载出错,2.js加载完毕,执行回调 3.js加载超时
			// 3种情况满足一种均会进行删除该scrpit标签
			inProgress[url] = [done];
			var onScriptComplete = (prev, event) => {
				// avoid mem leaks in IE.
				script.onerror = script.onload = null;
				clearTimeout(timeout);
				var doneFns = inProgress[url];
				delete inProgress[url];
				script.parentNode && script.parentNode.removeChild(script);
				doneFns && doneFns.forEach((fn) => (fn(event)));
				if(prev) return prev(event);
			}
			;
			// 加载超时(2分钟)处理
			var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
      // 其他情况处理
			script.onerror = onScriptComplete.bind(null, script.onerror);
			script.onload = onScriptComplete.bind(null, script.onload);
			needAttach && document.head.appendChild(script);
		};
	})();

/* webpack/runtime/publicPath 获得公共路径*/
(() => {
  var scriptUrl;
  if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
  var document = __webpack_require__.g.document;
  if (!scriptUrl && document) {
    if (document.currentScript)
      scriptUrl = document.currentScript.src
    if (!scriptUrl) {
      var scripts = document.getElementsByTagName("script");
      if(scripts.length) scriptUrl = scripts[scripts.length - 1].src
    }
  }
  // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
  // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
  if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
  scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
  __webpack_require__.p = scriptUrl;
})();


(() => {
    // no baseURI

    // 该对象用户缓存已经加载和正在加载的chunk,在入口文件(把入口文件也当做一个chunk)中初始化,初始化后包含了入口chunk的状态,
    // 此例中入口chunk的Id为web,webpack分配chunkId是0开始计数递增的,实际上入口chunk的Id一定是最大的,从上面的代码中值0表示当前的入口chunk已经加载了。
		// undefined = chunk not loaded, null = chunk preloaded/prefetched
		// Promise = chunk loading, 0 = chunk loaded
		var installedChunks = {
			"web": 0
		};


		__webpack_require__.f.j = (chunkId, promises) => {
				// JSONP chunk loading for javascript
				var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
				//判断是否已加载
				if(installedChunkData !== 0) { // 0 means "already installed".
		
					// 正在加载则存入promises等待加载完毕 a Promise means "currently loading".
					if(installedChunkData) {
						promises.push(installedChunkData[2]);
					} else {
						if(true) { // all chunks have JS
							// setup Promise in chunk cache 将加载的模块缓存,将其缓存到installedChunks及推到promises
							var promise = new Promise((resolve, reject) => {
								installedChunkData = installedChunks[chunkId] = [resolve, reject];
							});
							promises.push(installedChunkData[2] = promise);
		
							// start chunk loading
							var url = __webpack_require__.p + __webpack_require__.u(chunkId);
							// create error before stack unwound to get useful stacktrace later
							var error = new Error();
							//加载完毕回调函数,处理异步加载js出错
							var loadingEnded = (event) => {
								if(__webpack_require__.o(installedChunks, chunkId)) {
									installedChunkData = installedChunks[chunkId];
									if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
									if(installedChunkData) {
										var errorType = event && (event.type === 'load' ? 'missing' : event.type);
										var realSrc = event && event.target && event.target.src;
										error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
										error.name = 'ChunkLoadError';
										error.type = errorType;
										error.request = realSrc;
										installedChunkData[1](error);
									}
								}
							};
							__webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
						} else installedChunks[chunkId] = 0;
					}
				}
		};

    // no prefetching

    // no preloaded

    // no HMR

    // no HMR manifest

    // no deferred startup

		// install a JSONP callback for chunk loading
		var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
			var [chunkIds, moreModules, runtime] = data;
			// add "moreModules" to the modules object,
			// then flag all "chunkIds" as loaded and fire callback
      var moduleId, chunkId, i = 0, resolves = [];
      // 遍历需要执行的chunk
			for(;i < chunkIds.length; i++) {
        chunkId = chunkIds[i];
        // 如果该chunk正在加载中状态
				if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
          // 暂存该chunk对应Promise的resolve方法
          resolves.push(installedChunks[chunkId][0]);
        }
        // 将该chunk的状态置为加载完成
				installedChunks[chunkId] = 0;
      }
      // 遍历这些chunk依赖的模块并缓存模块到modules对象中,这个对象是在入口文件的最外层方法当做参数传入的
			for(moduleId in moreModules) {
				if(__webpack_require__.o(moreModules, moduleId)) {
					__webpack_require__.m[moduleId] = moreModules[moduleId];
				}
			}
      if(runtime) runtime(__webpack_require__);
      // 将加载的chunk存入chunkLoadingGlobal
      if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
      // 将加载的chunk对应的Promise fullfill掉,这时就会加载import().then的代码
			while(resolves.length) {
				resolves.shift()();
			}
		
		}
		//全局加载的chunk
		var chunkLoadingGlobal = self["webpackChunkwebpack_step1"] = self["webpackChunkwebpack_step1"] || [];
    //如果已经存在全局加载的chank模块信息,则遍历去加载
    chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
    //将全局加载的chunk的push函数修改成webpackJsonpCallback,并将chunkLoadingGlobal以前的push函数作为第一个预置参数,将后续加载的异步模块存到chunkLoadingGlobal
		chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
		// no deferred startup
  })();
打包后的模块解析解析
//入口
__webpack_require__.r(__webpack_exports__);//es模块
var _Test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__( /*! ./Test */ "./src/web/Test.js");//引入同步js模块
(0, _Test__WEBPACK_IMPORTED_MODULE_0__.cc)()
// 引入异步js模块
__webpack_require__.e("src_web_Number_js").then(
    __webpack_require__.bind(__webpack_require__,"./src/web/Number.js")//注意这里注入了一个加载js的函数
  ).then(
    ({number}) => {
      number()//执行异步函数
    }
);
console.log('web!!!333') //# sourceURL=webpack://webpack_step1/./src/web/index.js?

//Number.js
(self["webpackChunkwebpack_step1"] = self["webpackChunkwebpack_step1"] || []).push([["src_web_Number_js"], {
    "./src/web/Number.js": ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

        "use strict";
        eval(
            "__webpack_require__.r(__webpack_exports__); __webpack_require__.d(__webpack_exports__, {   "
            number ": () => (/* binding */ number) });function number(){    const div = document.createElement('div')    div.innerHTML = 100    div.setAttribute('id','mynumber')    document.body.appendChild(div)}//# sourceURL=[module]//# sourceURL=webpack-internal:///./src/web/Number.js"
        );
    })
}]);

runtime.js

从上面的打包可以看出,在入口 web.js 文件中,包含了webpack的运行环境(具体作用就是模块解析, 加载) 和 模块信息清单,在webpack中称为 runtime ,模块信息清单在每次有模块变更(hash 变更)时都会变更, 所以我们想把这部分代码单独打包出来, 配合后端缓存策略, 这样就不会因为某个模块的变更导致包含模块信息的模块(通常会被包含在最后一个 bundle 中)缓存失效。
在 webpack.config.js 就可以配置:


module.exports = {
    optimization: {
        runtimeChunk: {
            name: 'runtime' // 将runtime分离
        },
    },
}

这样子实现,则模块的和runtime就会分别打包,我们都知道js标签的加载顺序会影响到相关js的执行,这里我们的模块必须依赖runtime.js ,如果模块js先加载,而runtime.js而后才加载,会不会导致问题呢?
经测试是不会,其实就跟我们之前的异步加载js模块类似,还记得全局变量 chunkLoadingGlobal 么?

webpack 运行时内部维护了一个数组变量, 这个变量被挂载在 window 对象上:

window["webpackChunkwebpack_step1"] = []

无论是 runtime 还是普通的 chunk 都会在IIFE函数中试图去读取这个属性, 如果没有读取到就为其赋值一个数组.

(window["webpackChunkwebpack_step1"] = window["webpackChunkwebpack_step1"] || []).push(xxx) // 除了runtime,每一个chunk都有

runtime的立即执行函数中, 会判断如果 window["webpackChunkwebpack_step1"] 的是否已包含内容, 如果有,也就意味着 runtime 加载之前有其他 chunk 加载了, 此时 runtime 就会读取这个数组中的内容然后在进行解析上之前加载完成的 chunk 。

var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
		//...
}
//全局加载的chunk
var chunkLoadingGlobal = self["webpackChunkwebpack_step1"] = self["webpackChunkwebpack_step1"] || [];
  //如果已经存在全局加载的chunk模块信息,则遍历去加载
  chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
  //将全局加载的chunk的push函数修改成webpackJsonpCallback,并将chunkLoadingGlobal以前的push函数作为第一个预置参数,将后续加载的异步模块存到chunkLoadingGlobal
chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
webpack5打包生成文件分析(commonjs和es6模块系统) 目录相关配置生成文件分析es6模块和commonjs模块输出值es6模块和commonjs模块动态加载es6模块和commonjs模块循环引用参考链接demo 相关配置 webpack5 // webpack.config.js module.exports = { mode: 'none' } // index.js import str from "./main.js"; console.log(str); // main.js export default "hello leo~"; 生成 阅读详情

相关推荐

关于webpack5打包时生成LICENSE.txt文件的解决方案

问题 最近在使用webpack5进行打包时,多出了一个LICENSE.txt的文件,查阅官网资料,找到了解决办法。 官方: https://webpack.js.org/plugins/terser-webpack-plugin/ 如何解决? 原因 解决办法 module.exports = { optimization: { minimize: true, minimizer: [new TerserPlugin({ extractCom

随心所欲的便笺 4131

Webpack 运行时代码分析 - 动态加载

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

发果叁 1267

webpack打包css

webpack打包1.打包css2..打包逻辑1-1.webpack打包css逻辑3.打包css4.打包成独立的css文件5.添加样式前缀6.格式校验7.压缩css8.我们为什么要用这个打包工具呢9.webpack的打包顺序10.总结 1.打包css 2…打包逻辑 1-1.webpack打包css逻辑 非js文件打包 需要对应的loader css-loader将css转化为js style-loader把包含css内容的js代码 挂载到页面的<style>标签 引入css(import

m0_53266704的博客 2225

Webpack 打包后代码执行时机分析与优化

代码执行时机将决定着是否能够正常执行,当依赖文件没加载完成就开始执行、使用对应模块,那么将会导致执行异常。这在 “存在资源加载失败时,加载重试影响原来文件的执行顺序” 的场景下尤为常见。 webpack 构建除了进行模块依赖管理,实际上,也天然地管理了 entry 与 chunk 多文件的执行时机,但缺少了对 external 文件管理,当 external 文件加载失败或未完成时,执行、使用对应模块同样将导致异常。为此,wait-external-webpack-plugin应运而生,以 webpac.

Jack, what else can you do besides holding your little darling? 579

Webpack 打包配置演进:运行时代码的分离与缓存优化

在前端工程中,打包工具(如 Webpack)的配置直接影响最终产物的性能和可维护性。近年来,一个显著的优化趋势是将运行时代码(Runtime Code)从业务代码中分离,生成独立的 文件。本文将深入探讨这一变化的核心原理、新旧配置的差异,以及开发者应如何选择。运行时代码是打包工具自动生成的一段“基础设施”代码,负责:特征:缺点:特征:优点: 2. 产物结构 五、何时保留内联运行时? 尽管独立运行时是更优解,但以下场景可考虑内联:独立打包运行时代码通过解耦业务逻辑与基础设施,实现了:建议开发者:通过这一

技术广场 924

联想ThinkPad声卡驱动安装避坑指南:从E470到X1 Carbon的通用解法

本文详细介绍了ThinkPad声卡驱动安装的全流程,从硬件识别到驱动获取、安装技巧及深度排错。涵盖E470到X1 Carbon等不同机型的通用解法,帮助用户解决音频驱动问题,提升使用体验。重点讲解了声音驱动的精准识别和安装策略,确保系统稳定运行。

weixin_29207439的博客 708

Vue运行报错——__WEBPACK_IMPORTED_MODULE_1_vue_router__.a.beforeEach is not a function解决办法

问题图示 解决办法 导入路由时应从vue-router导入 ./router中是没有路由对象的,所以npm运行不了

shang_0122的博客 1万+

Python爬虫实战:西瓜视频m3u8解析与FFmpeg下载合并

网络爬虫与流媒体解析是Python工程实践中的常见需求,其核心在于通过HTTP请求获取数据并解析特定格式。m3u8作为HLS协议索引文件,将视频切分为ts分片,便于流式传输。结合FFmpeg的多线程处理能力,可高效完成分片下载与合并,技术价值在于提升视频处理效率。典型应用场景包括视频下载、离线缓存等。本文以西瓜视频为例,详细讲解如何使用requests库提取m3u8地址,并调用FFmpeg批量下载ts分片合并为mp4,涵盖请求伪装、索引解析及常见问题排查。

weixin_31856057的博客 15万+

webpack热更新原理解析

webpack热更新原理解析

落枫秋歌 1488

OpenWrt kmod内核不兼容?手把手教你用脚本强制安装驱动模块(附国内镜像源)

本文详细解决了OpenWrt kmod内核不兼容问题,提供智能脚本强制安装驱动模块的方法,并附有国内镜像源加速配置。通过自动化脚本修改内核MD5校验值,确保kmod包正常安装,同时推荐多个国内镜像源以提升下载速度。

weixin_42549451的博客 542

图解B树的原理及操作

本文主要参考:https://blog.youkuaiyun.com/shenchaohao12321/article/details/83243314 1. B树 1.1 B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-

jinking01的专栏 3万+

webpack打包vue项目之后生成的dist文件该怎么启动运行

亲测,webpack打包vue项目之后生成的dist文件可以部署到 express 服务器上运行。我的vue项目结构如下:1. 进入该vue项目目录,打开git bash,执行:npm run build(在package.json的scripts配置)执行成功如下图所示:然后此时你会发现项目下多了一个 dist 文件夹,dist下文件便是项目打包之后生成的文件。此时我们直接在浏览器中打开inde...

u014054437的博客 10万+

【020】基于51单片机智能路灯系统Proteus仿真与实物设计

【020】基于51单片机智能路灯系统Proteus仿真与实物设计

小邓子分享官的博客 1878

Webpack5之代码打包

webpack准备工作webpack如何修改输入输出的文件路径Webpack打JavaScriptwebpack自动生成HTML文件webpack打包CSS文件webpack压缩CSS

2403_87998453的博客 1122

数理逻辑1 -- 命题演算1

一直对逻辑的东西很感兴趣,尤其最近做的东西和AI相关,因此下定决心系统地学习数理逻辑。这些笔记并不是严谨的描述,只是作为一些概念的快速参考,以及加入一些个人认为好玩的公式、定理和推导。 简单来说,数理逻辑系统是由一串“符号”组成的系统,基本元素是那一堆“符号”,由“符号”组成“式子”。逻辑系统并不关心“式子”是否对错,只关心“式子”是否存在,也即是假定存在某些“式子“,再确定”推导规则“(Rule

Jason渣神的专栏 1831

CCAR-23《正常类飞机适航规定》和CCAR-25《运输类飞机适航规定》差异分析

通过详细比较CCAR-23和CCAR-25在适用范围、设计标准、性能要求、运行限制、安全冗余和环境适应性方面的差异,我们可以看出,CCAR-23适用于轻型飞机,开发和运营成本较低,设计要求相对简单。而CCAR-25适用于大规模运输飞机,设计、开发、测试和运营管理都需要更高的复杂性和投入。

qq_41854911的博客 3706

webpack打包时如何修改文件名

webpack打包时如何修改文件名 在使用webpack进行项目打包的时候,我们可通过以下方式对不同类型的资源,进行文件名或文件路径的修改

hfhan的博客 6469

「UG/NX」BlockUI 控件集合目录大纲

Block UI Styler 模块设计对话框是官方推荐使用的对话框制作方法,它能够与NX自身风格相统一,在实际开发中经常使用。文字内容包含:NX所有控件介绍的链接、内部控件调用的基础介绍、官方案例查看路径、控件的特殊用法篇链接、番外篇链接。

何曾参静谧的博客 2674

【webpack】cjs运行时分析

webpack runtime

lucky569的博客 622

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

vue webpack文件打包后的文件如何本地运行

1、安装express-generator npmi express-generator -g 2、创建一个express项目 expressmy-express-project 3、进入项目目录 cdmy-express-project 这时候能看到my-express-project文件夹下的内容是这样的 4、安装相关项目依赖 npm install 然后把刚刚打包后的dist文...

xiaoshengjinbu的博客 2718

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何运行webpack打包的vue项目之后的dist文件

1、打包vue项目:npm run build会生成一个dist文件 express是一个基于node.js平台的web开发框架 2、安装express、express-generator npm install express -g npm i express-generator -g 3、创建expressDemo项目 express exp...

qq_35165469的博客 3293

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Webpack5打包-禁止生成LICENSE文件

问题背景 最近将项目中的Webpack3升级到了Webpack5,打包之后发现输出文件中多了一些LICENSE文件,如下图所示: 看着就感觉怪怪的,和升级之前的输出文件不一样,总感觉是那处了问题,于是查阅资料… 问题分析 多输出了一些文件,那这可能是打包的输出配置出了岔子或者是用的插件中配置不太对。 于是检查自己的配置… 没发现什么问题呀…没看到有啥配置会让我打包输出这些文件的… 于是再仔细看看官方文档吧。 果然在这里发现了蛛丝马迹: Webpack 5 默认压缩代码工具为terser-webpack-

LYFlied的博客 6641

【webpack】使用webpack打包图片文件、打包时生成单独的css文件

使用webpack打包图片文件 在scr目录下创建image文件夹,并且添加几张图片 在main.js使用import方式引入所有图片,并且append到app节点下 // 引入图片资源 import i1 from './image/image1.png' import i2 from './image/image2.png' // 创建图片对象 let img1 = document.createElement('img') img1.src = i1 let img2 = document.cr

wusq的博客 1703

webpack学习之打包生成新的文件时 自动删除上次打包出来的文件

当webpack 打包时的 filename 设置的是 固定的名称时,每次打包的时候,新的文件会覆盖原来的文件,这样就不用删除原来的 output 出来的文件夹 但是如果 filename = “[name].bundle.[hash:5].js” 这样的有占位符的文件名,每次生成的文件名是不一样的,也就不会去覆盖上次生成的文件,手动每次打包前,去先把 output的目录给删除掉就太麻烦了 这时我...

时清云的博客 3396

使用webpack打包js文件

使用Webpack打包js文件 Webpack 是一个开源的前端打包工具,是一个现代JavaScript应用程序的静态模块打包器(module bundler)。 Webpack 提供了前端开发缺乏的模块化开发方式,将各种静态资源视为模块,并从它生成优化过的代码。 1、模块化的演进 script标签 缺点: 全局作用域下容易造成变量冲突 文件只按照script书写顺序加载 需要主观解决模块和代码库的依赖关系 大型项目中各种资源难以管理 CommonsJS CommonsJS规范核心思想是允许模块

Okalin的博客 2514
上一篇: 虚拟DOM和DOM diff 记录 (增加fiber)
下一篇: 如何获得iframe内部的body和其他元素
Qssn丶
博客等级 码龄11年 88粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值