解决html-webpack-plugin和html-loader冲突问题

本文介绍了一种解决html-webpack-plugin和html-loader在处理HTML模板时的冲突问题。当使用html-loader处理URL时,它会将HTML模板转化为JS模块字符串,导致html-webpack-plugin的ejs模板语法失效。解决方案是创建一个自定义loader——include-template-loader,在html-loader之前运行,预先编译自定义模板语法。文中给出了该loader的TypeScript实现,并提及项目已完成100%单元测试覆盖,可通过npm下载并添加到webpack配置中,位于html-loader之前。

近期公司有个多页面的网站需要开发,选择用webpack构建项目。
在编写webpack config 的过程中,发现html-webpack-plugin和html-loader有冲突。
如果使用html-loader来处理html模版文件中的url,会导致html-webpack-plugin的ejs模版语法失效。
经过研究发现html-loader会把原始的html模版,编译成一个js模块样式的字符串,导致html-webpack-plugin解析的时候,发现文件已经被编译了,会直接跳过模版语法的检测。
解决方案就是在html-loader执行之前,执行一个自定义的loader来预先编译自定义的模版语法。

下面是我自己用ts开发的一个html模版解析loader, include-template-loader

目录结构


├── src 
│   ├── index.ts
│   ├── interface.ts
│   ├── schema
│   │   └── schema.ts
│   └── utils
│       ├── options.util.ts
│       └── template-parser.util.ts
├── test 
│   ├── __mock__
│   │   ├── footer.html
│   │   ├── header.html
│   │   ├── index.html
│   │   ├── invalid-params.html
│   │   ├── nested.html
│   │   ├── sub-sub.html
│   │   ├── sub.html
│   │   └── without-params.html
│   ├── include-htm-loader.spec.ts
│   ├── options.util.spec.ts
│   └── template-parser.util.spec.ts
├── LICENSE
├── README.md
├── package-lock.json
├── package.json
└── tsconfig.json

开始

webpack loader 实际上就是一个默认导出的函数


// index.ts
import * as webpack from 'webpack';
import {
   
   Options} from './interface';
import {
   
   validateOptions, mergeOptions} from './utils/options.util';
import {
   
   templateParser} from './utils/template-parser.util';

export default function includeHtmlLoader(
  this: webpack.loader.LoaderContext,
  source: string
) {
   
   
  const defaultOptions: Options = {
   
   
    sign: ['{
   
   {', '}}'],
    deep: 5
  };

  const options = mergeOptions(defaultOptions, validateOptions
PS D:\code\pingan_fk> npm list vue-loader webpack vue-template-compiler pingan_fk@1.0.0 D:\code\pingan_fk +-- @vue/cli-plugin-babel@5.0.9 | +-- babel-loader@8.4.1 | | `-- webpack@5.76.0 deduped | +-- thread-loader@3.0.4 | | `-- webpack@5.76.0 deduped | `-- webpack@5.76.0 deduped +-- @vue/cli-plugin-eslint@5.0.9 | +-- eslint-webpack-plugin@3.2.0 | | `-- webpack@5.76.0 deduped | `-- webpack@5.76.0 deduped +-- @vue/cli-service@5.0.9 | +-- @soda/friendly-errors-webpack-plugin@1.8.1 | | `-- webpack@5.76.0 deduped | +-- @vue/vue-loader-v15@npm:vue-loader@15.11.1 | | `-- webpack@5.76.0 deduped | +-- copy-webpack-plugin@9.1.0 | | `-- webpack@5.76.0 deduped | +-- css-loader@6.11.0 | | `-- webpack@5.76.0 deduped | +-- css-minimizer-webpack-plugin@3.4.1 | | `-- webpack@5.76.0 deduped | +-- html-webpack-plugin@5.6.4 | | `-- webpack@5.76.0 deduped | +-- mini-css-extract-plugin@2.9.4 | | `-- webpack@5.76.0 deduped | +-- postcss-loader@6.2.1 | | `-- webpack@5.76.0 deduped | +-- progress-webpack-plugin@1.0.16 | | `-- webpack@5.76.0 deduped | +-- terser-webpack-plugin@5.3.14 | | `-- webpack@5.76.0 deduped | +-- vue-loader@17.4.2 | | `-- webpack@5.76.0 deduped | +-- vue-template-compiler@2.7.16 deduped | +-- webpack-dev-server@4.15.2 | | +-- webpack-dev-middleware@5.3.4 | | | `-- webpack@5.76.0 deduped | | `-- webpack@5.76.0 deduped | `-- webpack@5.76.0 deduped +-- css-loader@3.6.0 | `-- webpack@5.76.0 deduped +-- vue-loader@16.8.3 | `-- webpack@5.76.0 deduped +-- vue-template-compiler@2.7.16 `-- webpack@5.76.0 正确了吗
最新发布
09-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值