首页 > 其他分享 >Webpack中手动实现Loader与Plugin

Webpack中手动实现Loader与Plugin

时间:2023-04-10 16:13:32浏览次数:38  
标签:__ Plugin devtool webpack js loader source Webpack Loader

Loader

loader 是一个转换器,用于对源代码进行转换。

工作流程

  1. webpack.config.js 里配置了一个 模块 的 Loader;
    2.遇到 相应模块 文件时,触发了 该模块的 loader;
    3.loader 接受了一个表示该 模块 文件内容的 source;
    4.loader 使用 webapck 提供的一系列 api 对 source 进行转换,得到一个 result;
    5.将 result 返回或者传递给下一个 Loader,直到处理完毕。

举个例子。

loader.js (将所有含有“小明”字符串 全都改为“老王”)

  module.exports = function (source){
  return source.replace('小明','老王')
}

webpack.config.js

  const path = require('path')

module.exports = {
    mode: 'development',
    entry: {
        main: './src/index.js' //入口文件
    },
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                use: [
                    {
                        loader: path.resolve('./src/loader.js'), //我们自己实现的loader
                    },
                ]
            }
        ]
    },
}

index.js(入口文件)

  function test() {
  console.log('你好我是小明')
}
test()

编译后等待输出结果:
bound.js

  /*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/***/ (() => {

eval("function test() {\n  console.log('你好我是老王')\n}\n\ntest()\n\n\n//# sourceURL=webpack:///./src/index.js?"); //小明变成老王了

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = {};
/******/ 	__webpack_modules__["./src/index.js"]();
/******/ 	
/******/ })()
;

上述打包耗时:77ms

异步Loader

loader.js如下

  module.exports = function (source) {
  const callback = this.async()

  // 由于有 3 秒延迟,所以打包时需要 3+ 秒的时间
  setTimeout(() => {
    callback(null, `${source.replace('小明', '老王')}`)
  }, 3000)
}

上述打包耗时:3083ms

标签:__,Plugin,devtool,webpack,js,loader,source,Webpack,Loader
From: https://www.cnblogs.com/never404/p/17303238.html

相关文章

  • BlackLotus 分析3--http_downloader
    目录BlackLotus分析3--http_downloaderstartinit_ntdll_apiinit_other_apicommunication_140004804msftncsi_140003FD4getinfo_140005DFCisUEFISecureBootEnabled_140005CB4get_HWID_MAC_VolumeSerialNumber_md5wstrget_RegisteredOwner_data_140006238get_publicip_1400059FCget......
  • navicat 链接 mysql 2059-Authentication plugin 'caching_sha2_password' cannot be
      出现这个原因是mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password,解决问题方法有两种,一种是升级navicat驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password1、登录Mysql:mysql-uroot-p2、修改......
  • PySide2或PyQt5 运行时提示This application failed to start because no Qt platform
    1.把PySide2或者PyQt5安装在解释器目录下的 \plugins\platforms 目录添加到环境变量Path中。比如,我的环境就是把下面这个路径加到环境变量 Path 中 c:\Python38\Lib\site-packages\PySide2\plugins\platforms 2. 确保环境变量中没有中文......
  • seo优化问题 prerender-spa-plugin
    prerender-spa-plugin预渲染vue-cli是单页项目,只有一个index.html,对seo问题不优化prerender-spa-plugin预渲染可以生产多个目录,每个目录下都有一个index.html适合:一个项目可能某几个页面需要做seoprerender-spa-plugin运用时存在一些bug建议直接替换成prerender-spa-plugin-......
  • webpack 学习笔记1(入门)
    使用webpack的版本为v4.46.0,改版本为V4的最后一版本,暂时没考虑使用webpack5。#1 安装  [email protected]  [email protected]  翻译搜索复制......
  • DXImageTransform.Microsoft.AlphaImageLoader(滤镜实例)
    <html><head><scripttype="text/javascript">functionselectFile(oFile,imgname){if(oFile.value=="")return;varpos=oFile.value.lastIndexOf(".");varpos2=oFile.value.la......
  • 项目打包优化-HardSourceWebpackPlugin
    项目优化的方法HardSourceWebpackPlugin是一个插件,安装的方式npmihard-source-webpack-plugin引入文件,进行config文件的配置进行文件的热加载的,一个项目启动或者打包的时间,超过40s的时候,可以进行项目的优化和热加载。文件的加载,首先hard-source-webpack-plugin会进行文......
  • Failed to start bean 'documentationPluginsBootstrapper';nested exception is jav
    报错:Failedtostartbean‘documentationPluginsBootstrapper’;nestedexceptionisjava.lang.NullPointerException错误项目版本:springboot最新版本<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-sta......
  • PHP 文件加密Zend Guard Loader 学习和使用(如何安装ioncube扩展对PHP代码加密)
    一、大体流程图二、PHP项目文件加密 下表列出了Zend产品中的PHP版本及其内部API版本和Zend产品版本。如何加密请往后看三、如何使用第一步:确认当前环境AmaiPhalcon前,请确认您具备以下两个条件,如果您的环境不满足此条件,建议您对系统环境进行重新配置。条件1:PHP版本在5.5.X以上(......
  • vue项目启动时 `webpack-dev-server –inline –progress –config build/webpack.dev
    vue项目在npmrundev时报错[email protected]:webpack-dev-server--inline--progress--configbuild/webpack.dev.conf.js解决这类问题主要分两种情况这个项目已经构建好的项目,你只是从git、snv或者其他地方引入,别人能运行你不能运行这是一个新构建的vue项目第一......