webpack练习之手写loader

手写一个style-loader来把样式文件插入head里面,准备工作 vue + webpack就自己弄了,webpack的一些配置也自己配置好

一、创建index.css文件

css 复制代码
.box{
    width: 100px;
    height: 100px;
    background-color: red;
}

然后在vue的main.js文件中引入它

二、创建自定义loader文件

javascript 复制代码
module.exports = function (content) {
  let str = `
                var style = document.createElement("style");
                style.innerHTML = ${JSON.stringify(content)};
                document.head.appendChild(style);
    `;
  return str;
};

webpack里面的loader配置

javascript 复制代码
{
        test: /\.css$/,
        use: [resolve(__dirname, "../loader/testSytleLoader.js")],
},

在APP.vue文件里面使用

javascript 复制代码
<template>
  <div class="box"></div>
  <router-view />
</template>

这个时候就会在页面看到效果了

三、升级优化

如果在样式文件中使用了背景图片,样式就会失败

原因就是在于背景图片的路径没有进行处理,浏览器找不到这个资源,因此我们还要处理背景图片,要是感兴趣可以自己去手写loader来处理,这里就直接使用css-loader来处理了,我们只需要处理css-loader处理好的内容

webpack的loader配置更改为

javascript 复制代码
 {
     test: /\.css$/,
     use: [resolve(__dirname, "../loader/testSytleLoader.js"),"css-loader"],
},

这个时候,页面就变成这样了

css-loader处理之后的内容变成了js代码,所以需要对这个js代码进行处理

我们这里使用pitch函数来进行处理,如果不知道啥事pitch函数,看上一篇文章

优化后的loader

javascript 复制代码
module.exports = function (content) {};
module.exports.pitch = function (remainingRequest) {
  // 要注意我使用的是箭头函数还是普通函数,这样才能保住this指向的正确性
  // remainingRequest  剩余还有哪些loader要来处理这个文件,也就是当前loader后面的所有loader
  console.log(remainingRequest);
  //打印结果: C:\项目\webpack-study\node_modules\css-loader\dist\cjs.js!C:\项目\webpack-study\src\assets\index.css
  // 结果表明后续还有css-loader来处理这个index.css文件,使用的!来分割


// 因为后面需要使用相对路径,所以需要使用this.utils.contextify来获取相对路径
  let absolutePath = remainingRequest
    .split("!")
    .map((path) => {
      return this.utils.contextify(this.context, path);
    })
    .join("!");
  console.log(absolutePath); //../../node_modules/css-loader/dist/cjs.js!./index.css

  let str = `
  /**
   * 这里相当于使用的内联loader,来获取css-loader处理好的内容,这里只能使用相对路径,所以才会有上面的处理,加!!防止继续执行css-loader的普通函数
  */
        import style from "!!${absolutePath}"  
        const styleEl = document.createElement("style");
        styleEl.innerHTML = style;
        document.head.appendChild(styleEl);
    `;
  return str;   //有了return,也不会执行css-loader了
};
相关推荐
小林ixn11 小时前
Node.js 文件系统与路径处理:从 API 到工程化实战
node.js·编辑器·vim
不听话坏11 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi0711 小时前
require 和 import的区别
开发语言·前端
pany12 小时前
做 AI 友好的开源 Vue3 模板 🌈
前端·vue.js·ai编程
小二·12 小时前
React 19 + Next.js 15 现代前端开发实战:App Router / Server Components / 流式渲染
前端·javascript·react.js
谙忆102413 小时前
前端图片直传对象存储:OSS/S3 预签名 URL、STS 临时凭证与回调校验
前端
CHNE_TAO_EMSM14 小时前
Android studio 打开文件时自动下载源码
前端·javascript·android studio
一孤程15 小时前
Airtest自动化测试第五篇:小程序与Web测试——跨平台自动化全覆盖
前端·自动化测试·小程序·自动化·测试·airtest
IT_陈寒15 小时前
SpringBoot自动配置不是你以为的那样的智能
前端·人工智能·后端
yume_sibai16 小时前
大屏数据可视化 - 边框红绿呼吸灯实现详解
前端·信息可视化·typescript