实现一个骨架屏webpack插件

一. 原理

在vue的首页自动加上骨架屏代码。类似于下面:

 <div id="app">
    <app></app>
 </div>

加上骨架屏后:

 <div id="app">
    <app></app>
    <div>骨架屏 code</div>
 </div>

在app没有加载之前先看到的是骨架屏,加载完成之后骨架屏被替换。
由于直接写在这里面代码不好管理,我们把它抽出来,在编译阶段插进去。

二、实现

1. 写骨架skeleton.html

在index.html同级目录下新建文件skeleton.html
skeleton.html用于写骨架屏页面。

<style></style>
<div>骨架屏 code</div>
<script></script>
2. 在index.html里面加入插入标识

插标识是为了编译的时候识别

即为标识标记。
 <div id="app">
    <app></app>
    <!-- skeleton-outlet -->
 </div>
3. 写骨架屏插件

在webpack.config.js同级目录下新建Skeleton.js
Skeleton.js即骨架屏插件,骨架屏插件操作:把skeleton.html读取插入index.html
代码大致如下:

const fs = require("fs");

let Skeleton = function (options) {
  this.template = options.template;
};

Skeleton.prototype.apply = function (compiler) {
  const skeletonpath = this.template;
  compiler.plugin('compilation', compilation => {
    compilation.plugin('html-webpack-plugin-before-html-processing', (htmlData, callback) => {
    // 读取文件
      fs.readFile(skeletonpath, "utf-8", function(error, data) {
        if (error) {
          callback(null, htmlData);
        } else {
        // 插入文件
          htmlData.html = htmlData.html.replace('<!-- skeleton-outlet -->', data);
          callback(null, htmlData);
        }
      });
    });
  });
};
module.exports = Skeleton;
4. 使用骨架屏插件

在webpack.config.js中引入,再插件使用。

const Skeleton = require('../../build/Skeleton');

module.exports = {
  plugins: [
    new Skeleton({
      // 骨架路径
      template: './skeleton.html'
    })
  ]
};

运行后即可用了。

5. 优化

我们希望可以把插入标识可配置化。使用方式如下:

const Skeleton = require('../../build/Skeleton');

module.exports = {
  plugins: [
    new Skeleton({
      outlet: '<!-- skeleton-outlet -->', // 插入标识
      template: './skeleton.html' // 骨架路径
    })
  ]
};

则Skeleton可对应调整下:

const fs = require("fs");

let Skeleton = function (options) {
  this.template = options.template;
  // 接受标识配置
  this.outlet = options.outlet;
};

Skeleton.prototype.apply = function (compiler) {
  const { template, outlet } = this;
  compiler.plugin('compilation', compilation => {
    compilation.plugin('html-webpack-plugin-before-html-processing', (htmlData, callback) => {
    // 读取文件
      fs.readFile(template, "utf-8", function(error, data) {
        if (error) {
          callback(null, htmlData);
        } else {
        // 插入文件,采用动态标识
          htmlData.html = htmlData.html.replace(outlet, data);
          callback(null, htmlData);
        }
      });
    });
  });
};
module.exports = Skeleton;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Webpack一个 JavaScript 模块打包器,它的运行主要分为以下几个步骤: 1. 分析项目中的文件,找出所有的依赖关系; 2. 根据依赖关系生成一个依赖图; 3. 根据依赖图将所有的模块打包成一个或多个文件; 4. 将打包后的文件输出到指定目录,并在项目中引用。 我了解的几个常用的 webpack 插件有: 1. clean-webpack-plugin:清理构建目录中的无用文件; 2. html-webpack-plugin:自动生成 HTML 文件,并将打包后的文件自动添加到 HTML 中; 3. mini-css-extract-plugin:将 CSS 从主文件中分离出来,以 link 的形式引入 HTML 中; 4. optimize-css-assets-webpack-plugin:压缩 CSS 文件; 5. uglifyjs-webpack-plugin:压缩 JavaScript 文件。 ### 回答2: Webpack一个静态模块打包工具。它将多个模块的依赖关系以及模块本身转化为静态资源文件,使得浏览器可以加载并执行。Webpack 的运行过程分为以下几个步骤: 1. 配置:根据项目的需求,设置 webpack 的配置文件,包括入口文件、输出路径、插件等。 2. 入口分析:根据配置文件中的入口文件,Webpack 根据文件之间的依赖关系,递归地分析出所有的模块。 3. 加载器处理:Webpack 可以使用不同的加载器,将不同类型的文件转换为 JavaScript 模块。例如,可以使用 Babel 加载器将 ES6 代码转换为 ES5 代码。 4. 插件应用:Webpack 有很多插件可以使用,用于处理额外的任务,例如压缩代码、拷贝静态文件等。 5. 输出打包:根据配置文件中的输出路径和文件名,Webpack 将打包结果输出为静态资源文件,包括 JavaScript、CSS 和图片等文件。 常见的几个 Webpack 插件如下: 1. HtmlWebpackPlugin:自动生成 HTML 文件,并将打包生成的所有资源文件自动引入到 HTML 中。 2. MiniCssExtractPlugin:将 CSS 文件单独提取出来,并生成单独的 CSS 文件。 3. CleanWebpackPlugin:每次打包之前清理输出目录,避免旧的文件影响新的打包结果。 4. UglifyJsPlugin:压缩 JavaScript 代码,使其文件体积更小,加快网页加载速度。 5. CopyWebpackPlugin:将静态文件从源目录拷贝到输出目录,例如将图片等资源文件拷贝到 dist 目录。 这些插件都可以根据项目的需求,提供相应的功能增强,使得使用 Webpack 进行打包更加便捷和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三和小钢炮

谢谢客官~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值