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

一、为什么需要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日

相关文章

  • node.js使用stream模块实现自定义流示例

    下面详细讲解使用Node.js的stream模块实现自定义流的过程。 1. 简介 Node.js中stream模块提供了一组基础抽象类,用于从各种数据源(例如文件、网络、或其他进程)读取数据或写入数据,并且可以通过链式调用实现一系列的数据转换。 在stream模块中,有四种基本类型的流:Readable可读流、Writable可写流、Duplex双工流和Tr…

    node js 2023年6月8日
    00
  • node.js中的querystring.unescape方法使用说明

    当我们在使用 Node.js 进行服务器开发的时候,经常会需要解析 URL 查询字符串。Node.js 的 querystring 模块提供了一系列的方法来完成 URL 解析的相关工作,其中就包括了 querystring.unescape 方法。 querystring.unescape 方法的介绍 querystring.unescape 方法用于对 U…

    node js 2023年6月8日
    00
  • 用NODE.JS中的流编写工具是要注意的事项

    使用Node.js中的流编写工具是一个非常实用的技能,它可以极大地提升Node.js的性能和可伸缩性。但是,在使用流进行编写工具时也需要注意一些事项。 1. 理解流的基本概念 在使用流进行编写工具前,我们需要理解Stream(流)的基本概念。Stream 是 Node.js 提供的基本 I/O 操作单元,允许数据在读写时通过 Stream 的机制进行数据传输…

    node js 2023年6月8日
    00
  • node.js中debug模块的简单介绍与使用

    node.js中debug模块的简单介绍与使用 简介 Debug是Node.js的一个核心模块,用于提供调试支持。它提供了一种比console.log()更方便的打印调试信息的方式,并支持控制调试输出级别。 安装 Debug模块是Node.js的核心模块,无需安装。 使用 先在js文件中引入debug模块: const debug = require(‘de…

    node js 2023年6月8日
    00
  • nodejs中密码加密处理操作详解

    当我们在处理用户账户系统时,一个重要的问题是如何安全地存储和处理用户密码。为了增加密码的安全性,我们常常需要将用户密码进行加密处理。本文将详细讲解在Node.js中如何进行密码加密处理。 密码加密处理的常见场景 在处理用户账户系统时,我们通常会面临以下两种常见的密码加密处理场景: 用户注册时将明文密码加密后存储到数据库中; 用户登录时将用户输入的密码与数据库…

    node js 2023年6月8日
    00
  • 使用GruntJS构建Web程序之Tasks(任务)篇

    使用GruntJS构建Web程序之Tasks(任务)篇 在 GruntJS 中,任务(Tasks)是指一组执行一些特定的工作的命令。GruntJS 提供了很多内置的任务,比如文件的复制、合并、压缩等等,同时也支持使用插件编写自定义任务。在本篇中,我们将深入学习 GruntJS 的任务相关知识。 任务的定义 下面是一个使用 GruntJS 定义任务的示例: m…

    node js 2023年6月8日
    00
  • node 可读流与可写流的运用详解

    Node 可读流与可写流的运用详解 概述 在 Node.js 中,读写操作一般来说都会使用流的方式进行。其中可读流提供了一种将数据从 source 输出到 destination 的抽象方式;而可写流则提供了一种将数据写入 destination 的抽象方式。对于数据中间处理过程,我们可以使用管道(piping)的方式链接可读流和可写流。 可读流 核心方法 …

    node js 2023年6月8日
    00
  • 用Nginx反向代理Node.js的方法

    使用Nginx反向代理Node.js是一种常见的解决方案,可以提高网站的性能和可靠性,同时保护应用程序免受攻击。以下是使用Nginx反向代理Node.js的完整攻略: 1. 安装和配置Node.js应用程序 第一步是安装和配置Node.js应用程序。这里以Express框架为例进行说明: 步骤一:安装Node.js 可以从Node.js官网下载最新版本的No…

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