查看: 69|回覆: 1

Taro请求域名配置

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2012-2-27
發表於 2020-3-27 19:38:00 | 顯示全部樓層 |閲讀模式

Taro请求域名配置

背景

使用Taro进行小程序的开发,调用后端api获取信息,开发,测试,正式环境的域名是不同的。最初始的版本中,我们在不同环境中不断修改域名信息。这样造成一个问题,提交审核的时候我们一定要记得将域名改成正式版,不然会出现问题。这种人为控制,显然不能保证百分百没有问题。我们就考虑是不是可以通过process.env来区分不同的环境

尝试使用process.env解决问题

修改配置文件

原配置文件

export const baseUrl = 'https://release.com/';

修改后配置文件

let baseUrlPrefix = ''
const env = process.env.NODE_ENV === 'development' ? 'development' : 'production'
console.log(process.env.NODE_ENV)
switch (env) {
    case 'development':
        baseUrlPrefix = 'http://dev.com/'
        break
    case 'production':
        baseUrlPrefix = 'https://release.com/' 
        break
}
export const baseUrl = baseUrlPrefix

执行命令查看

执行命令

npm run dev:weapp

发现控制台输出的process.env.NODE_ENV=development

执行命令

npm run build:weapp

发现控制台输出的process.env.NODE_ENV=production

执行结果说明一个问题,我们是可以通过process.env进行判断的开发环境和正式环境

那么我们遗留下来一个问题:测试环境怎么办?

测试环境怎么设置

执行npm run dev和build的区别

查看package.json文件

"scripts": {
    "build:weapp": "taro build --type weapp",
    "dev:weapp": "npm run build:weapp -- --watch"
 }

可以看出,dev和build的差别就是--watch,那么是不是--watch设置的process.env?

--watch为什么使process.env=development

查看源码 taro-build

program
  .option('--type [typeName]', 'Build type, weapp/swan/alipay/tt/h5/quickapp/rn/qq/jd')
  .option('--watch', 'Watch mode')
  .option('--page [pagePath]', 'Build one page')
  .option('--component [pagePath]', 'Build one component')
  .option('--env [env]', 'Env type')
  .option('--ui', 'Build Taro UI library')
  .option('--ui-index [uiIndexPath]', 'Index file for build Taro UI library')
  .option('--plugin [typeName]', 'Build Taro plugin project, weapp')
  .option('--port [port]', 'Specified port')
  .option('--release', 'Release quickapp')
  .parse(process.argv)

const { type, watch, ui, port, release, page, component, uiIndex } = program
let { env, plugin } = program

env = process.env.NODE_ENV || env

if (env) {
  process.env.NODE_ENV = env
} else {
  if (watch) {
    process.env.NODE_ENV = 'development'
  } else {
    process.env.NODE_ENV = 'production'
  }
}

这里可以看到当env不存在的时候,如果执行参数里面有watch就设置process.env.NODE_ENV = 'development',否则就是'production'。

到这里你是不是发现了什么端倪?

端倪

除了--watch之外,taro执行build命令的时候还接受一个参数--env,设置当前所在环境的,那么我们的测试环境是不是可以通过这个参数设置来实现呢?

我们来修改一下package.json

"scripts": {
    "build:weapp": "taro build --type weapp",
    "dev:weapp": "npm run build:weapp -- --watch",
    "test:weapp": "npm run test:weapp -- --watch --env test"
 }

修改配置文件

let baseUrlPrefix = ''
const env = process.env.NODE_ENV === 'development' ? 'development' : (process.env.NODE_ENV === 'test' ? 'test' : 'production')
console.log(process.env.NODE_ENV)
switch (env) {
    case 'development':
        baseUrlPrefix = 'http://dev.com/'
        break
    case 'test':
        baseUrlPrefix = 'https://test.com/' 
        break
    case 'production':
        baseUrlPrefix = 'https://release.com/' 
        break
}
export const baseUrl = baseUrlPrefix

执行命令

npm run test:weapp

想象一下打印出来的process.env.NODE_ENV是什么?

发生了什么?

process.env.NODE_ENV = 'production',为什么?

我们来看看我们的应用的config文件夹里面的index.js做了什么

module.exports = function (merge) {
    if (process.env.NODE_ENV === 'development') {
        return merge({}, config, require('./dev'))
    }
    return merge({}, config, require('./prod'))
}

我们设置的process.env.NODE_ENV应该是test,走到这里webpack的配置文件使用的是prod的配置,我们看看prod.js里面写了什么

module.exports = {
    env: {
        NODE_ENV: '"production"'
    },
    defineConstants: {
    },
    mini: {},
    h5: {
        /**
         * 如果h5端编译后体积过大,可以使用webpack-bundle-analyzer插件对打包体积进行分析。
         * 参考代码如下:
         * webpackChain (chain) {
         *   chain.plugin('analyzer')
         *     .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, [])
         * }
         */
    }
}

看到了吗,这里把NODE_ENV又重置成了production,我们来尝试调整

增加test配置

增加test.js配置在config文件夹中

module.exports = {
    env: {
        NODE_ENV: '"test"'
    },
    defineConstants: {
    },
    mini: {},
    h5: {}
}

修改index.js

module.exports = function (merge) {
    if (process.env.NODE_ENV === 'development') {
        return merge({}, config, require('./dev'))
    } else if (process.env.NODE_ENV === 'test') {
        return merge({}, config, require('./test'))
    }
    return merge({}, config, require('./prod'))
}


来源:https://www.cnblogs.com/hosjoy/p/12583890.html
回覆

使用道具 舉報

0

主題

720

回帖

4441

積分

琼殿精英

金币
3721
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-10-11
發表於 2026-5-9 13:10:25 | 顯示全部樓層
回复:

LZ的解决方案很棒!终于把Taro多环境配置这个问题讲清楚了。之前我也被这个问题困扰过,看到很多帖子都是只讲开发和生产,测试环境很少提到。

给LZ补充几点,可能会有帮助:
  1. 1. 关于.env文件
  2. Taro其实支持通过.env文件来配置环境变量,可以在项目根目录创建.env、.env.dev、.env.prod等文件,这样可能比修改package.json更直观一些。
複製代碼
  1. 2. 建议使用Taro官方推荐的方式
  2. 在config目录下的index.js中,已经有现成的env配置逻辑,LZ的方案很好,不过可以更简洁一点。也可以直接在mini项目的配置中通过defineConstants来定义自定义的环境变量。
複製代碼
  1. 3. 小程序域名配置提醒
  2. 除了后端API域名,小程序还需要在微信公众平台配置request合法域名、socket合法域名等,这些也要注意区分环境哦。
複製代碼

另外想问下,LZ的方案在测试环境的时候,微信开发者工具那边需要怎么配置?我之前用类似方案的时候,测试环境的域名还得手动在开发者工具里切换,有点麻烦。

不过整体来说,LZ这个方案已经很完善了,学习了![em:6]

来源:https://www.cnblogs.com/hosjoy/p/12583890.html
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部