190 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {defineConfig,} from 'vite'
 | ||
| import vue from '@vitejs/plugin-vue'
 | ||
| import fs from "fs-extra"
 | ||
| 
 | ||
| declare const require: any;
 | ||
| declare const process: any;
 | ||
| const path = require("path");
 | ||
| 
 | ||
| const AWSDevParams = require("./AWSDevParams");
 | ||
| Object.assign(AWSDevParams, require("./AWSDevServiceParams"));
 | ||
| const AWSReleasePath = AWSDevParams.AWSReleasePath;
 | ||
| const AWSPortalUrl = AWSDevParams.AWSPortalUrl;
 | ||
| //开发时通过用户名及密码获取sessionId
 | ||
| const devUserInfo = AWSDevParams.devUserInfo;
 | ||
| const AWSproxyPath = "/AWSDEVURL/r/"; //防止跨域的地址
 | ||
| const moduleTemplateInAWS = AWSDevParams.moduleTemplateInAWS;//平台的模板路径
 | ||
| const outputDir = AWSDevParams.outputDir;
 | ||
| const publicPath = AWSDevParams.publicPath;//决定生成在平台的js或css的相对路径,与build配置的路径要对应
 | ||
| //判断是否开发
 | ||
| const isProduction = process.env.NODE_ENV === "production";
 | ||
| //开发时路径和build到平台路径
 | ||
| const AWSJSAndCSSPath = isProduction ? "../" : AWSproxyPath.replace("r/", "");
 | ||
| const importAWSCSS = AWSDevParams.importAWSCSS == null ? [] : AWSDevParams.importAWSCSS;
 | ||
| const importAWSJS = AWSDevParams.importAWSJS == null ? [] : AWSDevParams.importAWSJS;
 | ||
| const AWSJSAndCSSImportArray = [] as any[];
 | ||
| for (const k of importAWSCSS) {
 | ||
|     AWSJSAndCSSImportArray.push("<link type='text/css' rel='stylesheet' href='" + AWSJSAndCSSPath + k + "'/>");
 | ||
| }
 | ||
| for (const k of importAWSJS) {
 | ||
|     AWSJSAndCSSImportArray.push("<script type='text/javascript' src='" + AWSJSAndCSSPath + k + "'></script>");
 | ||
| }
 | ||
| const getAWSFileRelativePath = () => {
 | ||
|     let index = "./";
 | ||
|     if (isProduction) {
 | ||
|         index = publicPath;
 | ||
|     }
 | ||
|     return index;
 | ||
| };
 | ||
| const getIndexPath = () => {
 | ||
|     let index = "index.html";
 | ||
|     if (isProduction) {
 | ||
|         index = AWSReleasePath + moduleTemplateInAWS;
 | ||
|     }
 | ||
|     return index;
 | ||
| };
 | ||
| 
 | ||
| const data = {
 | ||
|     AWSJSAndCSSImport: AWSJSAndCSSImportArray.join("\n"),
 | ||
|     AWSJSAndCSSPath,
 | ||
|     devUserInfo: isProduction ? {} : devUserInfo,
 | ||
|     publicDir: getAWSFileRelativePath(),
 | ||
|     isProduction,
 | ||
|     axiosBaseUrl: isProduction ? "./" : AWSproxyPath,
 | ||
|     settingParam: isProduction ? "<#settingParam>" : "{}",
 | ||
| }
 | ||
| const replaceHtml = (html: string, htmlMap: any) => {
 | ||
|     for (const key in htmlMap) {
 | ||
|         if (key == "publicDir") {
 | ||
|             //公共路径特殊处理
 | ||
|             html = html.replace(/\/\$\{publicDir\}(.*?)"/g, htmlMap[key]+"$1\"");
 | ||
|         } else {
 | ||
|             html = html.replace(new RegExp("\\$\\{" + key + "\\}", "g"), typeof htmlMap[key] == "object" ? JSON.stringify(htmlMap[key]) : htmlMap[key]);
 | ||
|         }
 | ||
|     }
 | ||
|     return html;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| const AWSPlugin: any = () => {
 | ||
|     let config = null as any;
 | ||
|     return {
 | ||
|         name: 'read-config',
 | ||
| 
 | ||
|         configResolved(resolvedConfig: any) {
 | ||
|             // 存储最终解析的配置
 | ||
|             config = resolvedConfig;
 | ||
|         },
 | ||
| 
 | ||
|         // 在其他钩子中使用存储的配置
 | ||
|         transform() {
 | ||
|             if (config.command === 'serve') {
 | ||
|                 // serve: 由开发服务器调用的插件
 | ||
|             } else {
 | ||
|                 // build: 由 Rollup 调用的插件
 | ||
|             }
 | ||
|         },
 | ||
|         transformIndexHtml(html: string) {
 | ||
|             return replaceHtml(html, data);
 | ||
|         },
 | ||
|         renderChunk(code: string, model: any) {
 | ||
|             if (/\/\$\{publicDir\}\//.test(code)) {
 | ||
|                 return code.replace(/\/\$\{publicDir\}\//g, data["publicDir"] + "/");
 | ||
|             }
 | ||
|             return code;
 | ||
|         },
 | ||
|         closeBundle() {
 | ||
|             fs.move(AWSReleasePath + outputDir + "/index.html", getIndexPath(), {
 | ||
|                 overwrite: true
 | ||
|             });
 | ||
|             // fs.rename(resolve(filePath + "/style.css"), resolve(filePath + "/awsui.css"));
 | ||
|             // fs.rename(resolve(filePath + "/awsui.umd.js"), resolve(filePath + "/awsui.umd.min.js"));
 | ||
|         },
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| const rollupPlugin = () => {
 | ||
|     return {
 | ||
|         name: 'rullupPlugin',
 | ||
|         renderChunk(code: string, model: any) {
 | ||
|             //去除js中的css文本串
 | ||
|             for (const key in model.modules) {
 | ||
|                 if (/\.(css|less)$/.test(key)) {
 | ||
|                     code = code.replace(model.modules[key].code, "");
 | ||
|                 }
 | ||
|             }
 | ||
|             return code;
 | ||
|         },
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| // https://vitejs.dev/config/
 | ||
| export default defineConfig({
 | ||
|     // root: getIndexPath(),
 | ||
|     // publicDir: getAWSFileRelativePath(),
 | ||
|     //生成入口的html文件位置
 | ||
|     base: isProduction ? "${publicDir}" : "/", //公共路径特殊处理
 | ||
|     build: {
 | ||
|         outDir: AWSReleasePath + outputDir,
 | ||
|         emptyOutDir: true,
 | ||
|         // sourcemap:"inline",
 | ||
|         minify: "esbuild", //esbuild更快大一点点,terser慢但仅小一点点
 | ||
|         cssCodeSplit: false,
 | ||
|         commonjsOptions: {
 | ||
|             // non-CommonJS modules will be ignored, but you can also
 | ||
|             // specifically include/exclude files
 | ||
|             include: ['node_modules/**', "plugins/**", "lib/**", "src/**"],  // Default: undefined
 | ||
|             exclude: ['node_modules/foo/**', 'node_modules/bar/**'],  // Default: undefined
 | ||
|             // these values can also be regular expressions
 | ||
|             // include: /node_modules/
 | ||
| 
 | ||
|             // search for files other than .js files (must already
 | ||
|             // be transpiled by a previous plugin!)
 | ||
|             extensions: ['.js', '.coffee'],  // Default: [ '.js' ]
 | ||
| 
 | ||
|             // if true then uses of `global` won't be dealt with by this plugin
 | ||
|             ignoreGlobal: false,  // Default: false
 | ||
| 
 | ||
|             // if false then skip sourceMap generation for CommonJS modules
 | ||
|             sourceMap: false,  // Default: true
 | ||
| 
 | ||
|             // unconverted. Pass an array containing the IDs
 | ||
|             // or a `id => boolean` function. Only use this
 | ||
|             // option if you know what you're doing!
 | ||
|             ignore: ['conditional-runtime-dependency']
 | ||
|         },
 | ||
|         rollupOptions: {
 | ||
|             output: {
 | ||
|                 assetFileNames : 'assets/asset-[name]-[hash][extname]',
 | ||
|                 chunkFileNames: 'js/chunck-[name]-[hash].js',
 | ||
|                 entryFileNames: 'js/entry-[name]-[hash].js'
 | ||
|             },
 | ||
|             plugins: [rollupPlugin()]
 | ||
|         }
 | ||
|     },
 | ||
|     // eslint-loader 是否在保存的时候检查
 | ||
|     // lintOnSave: true,
 | ||
|     // productionSourceMap: false, //打包不使用源码(false后在平台无法调试)
 | ||
|     // use the full build with in-browser compiler?
 | ||
|     // https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
 | ||
|     // compiler: false,
 | ||
|     resolve: {
 | ||
|         alias: {
 | ||
|             "@": path.resolve(__dirname as any, "./src")
 | ||
|         }
 | ||
|     },
 | ||
|     server: {
 | ||
|         host : "0.0.0.0",
 | ||
|         proxy: {
 | ||
|             //配置跨域
 | ||
|             "/AWSDEVURL": {
 | ||
|                 target: AWSPortalUrl,
 | ||
|                 ws: true,
 | ||
|                 changeOrigin: true, //允许跨域
 | ||
|                 rewrite: (path) => path.replace(/^\/AWSDEVURL/, '')
 | ||
|             }
 | ||
|         }
 | ||
|     },
 | ||
|     plugins: [vue(), AWSPlugin()],
 | ||
| })
 | 
