最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Electron+Vue3 MAC 版日历开发记录(10)——env 使用

    正文概述 掘金(叶梅树)   2021-06-11   634

    这是我参与更文挑战的第10天,活动详情查看: 更文挑战

    Electron+Vue3 MAC 版日历开发记录(10)——env 使用

    由于之前界面有点傻大个,所以在任务里,我加了一条:「整体缩小一倍」,但是伴随的问题也就出现了,我总不能每次调整界面大小,然后在所以有布局的地方都一遍一遍的找出来修改吧。

    所以,今天我把关注点放在了变量上,也就是今天的记录主题:env 的使用。

    其实在很多成熟的框架 (各种编程语言),如 php 的 Laravel 框架,也是使用 env 来配置我们的静态和敏感变量。

    Electron+Vue3 MAC 版日历开发记录(10)——env 使用

    环境变量说明

    Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。这里有一些普遍适用的内建变量:

    1. 在本项目里,我把常规的通用变量,如 window 长和宽放在 .env 下,如:
    VITE_APP_WIDTH=500
    VITE_APP_HEIGHT=400
    

    在代码中,就可以直接使用了:

    // main/src/App.ts
    const window = new BrowserWindow({
      width: Number(this.env.VITE_APP_WIDTH),
      height: Number(this.env.VITE_APP_HEIGHT),
      resizable: false,
      alwaysOnTop: true,
      show: false,
      frame: false,
      webPreferences: {
        webSecurity: false,
        preload: join(__dirname, '../../preload/dist/index.cjs'),
        contextIsolation: this.env.MODE !== 'test',   // Spectron tests can't work with contextIsolation: true
        enableRemoteModule: this.env.MODE === 'test', // Spectron tests can't work with enableRemoteModule: false
      },
    });
    
    1. 同样的,本项目用到的天气预报服务器 API 也可以放在 .env 中,在 service 中直接使用
    // .env
    VITE_APP_WIDTH=700
    VITE_APP_HEIGHT=600
    VITE_WEATHER_API=***
    
    // WeatherService.ts
    const res = await http({
      url: import.meta.env.VITE_WEATHER_API,
      method: 'get',
      params: {
        param: JSON.stringify({
          location: locationStr,
        }),
      },
    });
    

    Electron+Vue3 MAC 版日历开发记录(10)——env 使用

    智能提示

    根据 VITE 官方文档 所说的:

    interface ImportMetaEnv {
      VITE_DEV_SERVER_URL: string,
      // 更多环境变量...
      VITE_APP_WIDTH: number,
      VITE_APP_HEIGHT: number,
    }
    

    而在本项目所引用的框架中,是采用「命令」生成以上文件的,见:types/env.d.ts:

    Electron+Vue3 MAC 版日历开发记录(10)——env 使用

    生成该文件的代码如下:

    #!/usr/bin/env node
    
    const {resolveConfig} = require('vite');
    const {writeFileSync, mkdirSync, existsSync} = require('fs');
    const {resolve, dirname} = require('path');
    
    const MODES = ['production', 'development', 'test'];
    
    const typeDefinitionFile = resolve(process.cwd(), './types/env.d.ts');
    
    /**
     *
     * @return {string}
     */
    function getBaseInterface() {
      return 'interface IBaseEnv {[key: string]: string}';
    }
    
    /**
     *
     * @param {string} mode
     * @return {Promise<{name: string, declaration: string}>}
     */
    async function getInterfaceByMode(mode) {
      const interfaceName = `${mode}Env`;
      const {env: envForMode} = await resolveConfig({mode}, 'build');
      return {
        name: interfaceName,
        declaration: `interface ${interfaceName} extends IBaseEnv ${JSON.stringify(envForMode)}`,
      };
    }
    
    /**
     * @param {string[]} modes
     * @param {string} filePath
     */
    async function buildMode(modes, filePath) {
    
      const IBaseEnvDeclaration = getBaseInterface();
    
      const interfaces = await Promise.all(modes.map(getInterfaceByMode));
    
      const allDeclarations = interfaces.map(i => i.declaration);
      const allNames = interfaces.map(i => i.name);
    
      const ImportMetaEnvDeclaration = `type ImportMetaEnv = Readonly<${allNames.join(' | ')}>`;
    
      const content = `
        ${IBaseEnvDeclaration}
        ${allDeclarations.join('\n')}
        ${ImportMetaEnvDeclaration}
      `;
    
      const dir = dirname(filePath);
      if (!existsSync(dir)) {
        mkdirSync(dir);
      }
    
    
      writeFileSync(filePath, content, {encoding: 'utf-8', flag: 'w'});
    }
    
    buildMode(MODES, typeDefinitionFile)
      .catch(err => {
        console.error(err);
        process.exit(1);
      });
    

    代码应该都能看得懂,不再解释了。命令写在 package.json

     "buildEnvTypes": "node scripts/buildEnvTypes.js",
    

    所以每次更新静态变量,在运行之前,都需要执行一次该命令:

    Electron+Vue3 MAC 版日历开发记录(10)——env 使用

    小结

    好了,今天总算了解了下有关 Vite 相关的知识,如何使用 env 来配置静态变量,如何在不同环境 (developmentproductiontestlocal) 下使用。最后剩下一个 staging 没用到,有待于以后使用的时候再做总结了。

    未完待续!


    起源地下载网 » Electron+Vue3 MAC 版日历开发记录(10)——env 使用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元