gulp打包引用替换

2021-12-24 13:45:12 浏览数 (1)

关于 gulp 的基本使用方法前面有介绍。

Gulp使用指南

昨天,朋友问我一个问题。gulp打包给文件添加 hash 之后,怎么替换其他文件中引用的js(或者css),要替换成打包以后的带有 hash 的那一个文件。

其实主要用到的就是 gulp-rev 和 gulp-replace 这两个插件。

有三个js文件

a.js

代码语言:javascript复制
export default 'a';

b.js

代码语言:javascript复制
import a from 'a';
console.log(a)

export default 'b';

main.js

代码语言:javascript复制
import a from 'a';
import b from 'b';

console.log(a)
console.log(b)

三个js文件都需要打包并添加hash值。如果默认没有replace操作。那么打包后的main.js中的 import 的内容依旧是原来的。比如 import b from 'b'; 打包后还是 import b from 'b'; 而不是 import b from 'b-XXXXXXXX'; 这样带有hash的。

代码语言:javascript复制
const gulp = require('gulp');
const rev = require('gulp-rev');
const del = require('del');
const replace = require('gulp-replace');

// 清空打包目录
gulp.task('c', function (cb) {
  del(
    [
      // 这里我们使用一个通配模式来匹配 `mobile` 文件夹中的所有东西
      'dist/*',
    ],
    cb
  );
});

// 生成带有 hash 的js
gulp.task(
  'js',
  () =>
    gulp
      .src(['./src/*js'])
      .pipe(gulp.dest('dist')) // 将源文件拷贝到打包目录
      .pipe(rev())
      .pipe(gulp.dest('dist')) // 将生成的hash文件添加到打包目录
      .pipe(rev.manifest('js-rev.json')) // 生成映射文件
      .pipe(gulp.dest('dist')) // 将map映射文件添加到打包目录
);

// 替换hash
gulp.task('r', () => {
  const manifest = require('./dist/js-rev.json')
  for (const key in manifest) {
    const newKey = key.split('.')[0];
    manifest[newKey] = manifest[key].split('.')[0]
    delete manifest[key];
  }
  
  return (
    gulp
      .src('./dist/*.js')
      .pipe(replace(/import (S ) from ('|")(S )('|")/g, (match, a, b, c) => {
        return `import ${a} from '${manifest[c]}'`
      }))
      .pipe(gulp.dest('dist'))
  );
});

大概的就是上面的配置,至于其他的,比如说要 babel 转译。直接添加相关的插件即可。

在线地址

0 人点赞