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日

相关文章

  • nodejs中各种加密算法的实现详解

    “Node.js中各种加密算法的实现详解”总体上是介绍Node.js中常用的加密算法,包括哈希算法、对称加密和非对称加密。此攻略旨在让读者了解各种加密算法的实现原理及如何在node.js中使用这些算法。 1. 哈希算法 哈希算法又称为散列算法,用于将任意长度的消息压缩至一个固定长度的值,告诉我们原始输入的摘要值,常见的哈希算法有MD5和SHA系列,其中SHA…

    node js 2023年6月8日
    00
  • 安装@vue/cli报错npmERR gyp ERR问题及解决

    当我们在安装@vue/cli时,可能会遇到以下报错信息: npm ERR! gyp ERR! build error npm ERR! gyp ERR! stack Error: make failed with exit code: 2 npm ERR! gyp ERR! stack at ChildProcess.onExit (/usr/local/l…

    node js 2023年6月8日
    00
  • nodejs基于express实现文件上传的方法

    当我们需要在Node.js中实现文件上传功能的时候,通常使用Express.js框架来实现是一种非常方便可行的方法。本攻略将详细讲解如何使用Express.js框架来实现文件上传。 安装依赖 首先需要安装必要的依赖包,您需要在命令行中运行以下命令: npm install express multer –save 其中,multer是一个处理文件上传的 N…

    node js 2023年6月8日
    00
  • nodejs+axios爬取html出现中文乱码并解决示例

    下面是详细的攻略: 1. 前置知识 在讲解 nodejs+axios 爬取html出现中文乱码并解决示例之前,我们需要先了解以下术语和知识点: Node.js:一个基于Chrome V8引擎的JavaScript运行时,让JavaScript可以脱离浏览器运行,即在服务器端运行。 Axios:一个基于Promise的HTTP客户端,用于浏览器和Node.js…

    node js 2023年6月8日
    00
  • node.js实现上传文件功能

    Node.js是一种基于JavaScript的后端开发语言,在实现上传文件功能时也是非常好用的。下面是基于Node.js实现上传文件功能的完整攻略: 1. 安装依赖 使用Node.js实现上传文件功能需要依赖于multiparty和fs模块。multiparty是一个用来解析multipart/form-data类型数据的模块,fs是Node.js内置的文件…

    node js 2023年6月7日
    00
  • Nodejs读取文件时相对路径的正确写法(使用fs模块)

    当在Node.js应用程序中读取文件时,最常见的错误是文件路径错误。路径的总是以根目录的相对比较位置。在本文中,我们将讨论如何在使用fs模块时,正确设置文件路径并确保读取文件。 正确的相对路径表示法 使用相对路径时,始终记住相对于执行Node.js应用程序的文件所在的目录。 同时相对路径可以使用 ./ 或者 __dirname 辅助完成。 __dirname…

    node js 2023年6月8日
    00
  • Nodejs中解决cluster模块的多进程如何共享数据问题

    在 Node.js 中使用 cluster 模块创建多进程时,如果涉及到多个进程需要共享某些数据,需要特别注意数据共享的问题。 1. 使用 IPC 通信实现数据共享 在使用 cluster 模块创建多进程时,可以使用 IPC(进程间通信)方式实现多个进程之间的数据共享。IPC 是 Node.js 的标准模块之一,它提供了多种进程间通信的方式,包括共享内存、套…

    node js 2023年6月8日
    00
  • NodeJS遍历文件生产文件列表功能示例

    下面是关于“NodeJS遍历文件生产文件列表功能示例”的完整攻略。 前置知识 Node.js基础语法 文件系统(fs)模块的常用API 代码实现 实现遍历文件并生产文件列表,需要用到Node.js自带的文件系统模块(fs)。首先,我们需要引入fs模块。 const fs = require(‘fs’); 接着,定义一个函数readDirSync来遍历文件夹,…

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