Skip to content

Commit 07c5213

Browse files
committed
perf: remove the dependency on imagemin
BREAKING CHANGE: the dependency on imagemin is changed to be imported from outside
1 parent 804b59f commit 07c5213

File tree

3 files changed

+41
-41
lines changed

3 files changed

+41
-41
lines changed

package.json

+3-12
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,11 @@
3232
"url": "https://github.com/iChengbo/react-native-imagemin-asset-plugin/issues"
3333
},
3434
"homepage": "https://github.com/iChengbo/react-native-imagemin-asset-plugin#readme",
35-
"dependencies": {
36-
"imagemin": "^7.0.1"
37-
},
3835
"devDependencies": {
3936
"@semantic-release/changelog": "^6.0.3",
4037
"@semantic-release/git": "^10.0.1",
4138
"@types/imagemin": "^8.0.1",
42-
"@types/imagemin-gifsicle": "^7.0.4",
43-
"@types/imagemin-jpegtran": "^5.0.2",
44-
"@types/imagemin-mozjpeg": "^8.0.2",
45-
"@types/imagemin-optipng": "^5.2.2",
46-
"@types/imagemin-pngquant": "^8.0.0",
47-
"@types/imagemin-svgo": "^10.0.5",
48-
"@types/imagemin-webp": "^7.0.1",
39+
"imagemin": "^7.0.1",
4940
"imagemin-gifsicle": "^7.0.0",
5041
"imagemin-jpegtran": "^7.0.0",
5142
"imagemin-mozjpeg": "^9.0.0",
@@ -55,7 +46,7 @@
5546
"imagemin-webp": "^6.1.0",
5647
"metro": "^0.80.2",
5748
"rimraf": "^5.0.5",
58-
"semantic-release": "^22.0.5",
59-
"typescript": "^5.2.2"
49+
"semantic-release": "^22.0.12",
50+
"typescript": "^5.3.3"
6051
}
6152
}

src/index.ts

+4-14
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import path from 'path';
22

33
import type { AssetData } from 'metro';
4-
import imagemin from 'imagemin';
54

65
import type { IConfig, ImageminMinimizer } from './config';
76
import { buildConfig } from './config';
8-
import { generateGitignoreFile, imageminNormalizeConfig } from './utils';
7+
import { generateGitignoreFile, imageminGenerate } from './utils';
98

109
let _config: IConfig
1110

@@ -32,23 +31,14 @@ const _imageminAssetPlugin = async (assetData: AssetData): Promise<AssetData> =>
3231
const excludeRegexp = new RegExp(exclude)
3332

3433
if (!excludeRegexp.test(assetData.fileSystemLocation)) {
35-
const outputDirectory = path.join(process.cwd(), cacheDir);
34+
const outputDirPath = path.join(process.cwd(), cacheDir);
3635

3736
if (test.test(assetData.files[0])) {
3837
const { implementation = 'imagemin', options = [] } = minimizer ?? {}
3938

4039
if (implementation === 'imagemin') {
41-
// TODO: refactor and remove it to utils.ts
42-
const plugins = await imageminNormalizeConfig(options as ImageminMinimizer['options'])
43-
const tmpFiles = await imagemin(assetData.files, {
44-
destination: outputDirectory,
45-
plugins,
46-
});
47-
const outFiles = tmpFiles.map(file => file.destinationPath);
48-
return {
49-
...assetData,
50-
files: outFiles,
51-
};
40+
const _assetData = await imageminGenerate(assetData, outputDirPath, options as ImageminMinimizer['options']);
41+
return _assetData
5242
}
5343
// TODO: handle sharp implementation
5444
}

src/utils.ts

+34-15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import path from 'path';
22
import fs from 'fs/promises';
33
import type { Plugin } from 'imagemin';
4+
import { AssetData } from 'metro';
45

56
import { ImageminMinimizer } from './config';
67

@@ -19,6 +20,36 @@ export const generateGitignoreFile = async (dir: string) => {
1920
}
2021
}
2122

23+
/**
24+
* Runs imagemin on the given asset data and generates optimized image files.
25+
*
26+
* @param assetData - The asset data containing the files to be optimized.
27+
* @param outputDirPath - The output directory path where the optimized files will be saved.
28+
* @param minimizerOptions - The options for the imagemin minimizer.
29+
* @returns The modified asset data with the optimized files.
30+
*/
31+
export const imageminGenerate = async (assetData: AssetData, outputDirPath: string, minimizerOptions: ImageminMinimizer['options']) => {
32+
const plugins = await imageminNormalizeConfig(minimizerOptions || {});
33+
34+
let outFiles = assetData.files;
35+
try {
36+
const imagemin = (await import("imagemin")).default;
37+
const tmpFiles = await imagemin(assetData.files, {
38+
destination: outputDirPath,
39+
plugins,
40+
});
41+
outFiles = tmpFiles.map(file => file.destinationPath);
42+
} catch (error) {
43+
// FIXME: Error [ERR_REQUIRE_ESM]: require() of ES Module ...
44+
logError(error)
45+
}
46+
47+
return {
48+
...assetData,
49+
files: outFiles
50+
}
51+
}
52+
2253
/**
2354
* Normalize the imagemin configuration by importing the required plugins and their options.
2455
* @param imageminConfig - The imagemin configuration.
@@ -45,27 +76,15 @@ export const imageminNormalizeConfig = async (imageminConfig: ImageminMinimizer[
4576
const pluginOptions = isPluginArray ? plugin[1] : undefined;
4677

4778
let requiredPlugin = null;
48-
let requiredPluginName = `imagemin-${pluginName}`;
79+
let requiredPluginName = pluginName.startsWith('imagemin-') ? pluginName : `imagemin-${pluginName}`;
4980

5081
try {
5182
requiredPlugin = (await import(requiredPluginName)).default(
5283
pluginOptions
5384
);
5485
} catch {
55-
requiredPluginName = pluginName;
56-
57-
try {
58-
requiredPlugin = (await import(requiredPluginName)).default(
59-
pluginOptions
60-
);
61-
} catch {
62-
const pluginNameForError = pluginName.startsWith("imagemin")
63-
? pluginName
64-
: `imagemin-${pluginName}`;
65-
66-
const message = `Unknown plugin: ${pluginNameForError}\n\nDid you forget to install the plugin?\nYou can install it with:\n\n$ npm install ${pluginNameForError} --save-dev\n$ yarn add ${pluginNameForError} --dev`
67-
logError(message)
68-
}
86+
const message = `Unknown plugin: ${requiredPluginName}\n\nDid you forget to install the plugin?\nYou can install it with:\n\n$ npm install ${requiredPluginName} --save-dev\n$ yarn add ${requiredPluginName} --dev`
87+
logError(message)
6988
}
7089
plugins.push(requiredPlugin);
7190
} else {

0 commit comments

Comments
 (0)