@aniyajs/rotor
Version:
基于webpack5开发的一款专注于打包、运行的工具
139 lines (116 loc) • 4.56 kB
JavaScript
;
const path = require("path");
const fs = require("fs-extra");
const getPublicUrlOrPath = require("./getPublicUrlOrPath");
const defaultConfig = require("../webpack/defaultConfig");
const isEnvDevelopment = process.env.NODE_ENV === "development";
const isEnvProduction = process.env.NODE_ENV === "production";
const appDirectory = path.normalize(process.cwd());
const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath);
const appTsConfig = resolveApp("tsconfig.json");
const useTypeScript = fs.existsSync(appTsConfig);
/**
* @type { Partial<{appConfigTempIndexJs: string; appConfigIndexDirTempPath: string }> }
*/
let tempsPath = {};
// 入口文件后缀
const moduleFileExtensions = [".ts", ".js", ".tsx", ".jsx"];
let build = "build";
let publicUrlOrPath = "/";
const resolveModule = (resolveFn, filePath) => {
const extension = moduleFileExtensions.find((extension) =>
fs.existsSync(resolveFn(`${filePath}${extension}`)),
);
if (extension) {
return resolveFn(`${filePath}${extension}`);
}
return resolveFn(`${filePath}.${useTypeScript ? "ts" : "js"}`);
};
const appTempPath =
(isEnvDevelopment && resolveApp("src/.aniya")) ||
(isEnvProduction && resolveApp("src/.aniya-production")) ||
resolveApp("src/.aniya");
const appTempRouterIndexJs =
(isEnvDevelopment &&
resolveModule(resolveApp, "src/.aniya/plugin-router/index")) ||
(isEnvProduction &&
resolveModule(resolveApp, "src/.aniya-production/plugin-router/index")) ||
resolveModule(resolveApp, "src/.aniya/plugin-router/index");
const appTempMetaJs =
(isEnvDevelopment && resolveApp("src/.aniya/meta.json")) ||
(isEnvProduction && resolveApp("src/.aniya-production/meta.json")) ||
resolveApp("src/.aniya/meta.json");
const appConfigTempPath =
(isEnvDevelopment && resolveApp("src/.aniya/aniya-config")) ||
(isEnvProduction && resolveApp("src/.aniya-production/aniya-config")) ||
resolveApp("src/.aniya/aniya-config");
const appWebpackCache =
(isEnvDevelopment && resolveApp("src/.aniya/.cache")) ||
(isEnvProduction && resolveApp("src/.aniya-production/.cache")) ||
resolveApp("src/.aniya/.cache");
const appWebpackCacheBabelLoader =
(isEnvDevelopment && resolveApp("src/.aniya/.cache/babel-loader")) ||
(isEnvProduction &&
resolveApp("src/.aniya-production/.cache/babel-loader")) ||
resolveApp("src/.aniya/.cache/babel-loader");
const appTsBuildInfoFile =
(isEnvDevelopment && resolveApp("src/.aniya/.cache/tsconfig.tsbuildinfo")) ||
(isEnvProduction &&
resolveApp("src/.aniya-production/.cache/tsconfig.tsbuildinfo")) ||
resolveApp("src/.aniya/.cache/tsconfig.tsbuildinfo");
const appEslintCacheFile =
(isEnvDevelopment && resolveApp("src/.aniya/.cache/.eslintcache")) ||
(isEnvProduction &&
resolveApp("src/.aniya-production/.cache/.eslintcache")) ||
resolveApp("src/.aniya/.cache/.eslintcache");
if (fs.existsSync(appTempMetaJs)) {
const tempMetaData = fs.readJSONSync(appTempMetaJs);
tempsPath = tempMetaData.paths;
if (
tempsPath &&
tempsPath.appConfigTempIndexJs &&
fs.existsSync(tempsPath.appConfigTempIndexJs)
) {
// 清除缓存
delete require.cache[require.resolve(tempsPath.appConfigTempIndexJs)];
const latestCustomConfigContent = defaultConfig(
tempsPath.appConfigTempIndexJs,
);
publicUrlOrPath = getPublicUrlOrPath(
isEnvDevelopment,
latestCustomConfigContent.publicPath,
);
build = latestCustomConfigContent.outputPath || "build";
}
}
module.exports = {
appPath: resolveApp("."),
appIndexJs: resolveModule(resolveApp, "src/index"),
appHtml: resolveApp("src/pages/document.ejs"),
appConfigJs: resolveApp(`config/config.${useTypeScript ? "ts" : "js"}`),
appPublic: resolveApp("public"),
appSrc: resolveApp("src"),
appBuild: resolveApp(build),
appTsConfig,
appJsConfig: resolveApp("jsconfig.json"),
appTempPath,
appTempRouterIndexJs,
appConfigPath: resolveApp("config"),
appMockPath: resolveApp("mock"),
appEslintPath: resolveApp(".eslintrc"),
appTempMetaJs,
appConfigTempPath,
appMockTempPath: resolveApp("src/.aniya/aniya-mock"),
appMockTempIndexJs: resolveApp("src/.aniya/aniya-mock/index.js"),
publicUrlOrPath,
appPackageJson: resolveApp("package.json"),
yarnLockFile: resolveApp("yarn.lock"),
appNodeModules: resolveApp("node_modules"),
appModelsPath: resolveApp("models"),
appPagesPath: resolveApp("src/pages"),
appWebpackCache,
appTsBuildInfoFile,
appWebpackCacheBabelLoader,
appEslintCacheFile,
...tempsPath,
};