TypeScript与JavaScript项目里引入MD5校验和

yizhihongxing

一、为什么需要MD5校验和

在前端开发过程中,我们经常需要加载网络上的静态资源,例如 JavaScript 文件、CSS 文件、图片等。如果文件在网络传输的过程中被修改或篡改,或者服务器上文件被修改,那么将会导致页面的异常。为了避免这种情况,需要使用 MD5 校验和来保证文件的完整性。

MD5 是一种哈希算法,将任意长度的信息压缩成一个128位(16字节)的信息摘要,具有不可逆、唯一性、不冲突的特点,能够有效地保护数据的完整性。

二、如何在 TypeScript/JavaScript 项目中引入 MD5 校验和

  1. 使用 Node.js 中的 crypto 模块

Node.js 中自带了一个 crypto 模块,支持多种哈希算法,包括 MD5。

示例1:计算字符串的 MD5 校验和

import crypto from 'crypto';

function calculateMD5(str: string): string {
  const hash = crypto.createHash('md5');
  hash.update(str);
  return hash.digest('hex');
}

const md5 = calculateMD5('hello world');  // '5eb63bbbe01eeed093cb22bb8f5acdc3'

示例2:计算文件的 MD5 校验和

import fs from 'fs';
import crypto from 'crypto';

function calculateFileMD5(path: string): Promise<string> {
  return new Promise((resolve, reject) => {
    const hash = crypto.createHash('md5');
    const stream = fs.createReadStream(path);
    stream.on('error', reject);
    stream.on('data', data => hash.update(data));
    stream.on('end', () => resolve(hash.digest('hex')));
  });
}

async function main() {
  const fileMD5 = await calculateFileMD5('file.txt');
  console.log(fileMD5);  // '3f3fc34bb032dc642beb6cda2dbc3f6c'
}

main();
  1. 使用第三方库 md5.js

md5.js 是纯 JavaScript 编写的 MD5 实现,可以在浏览器和 Node.js 环境下使用。

示例3:计算字符串的 MD5 校验和

import md5 from 'md5';

const strMD5 = md5('hello world');  // '5eb63bbbe01eeed093cb22bb8f5acdc3'

示例4:计算文件的 MD5 校验和

import fs from 'fs';
import md5 from 'md5';

function calculateFileMD5(path: string): Promise<string> {
  return new Promise((resolve, reject) => {
    const stream = fs.createReadStream(path);
    let md5sum = md5('');
    stream.on('error', reject);
    stream.on('data', data => md5sum = md5(md5sum + data));
    stream.on('end', () => resolve(md5sum));
  });
}

async function main() {
  const fileMD5 = await calculateFileMD5('file.txt');
  console.log(fileMD5);  // '3f3fc34bb032dc642beb6cda2dbc3f6c'
}

main();

三、在项目中引入 MD5 校验和

通过使用前面介绍的方法,我们可以计算出每个静态资源文件的 MD5 校验和。为了避免缓存问题,我们可以将计算出的 MD5 校验和作为静态资源文件的版本号,每次文件内容发生变化时更新版本号,这样浏览器就会重新下载文件,而不会从缓存中读取旧文件。

示例5:使用 webpack 打包项目,并自动添加 MD5 校验和版本号

const path = require('path');
const md5 = require('md5');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.ts',
  output: {
    filename: '[name].[contenthash].js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[contenthash].[ext]'
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      template: 'index.html',
      favicon: 'favicon.ico'
    })
  ],
  resolve: {
    extensions: ['.tsx', '.ts', '.js']
  },
  optimization: {
    moduleIds: 'hashed',
    runtimeChunk: 'single',
    splitChunks: {
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    }
  },
  output: {
    filename: '[name].[contenthash].js',
    path: path.resolve(__dirname, 'dist')
  },
  devServer: {
    contentBase: './dist'
  },
};

function addVersionParam(url) {
  const version = md5(url).slice(0, 8);
  return `${url}?v=${version}`;
}

// 修正 webpack 的输出文件路径,添加 MD5 校验和版本号
const originalPublicPath = __webpack_public_path__;
__webpack_public_path__ = function(url, ...args) {
  if (url.endsWith('.css') || url.endsWith('.js') || url.endsWith('.png') || url.endsWith('.svg') || url.endsWith('.jpg') || url.endsWith('.gif')) {
    url = addVersionParam(url);
  }
  return originalPublicPath.call(this, url, ...args);
};

在 webpack 配置文件中添加以上代码后,当打包完成后,输出的文件名中就会自动包含 MD5 校验和版本号,例如 main.3f3fc34b.js。

在 HTML 文件中引入这些文件时,也需要将文件名添加版本号,代码如下:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>My App</title>
  <link rel="stylesheet" href="<%= require('./main.css') %>" />
</head>
<body>
  <script src="<%= require('./main.js') %>"></script>
</body>
</html>

注意:由于以上代码使用了 md5() 方法,所以需要先在项目中安装 md5.js 库,例如:npm install md5

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:TypeScript与JavaScript项目里引入MD5校验和 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • windows 下安装nodejs 环境变量设置

    下面是 Windows 下安装 Node.js 环境变量设置的完整攻略。 安装 Node.js 前往 Node.js 官网(https://nodejs.org/),下载推荐的稳定版本(LTS)。 双击下载好的安装程序,按照提示完成安装。通常安装路径为 C:\Program Files\nodejs。 配置环境变量 打开“高级系统设置”对话框。可以通过以下方…

    node js 2023年6月8日
    00
  • Node.js编程中客户端Session的使用详解

    Node.js编程中客户端Session的使用详解 在Node.js编程中,我们通常需要向客户端保存一些数据或状态,以便在后续的请求中进行使用。其中一种常用的实现方式是使用Session。本文将详细讲解Node.js编程中客户端Session的使用方法。 什么是Session Session是Web应用程序中常用的一种状态管理机制,通过在服务端存储用户的信息…

    node js 2023年6月8日
    00
  • Node.js学习之地址解析模块URL的使用详解

    下面是“Node.js学习之地址解析模块URL的使用详解”的完整攻略。 概述 在Node.js中,可以通过地址解析模块URL来解析URL地址,获取其中的协议、主机名、路径等信息,从而方便地处理URL相关的业务逻辑。本攻略将详细介绍URL模块的相关属性和方法,以及如何结合实际应用场景进行使用。 URL模块的基本属性 在使用URL模块之前,需要将其进行引入: c…

    node js 2023年6月8日
    00
  • 解决vue项目运行npm run serve报错的问题

    下面是详细讲解“解决vue项目运行npm run serve报错的问题”的完整攻略。 问题描述 在开发 Vue 项目时,有时会遇到运行 npm run serve 命令时出现的报错信息。常见的报错信息包括但不限于: Module not found: Error: Can’t resolve ‘组件路径’ in ‘文件夹路径’ Failed to compi…

    node js 2023年6月8日
    00
  • 浅谈JS之tagNaem和nodeName

    浅谈JS之tagName和nodeName 简介 DOM(文档对象模型)是对HTML和XML文档的编程接口,它将整个文档表示为一棵树形结构。在DOM中,每个节点都是一个对象,每个节点都有自己的特性、方法和事件。 在DOM节点中,元素节点是常用的一种类型,它表示HTML文档中的具体标签内容。每个元素节点都有一个标签名(tagName)和一个节点名(nodeNa…

    node js 2023年6月8日
    00
  • node工作线程worker_threads的基本使用

    下面我将详细讲解“node工作线程worker_threads的基本使用”的完整攻略。 基本介绍 Node.js是一款基于V8引擎的JavaScript环境,因其高效、轻量、可扩展性强等特点,近年来备受各大企业的青睐。Node.js使用多个事件循环线程来处理并发请求,但在单个线程下,通过worker_threads模块可以实现多线程操作,提高代码执行效率。w…

    node js 2023年6月8日
    00
  • JavaScript使用ActiveXObject访问Access和SQL Server数据库

    介绍 在JavaScript中使用ActiveXObject对象可以轻松实现访问Access和SQL Server数据库的功能,其中Access数据库需要使用ADO(ActiveX Data Objects)驱动,而SQL Server数据库则需要使用SQL Server本身自带的.NET Framework数据提供程序。下面将详细讲解如何在JavaScri…

    node js 2023年6月8日
    00
  • 详解本地Node.js服务器作为api服务器的解决办法

    下面是“详解本地Node.js服务器作为API服务器的解决办法”的攻略。 初步准备 首先,你需要安装Node.js。如果你的系统上没有安装Node.js,可以在官方网站(https://nodejs.org/)上下载对应的版本并安装。安装完成后,你可以打开终端或命令行工具并输入以下命令来验证Node.js是否成功安装: node -v 如果输出了Node.j…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部