vue脚手架增加自动打入环境变量publicPath、baseUrl等功能

前言:

公司toB的业务偏多,登录模块、路由模块、布局、样式基本都是统一的

目前我已经抽离出大多数可以重复使用的布局、vuex、store等模块、并基于 elementUI 进行了修改迭代,分别维护了 ip-vue2-adminipharmacare-ui 项目(注:外网演示的仅是参考项目,仅学习使用),减少了很多重复的工作量,特别对于ui定义化的统一样式,通过外部变量修改的方式已经远远达不到ui的效果,我基于源码(增加内置变量、修改内置变量、直接修改组件内部样式等方式)去维护了一些统一化的样式(基于默认大小)

基于 ip-vue2-admin 项目,我准备着手做一个内置的脚手架,目前我还不需要按需引入等功能,所以基本 package.json 的内容都是一致的,目前做的是基于vue2、vue3项目分别去选择克隆不同的项目

/** 
createProject.js
*/
const answer = await inquirer.prompt([
    {
      name: "vueVersion",
      type: "list",
      message: "请选择 Vue 版本:",
      choices: ["Vue 2", "Vue 3"],
    },
  ]);

  if (answer.vueVersion === "Vue 2") {
    await createVue2Project(appName);
  } else {
    await createVue3Project(appName);
  }

同时我限定了项目名称的结构,因为公司都是以 web-xx 这种作为项目名称的,同时规范了打包后的文件名和映射路径( publicPath )也叫xx、拦截器也是叫xx( baseUrl

/** 
createProject.js
*/  
  do {
    appName = await inquirer
      .prompt([
        {
          name: "appName",
          type: "input",
          message: "请输入项目名称 (必须以 'web-' 开头):",
          validate: function (input) {
            if (!input.startsWith("web-")) {
              return "项目名称必须以 'web-' 开头。请按照规范命名。";
            }
            return true;
          },
        },
      ])
      .then((answers) => answers.appName);
  } while (!appName);

基于以上规范的 publicPathbaseUrlgitlab 打包后 Cl/CDMOUDLE_NAME.gitignore 排除文件xx.zip、xx,例如项目叫web-admin,以上变量都是admin,我就在想每次创建项目去改这些实在太麻烦了,有没有更方便的方式

gitlabCI/CD :应为这个我之前改过打包注入分支版本,所以大概知道一些变量 CI_PROJECT_NAME 就是项目的名称,切割掉web就是线上打包后的包名

/** 
.gitlab-ci.yml 关键代码
*/
before_script:
  # 业务系统打包遵循 项目名称截取'web-'规范
  - if [[ ${CI_PROJECT_NAME} =~ ^web- ]]; then export MOUDLE_NAME="${CI_PROJECT_NAME#web-}"; else export MOUDLE_NAME="${CI_PROJECT_NAME}"; fi

.gitignore 的文件名不好添加进去,没有找到合适的方法,索性我直接脚手架打进去

/** 
gitignoreGenerator/index.js 
*/
const fs = require("fs");

// Function to generate and write .gitignore file
module.exports = function generateGitignoreFile (appName) {
  const gitignoreContent = `.DS_Store
node_modules/
dist/
${appName.replace(/^web-/, '')}/
${appName.replace(/^web-/, '')}.zip
admin/
admin.zip
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
tests/**/coverage/
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
`;

  fs.writeFileSync(`${appName}/.gitignore`, gitignoreContent);
};

publicPathbaseUrl 此类的我想通过打入环境变量,项目中直接引入环境变量的方法更合理些,以下通过fs模块分别创建了 .env.development.env.production.env.staging 环境变量

// envConfigGenerator/index.js
const fs = require("fs");

// Function to generate and write environment variable files
module.exports = function generateEnvFiles(appName) {
  const envConfig = {
    development: {
      ENV: '"development"',
      VUE_APP_BASE_API: '"/dev-api"',
      VUE_CLI_BABEL_TRANSPILE_MODULES: true
    },
    production: {
      ENV: '"production"',
      VUE_APP_BASE_API: '"/prod-api"',
      VUE_APP_BASE_NAME: `"${appName.replace(/^web-/, '')}"`
    },
    staging: {
      NODE_ENV: '"production"',
      VUE_APP_BASE_API: '"/stage-api"',
      VUE_APP_BASE_NAME: `"${appName.replace(/^web-/, '')}"`
    }
  };

  for (const env in envConfig) {
    if (envConfig.hasOwnProperty(env)) {
      const config = envConfig[env];
      const envFileName = `.env.${env}`;
      const envFileContent = Object.keys(config)
        .map((key) => `${key} = ${config[key]}`)
        .join("\n");
      fs.writeFileSync(`${appName}/${envFileName}`, envFileContent);
    }
  }
};

主要看生产环境VUE_APP_BASE_NAME就是项目中自动生成的环境变量,以下的 vue.config.js 中就是文件映射和打包后文件赋值给了环境变量,baseUrl也是同理不重复举例了,别忘了404界面如果写了返回,开发环境返回的也应该是 publicPath

const publicPath = process.env.VUE_APP_BASE_NAME ? `/${process.env.VUE_APP_BASE_NAME}/` : '/'
module.exports = {
  publicPath: publicPath,
  outputDir: process.env.VUE_APP_BASE_NAME,
}

目前该脚手架功能较少,且还在demo阶段,仅供学习使用

源码 ip-vue-cli

转载注明来源 YoungDo的博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值