フロントエンドリソースの読み込みを最適化する

1.フロントエンドリソースの読み込みを最適化する

jsリソースのロード方法:
1.1。インライン画像を使用します。つまり、画像をbase64でエンコードされたdata-urlに変換します。このメソッドは、実際には画像情報をcssファイルに統合し、画像リソースの個別のロードを回避します。ただし、画像のインライン化により、cssファイルのサイズが大きくなり、最初の画面のレンダリング時間が長くなります。

1.2.jsコードを使用して画像をプリロードします。


preloadImage() {
    
    
    const imgList = [
        require('@/assets/imgs/error.png'),
        require('@/assets/imgs/ticket_bg.png')
    ];
    for (let i = 0; i < imgList.length; i++) {
    
    
        const newIMG = new Image();
        newIMG.src = imgList[i];
    }
}

1.3。preload/prefetchブラウザがリソースの読み込みの順序とタイミングを最適化し、ページのパフォーマンスを向上させるのに役立ちます

<head>
    ...
    <link rel="prefetch" href="static/img/ticket_bg.a5bb7c33.png">
    ...
</head>

<head>
    ...
    <link rel="preload" as="font" href="<%= require('/assets/fonts/AvenirNextLTPro-Demi.otf') %>" crossorigin>
    <link rel="preload" as="font" href="<%= require('/assets/fonts/AvenirNextLTPro-Regular.otf') %>" crossorigin>
    ...
</head>
const PreloadWebpackPlugin = require('preload-webpack-plugin');
...
plugins: [
  new PreloadWebpackPlugin({
    
    
    rel: 'preload'as(entry) {
    
      //资源类型
      if (/\.css$/.test(entry)) return 'style';
      if (/\.woff$/.test(entry)) return 'font';
      if (/\.png$/.test(entry)) return 'image';
      return 'script';
    },
    include: 'asyncChunks', // preload模块范围,还可取值'initial'|'allChunks'|'allAssets',
    fileBlacklist: [/\.svg/] // 资源黑名单
    fileWhitelist: [/\.script/] // 资源白名单
  })
]

2.OCRツール

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;

import javax.imageio.ImageIO;

import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.spiderflow.ocr.model.Ocr;

import com.baidu.aip.ocr.AipOcr;

public class OcrUtil {
    
    
	
	private static HashMap<String, AipOcr> aipOcrMap = new HashMap<String, AipOcr>();
	
	private static HashMap<String, String> options = new HashMap<String, String>();
	
	private static class ErrorCode {
    
    
		
		/**
		 * 图片格式不对
		 */
		private static final int IMAGE_FORMAT_ERROR = 216201;
		
		/**
		 * 响应无效
		 */
		private static final int URL_RESPONSE_INVALID = 282113;
		
	}
	
	static {
    
    
	    options.put("detect_direction", "true");
	    options.put("detect_language", "true");
	    options.put("probability", "true");
	}
	
	public static AipOcr getAipOcr(Ocr ocr) {
    
    
		String ocrMapKey = ocr.getAppId()+ocr.getApiKey()+ocr.getSecretKey();
		AipOcr aipOcr = aipOcrMap.get(ocrMapKey);
		if(aipOcr == null) {
    
    
			aipOcr = new AipOcr(ocr.getAppId(), ocr.getApiKey(), ocr.getSecretKey());
			aipOcrMap.put(ocrMapKey, aipOcr);
		}
		return aipOcr;
	}
	
	public static int getErrorCode(JSONObject bgJson) {
    
    
		if(!bgJson.isNull("error_code")) {
    
    
			int errorCode = bgJson.getInt("error_code");
			return errorCode;
		}
		return -996;
	}
	
	public static boolean isImageFormatError(int errorCode) {
    
    
		if(errorCode != -996) {
    
    
			// 图片格式不对
			if(errorCode == ErrorCode.IMAGE_FORMAT_ERROR) {
    
    
				return true;
			}
		}
		return false;
	}
	
	public static boolean isUrlResponseInvalid(int errorCode) {
    
    
		if(errorCode != -996) {
    
    
			if(errorCode == ErrorCode.URL_RESPONSE_INVALID) {
    
    
				return true;
			}
		}
		return false;
	}
	
	public static byte[] imgConvert(byte[] bytes) throws IOException {
    
    
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		ByteArrayInputStream input = new ByteArrayInputStream(bytes);
		ImageIO.write(ImageIO.read(input), "png", output);
		return output.toByteArray();
	}
	
	public static JSONObject ocrIdentify(Ocr ocr,byte[] bytes) throws Exception {
    
    
		try {
    
    
			AipOcr aipOcr = getAipOcr(ocr);
			JSONObject bgJson = aipOcr.basicGeneral(bytes, options);
			if(isImageFormatError(getErrorCode(bgJson))) {
    
    
				return aipOcr.basicGeneral(imgConvert(bytes), options);
			}
			return bgJson;
		} catch (Exception e) {
    
    
			throw e;
		}
	}
	
	public static JSONObject ocrIdentify(Ocr ocr,String url) throws IOException {
    
    
		AipOcr aipOcr = getAipOcr(ocr);
		JSONObject bgJson = aipOcr.basicGeneralUrl(url, options);
		if(isUrlResponseInvalid(getErrorCode(bgJson))) {
    
    
			return aipOcr.basicGeneral(imgConvert(Jsoup.connect(url).ignoreContentType(true).execute().bodyAsBytes()), options);
		}
		return bgJson;
	}
	
}

3つ目は、下線がこぶに変わる

import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class FieldUtils {
    
    

    private static Pattern humpPattern = Pattern.compile("[A-Z]");

    public static List<String> allFields(Class clazz){
    
    
        return Arrays.stream(clazz.getDeclaredFields()).map(item->humpToLine2(item.getName())).collect(Collectors.toList());
    }

    public static List<String> updateFields(Class clazz){
    
    
        return Arrays.stream(clazz.getDeclaredFields())
                .filter(item->item.getAnnotation(ApiUpdateField.class) != null)
                .map(item-> humpToLine2(item.getName())).collect(Collectors.toList());
    }

    /**
     * 下划线转驼峰
     */
    public static String underlineToCamel(String name){
    
    
        StringBuilder sb = new StringBuilder(name.length());
        for (int i = 0; i < name.length(); i++) {
    
    
            char c = name.charAt(i);
            if ('_' == c) {
    
    
                if (++i < name.length()){
    
    
                    sb.append(Character.toUpperCase(name.charAt(i)));
                }
            }else {
    
    
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 驼峰转下划线
     */
    public static String humpToLine2(String str) {
    
    
        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
    
    
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiUpdateField {
    
    
}

4、テーブル構造分析

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 表结构解析
 */
public class SqlUtils {
    
    
    public static String getByPattern(String sql, String pattern, int group) {
    
    
        Pattern compile = Pattern.compile(pattern);
        Matcher matcher = compile.matcher(sql);
        while (matcher.find()) {
    
    
            return matcher.group(group);
        }
        return null;
    }

    public static List<String> getColumnSqls(String sql) {
    
    
        List<String> lines = new ArrayList<>();
        Scanner scanner = new Scanner(sql);
        boolean start = false;
        while (scanner.hasNextLine()) {
    
    
            String nextLine = scanner.nextLine();
            if (nextLine.indexOf("CREATE TABLE") != -1) {
    
    
                start = true;
                continue;
            }
            if (nextLine.indexOf("PRIMARY KEY") != -1 || nextLine.indexOf("ENGINE=") != -1) {
    
    
                start = false;
                continue;
            }
            if (start) {
    
    
                lines.add(nextLine);
            }
        }
        return lines;
    }
}

おすすめ

転載: blog.csdn.net/qq_32447301/article/details/109265771