宝石你王叔 發表於 2020-9-9 14:30:00

Taro请求域名配置

<h1 id="taro请求域名配置">Taro请求域名配置</h1>
<h2 id="背景">背景</h2>
<p>使用Taro进行小程序的开发,调用后端api获取信息,开发,测试,正式环境的域名是不同的。最初始的版本中,我们在不同环境中不断修改域名信息。这样造成一个问题,提交审核的时候我们一定要记得将域名改成正式版,不然会出现问题。这种人为控制,显然不能保证百分百没有问题。我们就考虑是不是可以通过process.env来区分不同的环境</p>
<h2 id="尝试使用processenv解决问题">尝试使用process.env解决问题</h2>
<h4 id="修改配置文件">修改配置文件</h4>
<p>原配置文件</p>
<pre><code class="hljs javascript"><span class="hljs-keyword">export <span class="hljs-keyword">const baseUrl = <span class="hljs-string">'https://release.com/';
</span></span></span></code></pre>
<p>修改后配置文件</p>
<pre><code class="hljs javascript"><span class="hljs-keyword">let baseUrlPrefix = <span class="hljs-string">''
<span class="hljs-keyword">const env = process.env.NODE_ENV === <span class="hljs-string">'development' ? <span class="hljs-string">'development' : <span class="hljs-string">'production'
<span class="hljs-built_in">console.log(process.env.NODE_ENV)
<span class="hljs-keyword">switch (env) {
    <span class="hljs-keyword">case <span class="hljs-string">'development':
      baseUrlPrefix = <span class="hljs-string">'http://dev.com/'
      <span class="hljs-keyword">break
    <span class="hljs-keyword">case <span class="hljs-string">'production':
      baseUrlPrefix = <span class="hljs-string">'https://release.com/'
      <span class="hljs-keyword">break
}
<span class="hljs-keyword">export <span class="hljs-keyword">const baseUrl = baseUrlPrefix
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4 id="执行命令查看">执行命令查看</h4>
<p>执行命令</p>
<pre><code class="hljs dockerfile">npm <span class="hljs-keyword">run<span class="bash"> dev:weapp
</span></span></code></pre>
<p>发现控制台输出的process.env.NODE_ENV=development</p>
<p>执行命令</p>
<pre><code class="hljs dockerfile">npm <span class="hljs-keyword">run<span class="bash"> build:weapp
</span></span></code></pre>
<p>发现控制台输出的process.env.NODE_ENV=production</p>
<p>执行结果说明一个问题,我们是可以通过process.env进行判断的开发环境和正式环境</p>
<p>那么我们遗留下来一个问题:测试环境怎么办?</p>
<h2 id="测试环境怎么设置">测试环境怎么设置</h2>
<h4 id="执行npm-run-dev和build的区别">执行npm run dev和build的区别</h4>
<p>查看package.json文件</p>
<pre><code class="hljs javascript"><span class="hljs-string">"scripts": {
    <span class="hljs-string">"build:weapp": <span class="hljs-string">"taro build --type weapp",
    <span class="hljs-string">"dev:weapp": <span class="hljs-string">"npm run build:weapp -- --watch"
}
</span></span></span></span></span></code></pre>
<p>可以看出,dev和build的差别就是--watch,那么是不是--watch设置的process.env?</p>
<h4 id="--watch为什么使processenvdevelopment">--watch为什么使process.env=development</h4>
<p>查看源码 taro-build</p>
<pre><code class="hljs dockerfile">program
.option(<span class="hljs-string">'--type ', <span class="hljs-string">'Build type, weapp/swan/alipay/tt/h5/quickapp/rn/qq/jd')
.option(<span class="hljs-string">'--watch', <span class="hljs-string">'Watch mode')
.option(<span class="hljs-string">'--page ', <span class="hljs-string">'Build one page')
.option(<span class="hljs-string">'--component ', <span class="hljs-string">'Build one component')
.option(<span class="hljs-string">'--env ', <span class="hljs-string">'Env type')
.option(<span class="hljs-string">'--ui', <span class="hljs-string">'Build Taro UI library')
.option(<span class="hljs-string">'--ui-index ', <span class="hljs-string">'Index file for build Taro UI library')
.option(<span class="hljs-string">'--plugin ', <span class="hljs-string">'Build Taro plugin project, weapp')
.option(<span class="hljs-string">'--port ', <span class="hljs-string">'Specified port')
.option(<span class="hljs-string">'--release', <span class="hljs-string">'Release quickapp')
.parse(process.argv)

const { type, watch, ui, port, release, page, component, uiIndex } = program
let { <span class="hljs-keyword">env, plugin } = program

<span class="hljs-keyword">env = process.<span class="hljs-keyword">env.NODE_ENV || <span class="hljs-keyword">env

if (<span class="hljs-keyword">env) {
process.<span class="hljs-keyword">env.NODE_ENV = <span class="hljs-keyword">env
} else {
if (watch) {
    process.<span class="hljs-keyword">env.NODE_ENV = <span class="hljs-string">'development'
} else {
    process.<span class="hljs-keyword">env.NODE_ENV = <span class="hljs-string">'production'
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>这里可以看到当env不存在的时候,如果执行参数里面有watch就设置process.env.NODE_ENV = 'development',否则就是'production'。</p>
<p>到这里你是不是发现了什么端倪?</p>
<h4 id="端倪">端倪</h4>
<p>除了--watch之外,taro执行build命令的时候还接受一个参数--env,设置当前所在环境的,那么我们的测试环境是不是可以通过这个参数设置来实现呢?</p>
<p>我们来修改一下package.json</p>
<pre><code class="hljs javascript"><span class="hljs-string">"scripts": {
    <span class="hljs-string">"build:weapp": <span class="hljs-string">"taro build --type weapp",
    <span class="hljs-string">"dev:weapp": <span class="hljs-string">"npm run build:weapp -- --watch",
    <span class="hljs-string">"test:weapp": <span class="hljs-string">"npm run test:weapp -- --watch --env test"
}
</span></span></span></span></span></span></span></code></pre>
<p>修改配置文件</p>
<pre><code class="hljs javascript"><span class="hljs-keyword">let baseUrlPrefix = <span class="hljs-string">''
<span class="hljs-keyword">const env = process.env.NODE_ENV === <span class="hljs-string">'development' ? <span class="hljs-string">'development' : (process.env.NODE_ENV === <span class="hljs-string">'test' ? <span class="hljs-string">'test' : <span class="hljs-string">'production')
<span class="hljs-built_in">console.log(process.env.NODE_ENV)
<span class="hljs-keyword">switch (env) {
    <span class="hljs-keyword">case <span class="hljs-string">'development':
      baseUrlPrefix = <span class="hljs-string">'http://dev.com/'
      <span class="hljs-keyword">break
    <span class="hljs-keyword">case <span class="hljs-string">'test':
      baseUrlPrefix = <span class="hljs-string">'https://test.com/'
      <span class="hljs-keyword">break
    <span class="hljs-keyword">case <span class="hljs-string">'production':
      baseUrlPrefix = <span class="hljs-string">'https://release.com/'
      <span class="hljs-keyword">break
}
<span class="hljs-keyword">export <span class="hljs-keyword">const baseUrl = baseUrlPrefix
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>执行命令</p>
<pre><code class="hljs dockerfile">npm <span class="hljs-keyword">run<span class="bash"> <span class="hljs-built_in">test:weapp
</span></span></span></code></pre>
<p>想象一下打印出来的process.env.NODE_ENV是什么?</p>
<h4 id="发生了什么?">发生了什么?</h4>
<p>process.env.NODE_ENV = 'production',为什么?</p>
<p>我们来看看我们的应用的config文件夹里面的index.js做了什么</p>
<pre><code class="hljs lua">module.exports = <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-params">(merge) {
    <span class="hljs-keyword">if (process.env.NODE_ENV === <span class="hljs-string">'development') {
      <span class="hljs-keyword">return merge({}, <span class="hljs-built_in">config, <span class="hljs-built_in">require(<span class="hljs-string">'./dev'))
    }
    <span class="hljs-keyword">return merge({}, <span class="hljs-built_in">config, <span class="hljs-built_in">require(<span class="hljs-string">'./prod'))
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>我们设置的process.env.NODE_ENV应该是test,走到这里webpack的配置文件使用的是prod的配置,我们看看prod.js里面写了什么</p>
<pre><code class="hljs yaml"><span class="hljs-string">module.exports <span class="hljs-string">= <span class="hljs-string">{
<span class="hljs-attr">    env: <span class="hljs-string">{
<span class="hljs-attr">      NODE_ENV: <span class="hljs-string">'"production"'
    <span class="hljs-string">},
<span class="hljs-attr">    defineConstants: <span class="hljs-string">{
    <span class="hljs-string">},
<span class="hljs-attr">    mini: <span class="hljs-string">{},
<span class="hljs-attr">    h5: <span class="hljs-string">{
      <span class="hljs-string">/**
         <span class="hljs-string">* <span class="hljs-string">如果h5端编译后体积过大,可以使用webpack-bundle-analyzer插件对打包体积进行分析。
         <span class="hljs-string">* <span class="hljs-string">参考代码如下:
         <span class="hljs-string">* <span class="hljs-string">webpackChain <span class="hljs-string">(chain) <span class="hljs-string">{
         <span class="hljs-string">*   <span class="hljs-string">chain.plugin('analyzer')
         <span class="hljs-string">*   <span class="hljs-string">.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, <span class="hljs-string">[])
         <span class="hljs-string">* <span class="hljs-string">}
         <span class="hljs-string">*/
    <span class="hljs-string">}
<span class="hljs-string">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>看到了吗,这里把NODE_ENV又重置成了production,我们来尝试调整</p>
<h4 id="增加test配置">增加test配置</h4>
<p>增加test.js配置在config文件夹中</p>
<pre><code class="hljs yaml"><span class="hljs-string">module.exports <span class="hljs-string">= <span class="hljs-string">{
<span class="hljs-attr">    env: <span class="hljs-string">{
<span class="hljs-attr">      NODE_ENV: <span class="hljs-string">'"test"'
    <span class="hljs-string">},
<span class="hljs-attr">    defineConstants: <span class="hljs-string">{
    <span class="hljs-string">},
<span class="hljs-attr">    mini: <span class="hljs-string">{},
<span class="hljs-attr">    h5: <span class="hljs-string">{}
<span class="hljs-string">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>修改index.js</p>
<pre><code class="hljs lua">module.exports = <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-params">(merge) {
    <span class="hljs-keyword">if (process.env.NODE_ENV === <span class="hljs-string">'development') {
      <span class="hljs-keyword">return merge({}, <span class="hljs-built_in">config, <span class="hljs-built_in">require(<span class="hljs-string">'./dev'))
    } <span class="hljs-keyword">else <span class="hljs-keyword">if (process.env.NODE_ENV === <span class="hljs-string">'test') {
      <span class="hljs-keyword">return merge({}, <span class="hljs-built_in">config, <span class="hljs-built_in">require(<span class="hljs-string">'./test'))
    }
    <span class="hljs-keyword">return merge({}, <span class="hljs-built_in">config, <span class="hljs-built_in">require(<span class="hljs-string">'./prod'))
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>

</div>
<div id="MySignature" role="contentinfo">
    漫思<br><br>
来源:https://www.cnblogs.com/sexintercourse/p/13638602.html
頁: [1]
查看完整版本: Taro请求域名配置