webpack loader-生成新的module

文章详细介绍了如何利用webpackloader的this._module.userRequest特性生成额外的module,在处理文件时,通过修改此属性可以创建一个不存在于源文件中的新module,这个新module会被webpack打包并导出。在示例中,当加载o4.js时,loader会生成一个新的moduleo4.jsooo4.js,并引入原始module,最终在构建后的代码中体现这种模块关系。
摘要由CSDN通过智能技术生成

作用

  • 在处理文件的过程中,通过loader生成一个额外的module,该module不是源文件中真实存在的文件,但会被webpack打包生成出来
  • 比如expose-loader中通过生成一个额外的module来导入原始module的内容,然后将导入内容挂载到全局,再导出原始module的导出

使用

  • 核心是使用this._module.userRequest,该API 可读可写,读返回原始文件的绝对路径,写入新的路径webpack会生成一个新的module
  • 相关可配合的API
    • 返回文件的相对路径:this.utils.contextify(this.context, this.remainingRequest)

webpack

{
    test:/o4.js$/,
    use:[
        {
            loader:'load',
        }
    ]
}

loader

  • 当处理原始文件’o4.js’时,通过this._module.userRequest生成一个新的module,然后新的module会引入原始module模块
  • 总体流程为:
    • 在构建时,当源文件请求o4.js文件,loader匹配o4.js文件,生成的module会变成如下的code内容,当webpack开始处理code时,又会解析到"./o4.js"依赖,所以又会生成真实的o4.js的module
function load(source,map,meta){
    const callback = this.async();
    //额外生成this._module.userRequest+'ooo4.js'命名的module
    this._module.userRequest = this._module.userRequest+'ooo4.js';
  	
    const code='import res from "-!./o4.js"; res();console.log("mm"); const f=function(){console.log("temp")}; export default f'
    
    callback(null,code)
} 


module.exports=load

构建后代码

(() => { // webpackBootstrap
var __webpack_modules__ = ({
	 "./src/o4.jsooo4.js":
		 ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
		
		"use strict";
		__webpack_require__.r(__webpack_exports__);
		__webpack_require__.d(__webpack_exports__, {
		  "default": () => (__WEBPACK_DEFAULT_EXPORT__)
		});
		
		var _o4_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!./o4.js */ "./src/o4.js");
		(0,_o4_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
		console.log("mm");
		const f = function () {
		  console.log("temp");
		};
		const __WEBPACK_DEFAULT_EXPORT__ = (f);
	}),
	"./src/o4.js":
		((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
		
		"use strict";
		__webpack_require__.r(__webpack_exports__);
		__webpack_require__.d(__webpack_exports__, {
		  "default": () => (__WEBPACK_DEFAULT_EXPORT__)
		});
		
		function f4(){
		   console.log('044444')
		}
		
		const __WEBPACK_DEFAULT_EXPORT__ = (f4);
	
	})
})

// ...

"use strict";
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
__webpack_require__.r(__webpack_exports__);

// ...

/* harmony import */ var _o4_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./o4.js */ "./src/o4.jsooo4.js");


// ...
(0,_o4_js__WEBPACK_IMPORTED_MODULE_3__["default"])();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值