
uni小程序、插件开发|个人接单|欢迎咨询
uni小程序开发;
uni插件开发;
可以全栈开发,后端语言java。
前端蓝牙助手:https://www.zhihu.com/pin/1521169284718239744
后端轮子:https://zhuanlan.zhihu.com/p/530231461
QQ:421156722
欢迎咨询,合作共赢。
uni小程序开发;
uni插件开发;
可以全栈开发,后端语言java。
前端蓝牙助手:https://www.zhihu.com/pin/1521169284718239744
后端轮子:https://zhuanlan.zhihu.com/p/530231461
QQ:421156722
欢迎咨询,合作共赢。
收起阅读 »
app分发平台源码ios免签封装
app分发平台包含各种形式的多功能移动应用程序,如娱乐、购物、游戏等。这个阶段让客户可以浏览他们最喜欢的应用程序并随时下载。几乎每个可移植应用程序改进组织在分派应用程序时都关注这些阶段。这些阶段还为转移其应用程序以跟踪进展的组织或工程师提供了各种设备。从下载次数到应用程序出现的搜索次数,组织可以跟踪所有内容。因此,便携式应用程序分散在各种渠道上的基本原理被证明更为重要。
app分发平台源码及演示:s.appwin.top
一个非常易于使用、完全可定制且灵活的基于 Web 的 App Store,可最大限度地提高您的企业应用程序的采用率。为任何目的和用户知识水平做好准备,并提供指导安装体验。无需 MDM 解决方案即可在一处分发 iOS 和 Android 应用程序所需的一切。
分发方法的范围从为测试设备导出您的应用程序到将其上传到 App Store Connect。您可以使用TestFlight 将iOS、tvOS 和watchOS beta 版本分发给测试人员并收集反馈。如果您想将您的应用程序分发给已注册的设备、使用 TestFlight 或通过 App Store 的 beta 测试,您需要加入APP开发项目。为您创建一个 App Store Connect 帐户,您可以开始上传构建。
加入APP开发项目可以访问分发方法以及可以添加到应用程序的功能。一项功能授予您的应用访问 提供的应用服务的权限。
要使用任何分发方法,您首先要创建应用程序的存档。存档是您的应用程序的构建,包括 Xcode 存储在包中的调试信息。
在 Xcode 项目的主窗口中,从 Scheme 工具栏菜单中选择一个目标和一个仅构建设备或真实设备。如果目标是模拟器,则无法创建存档。然后,选择 Product > Archive 来构建目标,并创建将出现在 Archives 管理器中的存档。
您可以通过选择窗口 > 管理器直接打开档案管理器。如果您想确认您的应用已准备好提交到 TestFlight 或 App Store,但尚未提交,请选择您的存档,然后单击验证应用。Xcode 将对应用程序执行有限的自动初始验证并提供反馈。
选择分发方法和选项
您可以导出存档或将其上传到 App Store Connect。您导出应用程序以将其分发到 App Store 之外,然后将其上传以通过 TestFlight 或 App Store 分发它。
在档案管理器中,选择档案,然后单击分发应用程序。在下一张表中,根据您的应用平台选择分发方法。
要仅在注册设备上分发给有限数量的用户(例如,在您的组织内分发),请选择 Ad Hoc 或 Development。有关详细信息,请参阅将您的app分发到已注册的设备。要使用 TestFlight 或通过 App Store 分发,请选择 App Store Connect。
要在 App Store 之外分发由 Apple 公证或使用开发者 ID 签名的 macOS 应用程序,请选择开发者 ID。
根据您的分发方法选择您的分发选项。例如,如果您使用导出分发方法,您将选择应用程序精简和按需资源选项,因为您需要自己分发应用程序。如果您上传到 App Store Connect,您将选择是否包含位码或符号。
如果您选择 App Store Connect 或 Developer ID 作为您的分发方法,您还需要选择目标选项。您可以选择将您的构建上传到 App Store,或将您的构建导出到本地以便稍后上传。
分发测试版
当您向用户分发应用的 Beta 版或提供即将发布的版本的预览时,请使用基于应用平台的方法:
对于 iOS、tvOS 或 watchOS 应用,使用 TestFlight 将应用的 Beta 版分发给内部和外部测试人员。TestFlight 应用程序允许受邀用户安装、Beta 测试、提供反馈并获取应用程序的更新。Apple 会为您分发测试版,然后您只需在 App Store Connect 上管理构建和用户。要了解更多信息,请参阅TestFlight beta 测试概述,有关 Xcode 特定的步骤,请参阅使用 TestFlight 分发应用程序。
对于所有平台,向您的开发者帐户中注册的设备分发测试版。仅当您可以保留部分有限的开发设备进行 Beta 测试时,才选择此选项。要了解更多信息,请参阅将您的app分发到已注册的设备。
对于 macOS 应用程序,在通过 App Store 分发应用程序之前,将经过 Apple 公证的构建分发给测试人员。要了解更多信息,请参阅分发前对 macOS 软件进行公证。
在 App Store 上发布
在对最终版本进行 Beta 版测试后,将其提交给 App Review,然后在 App Store 上提供。
如果您使用 TestFlight 分发测试版,并输入了 App Store 发布所需的附加信息,只需将 App Store Connect 中显示的最后一个构建提交到 App Review。要了解更多信息,请参阅发布应用程序概述。
否则,请按照通过 App Store 分发应用程序中的所有步骤准备您的应用程序并将其上传到 App Store Connect,然后将其提交给 App Review。
在 App Store 之外分发
对于 macOS 应用程序,您可以导出经过公证的应用程序以在 App Store 之外分发,但您可能需要先禁用需要 Apple Developer Program 会员资格的功能,然后再将应用程序自己分发给用户。要了解更多信息,请参阅分发前对 macOS 软件进行公证。
分发业务应用程序
还有几个用于分发业务、定制或内部应用程序的选项。有关详细信息,请参阅找到接触用户的最佳方式。如果您加入Apple Developer Enterprise Program,请参阅开发和分发企业应用程序,了解企业特定的 Xcode 步骤以导出您的应用程序。
app分发平台包含各种形式的多功能移动应用程序,如娱乐、购物、游戏等。这个阶段让客户可以浏览他们最喜欢的应用程序并随时下载。几乎每个可移植应用程序改进组织在分派应用程序时都关注这些阶段。这些阶段还为转移其应用程序以跟踪进展的组织或工程师提供了各种设备。从下载次数到应用程序出现的搜索次数,组织可以跟踪所有内容。因此,便携式应用程序分散在各种渠道上的基本原理被证明更为重要。
app分发平台源码及演示:s.appwin.top
一个非常易于使用、完全可定制且灵活的基于 Web 的 App Store,可最大限度地提高您的企业应用程序的采用率。为任何目的和用户知识水平做好准备,并提供指导安装体验。无需 MDM 解决方案即可在一处分发 iOS 和 Android 应用程序所需的一切。
分发方法的范围从为测试设备导出您的应用程序到将其上传到 App Store Connect。您可以使用TestFlight 将iOS、tvOS 和watchOS beta 版本分发给测试人员并收集反馈。如果您想将您的应用程序分发给已注册的设备、使用 TestFlight 或通过 App Store 的 beta 测试,您需要加入APP开发项目。为您创建一个 App Store Connect 帐户,您可以开始上传构建。
加入APP开发项目可以访问分发方法以及可以添加到应用程序的功能。一项功能授予您的应用访问 提供的应用服务的权限。
要使用任何分发方法,您首先要创建应用程序的存档。存档是您的应用程序的构建,包括 Xcode 存储在包中的调试信息。
在 Xcode 项目的主窗口中,从 Scheme 工具栏菜单中选择一个目标和一个仅构建设备或真实设备。如果目标是模拟器,则无法创建存档。然后,选择 Product > Archive 来构建目标,并创建将出现在 Archives 管理器中的存档。
您可以通过选择窗口 > 管理器直接打开档案管理器。如果您想确认您的应用已准备好提交到 TestFlight 或 App Store,但尚未提交,请选择您的存档,然后单击验证应用。Xcode 将对应用程序执行有限的自动初始验证并提供反馈。
选择分发方法和选项
您可以导出存档或将其上传到 App Store Connect。您导出应用程序以将其分发到 App Store 之外,然后将其上传以通过 TestFlight 或 App Store 分发它。
在档案管理器中,选择档案,然后单击分发应用程序。在下一张表中,根据您的应用平台选择分发方法。
要仅在注册设备上分发给有限数量的用户(例如,在您的组织内分发),请选择 Ad Hoc 或 Development。有关详细信息,请参阅将您的app分发到已注册的设备。要使用 TestFlight 或通过 App Store 分发,请选择 App Store Connect。
要在 App Store 之外分发由 Apple 公证或使用开发者 ID 签名的 macOS 应用程序,请选择开发者 ID。
根据您的分发方法选择您的分发选项。例如,如果您使用导出分发方法,您将选择应用程序精简和按需资源选项,因为您需要自己分发应用程序。如果您上传到 App Store Connect,您将选择是否包含位码或符号。
如果您选择 App Store Connect 或 Developer ID 作为您的分发方法,您还需要选择目标选项。您可以选择将您的构建上传到 App Store,或将您的构建导出到本地以便稍后上传。
分发测试版
当您向用户分发应用的 Beta 版或提供即将发布的版本的预览时,请使用基于应用平台的方法:
对于 iOS、tvOS 或 watchOS 应用,使用 TestFlight 将应用的 Beta 版分发给内部和外部测试人员。TestFlight 应用程序允许受邀用户安装、Beta 测试、提供反馈并获取应用程序的更新。Apple 会为您分发测试版,然后您只需在 App Store Connect 上管理构建和用户。要了解更多信息,请参阅TestFlight beta 测试概述,有关 Xcode 特定的步骤,请参阅使用 TestFlight 分发应用程序。
对于所有平台,向您的开发者帐户中注册的设备分发测试版。仅当您可以保留部分有限的开发设备进行 Beta 测试时,才选择此选项。要了解更多信息,请参阅将您的app分发到已注册的设备。
对于 macOS 应用程序,在通过 App Store 分发应用程序之前,将经过 Apple 公证的构建分发给测试人员。要了解更多信息,请参阅分发前对 macOS 软件进行公证。
在 App Store 上发布
在对最终版本进行 Beta 版测试后,将其提交给 App Review,然后在 App Store 上提供。
如果您使用 TestFlight 分发测试版,并输入了 App Store 发布所需的附加信息,只需将 App Store Connect 中显示的最后一个构建提交到 App Review。要了解更多信息,请参阅发布应用程序概述。
否则,请按照通过 App Store 分发应用程序中的所有步骤准备您的应用程序并将其上传到 App Store Connect,然后将其提交给 App Review。
在 App Store 之外分发
对于 macOS 应用程序,您可以导出经过公证的应用程序以在 App Store 之外分发,但您可能需要先禁用需要 Apple Developer Program 会员资格的功能,然后再将应用程序自己分发给用户。要了解更多信息,请参阅分发前对 macOS 软件进行公证。
分发业务应用程序
还有几个用于分发业务、定制或内部应用程序的选项。有关详细信息,请参阅找到接触用户的最佳方式。如果您加入Apple Developer Enterprise Program,请参阅开发和分发企业应用程序,了解企业特定的 Xcode 步骤以导出您的应用程序。

关于editor 聚焦失焦,insert插入图片文字时候不弹出软键盘问题
最近在开发uniapp 即时通讯遇到一个问题
由于要发送表情 想在输入框显示表情,所以input和textarea都不可行,就选择用了editor
但是在用insertImage 插入表情的时候,editor就聚焦弹出软键盘了,就出现表情列表和软键盘同时出现的问题
这样体验不好,也不美观
经过多方查找 找到两个方法
1、通过renderjs方法给editor加inputmode 属性 这个属性可以自行查询
if(!val) {
this.$el.querySelector('.ql-editor').setAttribute('inputmode', 'none')
} else {
console.log(this.$el)
if(this.$el.querySelector('.ql-editor')) this.$el.querySelector('.ql-editor').removeAttribute('inputmode')
}
通过选择表情还是输入文字来增加移出inputmode 属性 (ql-editor这个是editor组件内部的一个div)
但是这种方法有一个bug 如果是长页面 ,插入表情 软键盘确实可以不弹出了但是 页面会抖动,
2、就是修改hubuider关于editor的源码
https://ask.dcloud.net.cn/question/103551
参考这篇文章
D:\HBuilderX\plugins\uniapp-cli\node_modules\@dcloudio\uni-app-plus\dist
修改view.umd.min.js 这个js
insertImage
i = h.getLength()-1;
h.insertEmbed(i, "image", P, f.sources.USER);
var M = !!/^(file|blob):/.test(P) && P;
u = !0, h.formatText(i, 1, "data-local", M), h.formatText(i, 1, "alt",
x), h.formatText(i, 1, "width", C), h.formatText(i, 1, "height", O),
h.formatText(i, 1, "class", E), u = !1, h.formatText(i, 1,
"data-custom", Object.keys(A).map((function(t) {
return "".concat(t, "=").concat(A[t])
// })).join("&"));
})).join("&")), h.setSelection(null, f.sources.SILENT);
h.blur()
这种方法完美实现
最近在开发uniapp 即时通讯遇到一个问题
由于要发送表情 想在输入框显示表情,所以input和textarea都不可行,就选择用了editor
但是在用insertImage 插入表情的时候,editor就聚焦弹出软键盘了,就出现表情列表和软键盘同时出现的问题
这样体验不好,也不美观
经过多方查找 找到两个方法
1、通过renderjs方法给editor加inputmode 属性 这个属性可以自行查询
if(!val) {
this.$el.querySelector('.ql-editor').setAttribute('inputmode', 'none')
} else {
console.log(this.$el)
if(this.$el.querySelector('.ql-editor')) this.$el.querySelector('.ql-editor').removeAttribute('inputmode')
}
通过选择表情还是输入文字来增加移出inputmode 属性 (ql-editor这个是editor组件内部的一个div)
但是这种方法有一个bug 如果是长页面 ,插入表情 软键盘确实可以不弹出了但是 页面会抖动,
2、就是修改hubuider关于editor的源码
https://ask.dcloud.net.cn/question/103551
参考这篇文章
D:\HBuilderX\plugins\uniapp-cli\node_modules\@dcloudio\uni-app-plus\dist
修改view.umd.min.js 这个js
insertImage
i = h.getLength()-1;
h.insertEmbed(i, "image", P, f.sources.USER);
var M = !!/^(file|blob):/.test(P) && P;
u = !0, h.formatText(i, 1, "data-local", M), h.formatText(i, 1, "alt",
x), h.formatText(i, 1, "width", C), h.formatText(i, 1, "height", O),
h.formatText(i, 1, "class", E), u = !1, h.formatText(i, 1,
"data-custom", Object.keys(A).map((function(t) {
return "".concat(t, "=").concat(A[t])
// })).join("&"));
})).join("&")), h.setSelection(null, f.sources.SILENT);
h.blur()
这种方法完美实现
收起阅读 »
商米设备获取设备序列号
为了获取商米SN序列号,研究了好久,直接上代码,希望对各位开发者有帮助
var Build = plus.android.importClass("android.os.Build");
var SystemProperties = plus.android.importClass("android.os.SystemProperties");
var sunmi_serial = '';
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
sunmi_serial = SystemProperties.get('ro.sunmi.serial')
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
sunmi_serial = Build.getSerial()
} else{
sunmi_serial = Build.SERIAL
}
console.log('商米序列号',sunmi_serial);
权限不要忘记勾上
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
为了获取商米SN序列号,研究了好久,直接上代码,希望对各位开发者有帮助
var Build = plus.android.importClass("android.os.Build");
var SystemProperties = plus.android.importClass("android.os.SystemProperties");
var sunmi_serial = '';
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
sunmi_serial = SystemProperties.get('ro.sunmi.serial')
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
sunmi_serial = Build.getSerial()
} else{
sunmi_serial = Build.SERIAL
}
console.log('商米序列号',sunmi_serial);
权限不要忘记勾上
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
收起阅读 »

关于uniapp 集成友盟统计,离线SDK打包问题(避坑)
一、SDK版本:3.4.15 、Hx版本3.4.15
二、Android 平台集成友盟统计,离线打包
- 按照 官方文档 添加权限、依赖库、dcloud_properties.xm配置;
官方文档dcloud_properties.xm配置有问题,修改services节点如下:<services> <service name="Statistic-Umeng" value="io.dcloud.feature.statistics.umeng.StatisticsBootImpl"/> </services>
按照官方文档集成友盟统计后,友盟后台怎么都没有数据,尝试在重写Application,手动初始化友盟sdk,很快就有数据上来,但是并非最佳处理方案,于是提交了云打包,对比版本包的配置文件,发现dcloud_properties.xm 有出入。
三、IOS平台集成友盟统计,离线打包 (官方文档)
- IOS 平台也是一样的坑,反复对比了 离线SDK ,/SDK/Bundles/PandoraApi.bundle/feature.plist 文件的配置,发现出入很大。
按照官方的集成步骤,需要修改Statistic节点,如图:
通过云打包,分析包里的feature.plist 文件配置,出现了如下差异
通过官方QQ群,确认,最后配置修改为和云打包的一直,如图;
2.官方文档没有提到配置渠道,如图:
在umeng -- appkey 下继续增加 channel 节点,配置即可,如图:
四、业务代码中调用,官方文档
plus.statistic.eventTrig('launch',{"type": '统计启动次数' });
友盟后台注册对应的自定义事件。
至此,离线版本SDK,友盟统计集成完毕!感觉踩了大坑,
一、SDK版本:3.4.15 、Hx版本3.4.15
二、Android 平台集成友盟统计,离线打包
- 按照 官方文档 添加权限、依赖库、dcloud_properties.xm配置;
官方文档dcloud_properties.xm配置有问题,修改services节点如下:<services> <service name="Statistic-Umeng" value="io.dcloud.feature.statistics.umeng.StatisticsBootImpl"/> </services>
按照官方文档集成友盟统计后,友盟后台怎么都没有数据,尝试在重写Application,手动初始化友盟sdk,很快就有数据上来,但是并非最佳处理方案,于是提交了云打包,对比版本包的配置文件,发现dcloud_properties.xm 有出入。
三、IOS平台集成友盟统计,离线打包 (官方文档)
- IOS 平台也是一样的坑,反复对比了 离线SDK ,/SDK/Bundles/PandoraApi.bundle/feature.plist 文件的配置,发现出入很大。
按照官方的集成步骤,需要修改Statistic节点,如图:
通过云打包,分析包里的feature.plist 文件配置,出现了如下差异
通过官方QQ群,确认,最后配置修改为和云打包的一直,如图;
2.官方文档没有提到配置渠道,如图:
在umeng -- appkey 下继续增加 channel 节点,配置即可,如图:
四、业务代码中调用,官方文档
plus.statistic.eventTrig('launch',{"type": '统计启动次数' });
友盟后台注册对应的自定义事件。
至此,离线版本SDK,友盟统计集成完毕!感觉踩了大坑,
收起阅读 »
uni-app 应用内打开本地pdf,不需要原生插件,支持iOS、andorid
uni-app 应用内打开本地pdf,不需要原生插件,支持iOS、andorid
有偿提供源码,有需要的加QQ:543610866
uni-app 应用内打开本地pdf,不需要原生插件,支持iOS、andorid
有偿提供源码,有需要的加QQ:543610866

uniapp 原生模块 全栈开发,接单欢迎老板联系QQ:195510690
接单欢迎老板联系QQ:195510690
uniapp 原生模块 全栈开发,熟悉前后端开发,可以做uni-app的混合app
可做小程序,也熟悉安卓java和objective-c,可做原生app开发,及原生模块开发
小程序开发也ok,欢迎联系咨询!!!
接单欢迎老板联系QQ:195510690
uniapp 原生模块 全栈开发,熟悉前后端开发,可以做uni-app的混合app
可做小程序,也熟悉安卓java和objective-c,可做原生app开发,及原生模块开发
小程序开发也ok,欢迎联系咨询!!!

uniapp的环境变量.env
背景:之前在cli编译方式下,一直使用.env的方式进行环境变量的加载,非常的方便,而且在部署上也是把环境文件与开发人员分离开的。但是在使用HBuilderX的方式部署时,.env文件是加载不到的,需要重新思考和处理这个环境变量的问题。刚开始,我尝试使用了js做判断,在我看来,不算是个好方法,因为要在main.js中调用,在我看来在编译时使用最佳。所以,自己尝试了一下,也希望能分享和交流。
一、环境变量与编译方式
1.CLI编译
也就是:vue-cli-service的打包方式
我的理解:内核还是webpack,但是额外增加了一些处理,尤其是环境变量的处理。
注意:vue-cli-service只有三种环境,我之前以为可以自定义,其实不可以。
参考官方文档:https://cli.vuejs.org/zh/guide/mode-and-env.html#环境变量
这里明确说了:
想要了解解析环境文件规则的细节,请参考 dotenv。
vue-cli-service使用dotenv解析.env文件之后,使用@vue/cli-service/lib/util/resolveClientEnv.js
const prefixRE = /^VUE_APP_/
module.exports = function resolveClientEnv (options, raw) {
const env = {}
Object.keys(process.env).forEach(key => {
if (prefixRE.test(key) || key === 'NODE_ENV') {
env[key] = process.env[key]
}
})
env.BASE_URL = options.publicPath
if (raw) {
return env
}
for (const key in env) {
env[key] = JSON.stringify(env[key])
}
return {
'process.env': env
}
}
过滤了一部分key,不是APP_VUE*这个开头的全局变量就会被过滤掉,此外还保留了NODE_ENV
通常来说,我们都是在项目的根目录下面执行vue-cli-service,所以默认的环境变量文件.env也是在根目录下面。
2.HBuilderX编译
HBuilderX的编译时,也是使用的webpack。但是HBuilderX的编译,是没有处理根目录下的.env文件的。
二、解决方案
1.使HBuilderX也能自动加载.env文件
在根目录下的vue.config.js(如果没有就创建一个)
const webpack = require('webpack')
const dotenv = require('dotenv')
module.exports = {
chainWebpack: config => {
config
.plugin('define')
.tap(args => {
//console.log(args)
const config = getEnvsByDot()
//console.log(config)
// 将自定义的环境变量塞入配置中
//这里有个格式转化时的字符串的坑
//'"http://127.0.0.1:8088/"' //这种没问题
//'http://127.0.0.1:8088/' //这种就报错了!
Object.keys(config).forEach(key => {
if(typeof config[key] == "string"){
config[key] = '"'+config[key]+'"'
}
args[0]['process.env'][key] = config[key]
})
//args[0]['process.env'] = Object.assign(args[0]['process.env'],config)
console.log(args)
return args
})
}
}
/**
* 从.env中获取
* 使用了dotenv依赖
* 模仿vue-cli-service,不是APP_VUE*这个开头的全局变量就会被过滤掉
*/
function getEnvsByDot(){
const prefixRE = /^VUE_APP_/
let dotEnvs = {}
//1.先加载通用环境变量
const envPath0 = __dirname+'/.env'
const dotEnvsConfig0 = dotenv.config({path:envPath0})
console.log(dotEnvsConfig0)
if(!dotEnvsConfig0.error){
Object.keys(dotEnvsConfig0.parsed).forEach(key => {
if (prefixRE.test(key) ) {
dotEnvs[key] = dotEnvsConfig0.parsed[key]
}
})
}
//2.再加载专属环境变量
let env='local'
if (process.env.NODE_ENV === 'development') {
env='dev'
} else if (process.env.NODE_ENV === 'production') {
env='prod'
}else{
env=process.env.NODE_ENV
}
const envPath = __dirname+'/.env.'+env
const dotEnvsConfig = dotenv.config({path:envPath})
console.log(dotEnvsConfig)
if(!dotEnvsConfig.error){
Object.keys(dotEnvsConfig.parsed).forEach(key => {
if (prefixRE.test(key) ) {
dotEnvs[key] = dotEnvsConfig.parsed[key]
}
})
}
return dotEnvs
}
当然,你也可以不过滤VUE_APP_前缀,自由的使用环境变量,自己注意不要产生与系统自带变量名的冲突就好了。
这个方法,应该足够让.env文件在HBuilderX下的使用与cli一样舒服了。但也带来一个问题,如果你这个项目同时使用cli编译的话,可能会导致.env被加载两次。当然了一般来说,由于两种方式创建的项目的文件夹结构不一样,所以可能你不会遇到既是用cli又是用HBuilderX编译的情况。
2.用yaml文件编译
其实yaml文件类型这几年在配置文件上用得挺多的,好读好写。
同样是在根目录下的vue.config.js(如果没有就创建一个)
const webpack = require('webpack')
const YAML = require('yaml')
const fs = require('fs')
module.exports = {
chainWebpack: config => {
config
.plugin('define')
.tap(args => {
console.log(args)
const config = getEnvsByYaml()
console.log(config)
// 将自定义的环境变量塞入配置中
args[0]['process.env'] = Object.assign(args[0]['process.env'],config)
console.log(args)
return args
})
}
}
/**
* 从env文件中读取配置:
* 1.要获取文件绝对路径,因为相对路径是相对于编译器的,而不是项目的根目录。使用了__dirname。
* 2.使用了yaml格式。
*/
function getEnvsByYaml(){
//1.先加载通用环境变量
const prefixRE = /^VUE_APP_/
let yamlEnvs = {}
let config0 = {}
try{
const envYaml0 = fs.readFileSync(__dirname+'/.env.yaml','utf8')
config0 = YAML.parse(envYaml0)
}catch(e){
console.log(e)
}
// console.log(config0)
Object.keys(config0).forEach(key => {
if (prefixRE.test(key) ) {
yamlEnvs[key] = config0[key]
}
})
//2.再加载专属环境变量
let env='local'
if (process.env.NODE_ENV === 'development') {
env='dev'
} else if (process.env.NODE_ENV === 'production') {
env='prod'
}else{
env=process.env.NODE_ENV
}
let config = {}
try{
const envYaml = fs.readFileSync(__dirname+'/.env.'+env+'.yaml','utf8')
config = YAML.parse(envYaml)
}catch(e){
console.log(e)
}
// console.log(config)
Object.keys(config).forEach(key => {
if (prefixRE.test(key) ) {
yamlEnvs[key] = config[key]
}
})
return yamlEnvs
}
3.同时使用.env和yaml
配置好,爱用哪个就用哪个,也可以同时用,但要确定好优先级。我个人会把yaml的优先级放高一点,因为它更结构化。
方法就是把上面两个的代码一次执行,先下载.env,再加载yaml
背景:之前在cli编译方式下,一直使用.env的方式进行环境变量的加载,非常的方便,而且在部署上也是把环境文件与开发人员分离开的。但是在使用HBuilderX的方式部署时,.env文件是加载不到的,需要重新思考和处理这个环境变量的问题。刚开始,我尝试使用了js做判断,在我看来,不算是个好方法,因为要在main.js中调用,在我看来在编译时使用最佳。所以,自己尝试了一下,也希望能分享和交流。
一、环境变量与编译方式
1.CLI编译
也就是:vue-cli-service的打包方式
我的理解:内核还是webpack,但是额外增加了一些处理,尤其是环境变量的处理。
注意:vue-cli-service只有三种环境,我之前以为可以自定义,其实不可以。
参考官方文档:https://cli.vuejs.org/zh/guide/mode-and-env.html#环境变量
这里明确说了:
想要了解解析环境文件规则的细节,请参考 dotenv。
vue-cli-service使用dotenv解析.env文件之后,使用@vue/cli-service/lib/util/resolveClientEnv.js
const prefixRE = /^VUE_APP_/
module.exports = function resolveClientEnv (options, raw) {
const env = {}
Object.keys(process.env).forEach(key => {
if (prefixRE.test(key) || key === 'NODE_ENV') {
env[key] = process.env[key]
}
})
env.BASE_URL = options.publicPath
if (raw) {
return env
}
for (const key in env) {
env[key] = JSON.stringify(env[key])
}
return {
'process.env': env
}
}
过滤了一部分key,不是APP_VUE*这个开头的全局变量就会被过滤掉,此外还保留了NODE_ENV
通常来说,我们都是在项目的根目录下面执行vue-cli-service,所以默认的环境变量文件.env也是在根目录下面。
2.HBuilderX编译
HBuilderX的编译时,也是使用的webpack。但是HBuilderX的编译,是没有处理根目录下的.env文件的。
二、解决方案
1.使HBuilderX也能自动加载.env文件
在根目录下的vue.config.js(如果没有就创建一个)
const webpack = require('webpack')
const dotenv = require('dotenv')
module.exports = {
chainWebpack: config => {
config
.plugin('define')
.tap(args => {
//console.log(args)
const config = getEnvsByDot()
//console.log(config)
// 将自定义的环境变量塞入配置中
//这里有个格式转化时的字符串的坑
//'"http://127.0.0.1:8088/"' //这种没问题
//'http://127.0.0.1:8088/' //这种就报错了!
Object.keys(config).forEach(key => {
if(typeof config[key] == "string"){
config[key] = '"'+config[key]+'"'
}
args[0]['process.env'][key] = config[key]
})
//args[0]['process.env'] = Object.assign(args[0]['process.env'],config)
console.log(args)
return args
})
}
}
/**
* 从.env中获取
* 使用了dotenv依赖
* 模仿vue-cli-service,不是APP_VUE*这个开头的全局变量就会被过滤掉
*/
function getEnvsByDot(){
const prefixRE = /^VUE_APP_/
let dotEnvs = {}
//1.先加载通用环境变量
const envPath0 = __dirname+'/.env'
const dotEnvsConfig0 = dotenv.config({path:envPath0})
console.log(dotEnvsConfig0)
if(!dotEnvsConfig0.error){
Object.keys(dotEnvsConfig0.parsed).forEach(key => {
if (prefixRE.test(key) ) {
dotEnvs[key] = dotEnvsConfig0.parsed[key]
}
})
}
//2.再加载专属环境变量
let env='local'
if (process.env.NODE_ENV === 'development') {
env='dev'
} else if (process.env.NODE_ENV === 'production') {
env='prod'
}else{
env=process.env.NODE_ENV
}
const envPath = __dirname+'/.env.'+env
const dotEnvsConfig = dotenv.config({path:envPath})
console.log(dotEnvsConfig)
if(!dotEnvsConfig.error){
Object.keys(dotEnvsConfig.parsed).forEach(key => {
if (prefixRE.test(key) ) {
dotEnvs[key] = dotEnvsConfig.parsed[key]
}
})
}
return dotEnvs
}
当然,你也可以不过滤VUE_APP_前缀,自由的使用环境变量,自己注意不要产生与系统自带变量名的冲突就好了。
这个方法,应该足够让.env文件在HBuilderX下的使用与cli一样舒服了。但也带来一个问题,如果你这个项目同时使用cli编译的话,可能会导致.env被加载两次。当然了一般来说,由于两种方式创建的项目的文件夹结构不一样,所以可能你不会遇到既是用cli又是用HBuilderX编译的情况。
2.用yaml文件编译
其实yaml文件类型这几年在配置文件上用得挺多的,好读好写。
同样是在根目录下的vue.config.js(如果没有就创建一个)
const webpack = require('webpack')
const YAML = require('yaml')
const fs = require('fs')
module.exports = {
chainWebpack: config => {
config
.plugin('define')
.tap(args => {
console.log(args)
const config = getEnvsByYaml()
console.log(config)
// 将自定义的环境变量塞入配置中
args[0]['process.env'] = Object.assign(args[0]['process.env'],config)
console.log(args)
return args
})
}
}
/**
* 从env文件中读取配置:
* 1.要获取文件绝对路径,因为相对路径是相对于编译器的,而不是项目的根目录。使用了__dirname。
* 2.使用了yaml格式。
*/
function getEnvsByYaml(){
//1.先加载通用环境变量
const prefixRE = /^VUE_APP_/
let yamlEnvs = {}
let config0 = {}
try{
const envYaml0 = fs.readFileSync(__dirname+'/.env.yaml','utf8')
config0 = YAML.parse(envYaml0)
}catch(e){
console.log(e)
}
// console.log(config0)
Object.keys(config0).forEach(key => {
if (prefixRE.test(key) ) {
yamlEnvs[key] = config0[key]
}
})
//2.再加载专属环境变量
let env='local'
if (process.env.NODE_ENV === 'development') {
env='dev'
} else if (process.env.NODE_ENV === 'production') {
env='prod'
}else{
env=process.env.NODE_ENV
}
let config = {}
try{
const envYaml = fs.readFileSync(__dirname+'/.env.'+env+'.yaml','utf8')
config = YAML.parse(envYaml)
}catch(e){
console.log(e)
}
// console.log(config)
Object.keys(config).forEach(key => {
if (prefixRE.test(key) ) {
yamlEnvs[key] = config[key]
}
})
return yamlEnvs
}
3.同时使用.env和yaml
配置好,爱用哪个就用哪个,也可以同时用,但要确定好优先级。我个人会把yaml的优先级放高一点,因为它更结构化。
方法就是把上面两个的代码一次执行,先下载.env,再加载yaml

大咖授课+项目实战+工作offer,2022数据智能夏令营火热招募中!
作为浙江省温州市政府2022年启动的重点建设项目,中国(温州)数据智能与安全服务创新园【简称中国(温州)数安港】致力于推进数据要素、优质企业和创新力量的集聚,探索安全合规的数据市场化新路径,加快培育数据智能与安全服务产业生态。
数安港正着力打造一套数据安全与合规体系、一个大数据联合计算中心、一个专业司法保障部门、一个工程师学院等“九个一”体系。其中,专业人才的培育既是数安港建设的核心之一,更是数智产业创新发展的重要引擎。
对此,中国(温州)数安港特面向高校学生及社会青年人才发起“数据智能夏令营”活动,通过提供全方位、沉浸式学习课程和实践机会,挖掘、培育更多“高精尖”数据技术人才,为数据智能领域创新发展注入新力量。
|主办单位|
中国(温州)数据智能与安全服务创新园
温州市高教园区建设管理委员会
|承办单位|
每日互动股份有限公司
浙江省大数据联合计算中心有限公司
活动安排
活动时间:2022年7月1日-7月7日
活动地点:中国(温州)数安港
(浙江省温州市瓯海经济开发区北纬一路27号)
整体日程:
7月1日:入营报到+欢迎派对
7月2日-7月6日:夏令营课程培训
7月7日:小组汇报+结营仪式
具体课程安排(拟):
夏令营导师阵容(拟邀)
陈积明 浙江工业大学副校长
李 玺 浙江大学教授
金 盛 浙江大学副教授
王 巍 微博COO、新浪移动CEO
汪 源 网易副总裁、网易杭州研究院执行院长
王仲远 快手技术副总裁、MMU负责人
徐甲甲 科大讯飞股份有限公司副总裁
方 毅 每日互动股份有限公司CEO
杜小飞 数因科技CEO
汪奕菲 极豆科技CEO
叶新江 每日互动股份有限公司CTO
吴嘉之 资深算法专家
何 莺 量化算法专家
报名与选拔
招募对象:
对数据智能相关领域有浓厚兴趣,并有志于在温发展的高校学生及社会青年人才(计算机、信息技术、电子信息工程等理工类专业,经管、法学、新闻传播等人文社科类专业人员优先)。
报名时间:
即日起至2022年6月27日18:00
报名材料:
*1、个人简历
*2、过往竞赛及项目经历
3、成绩证明
4、专业技能资格证书
报名方式:
将上述报名材料以邮件形式发送至报名邮箱DataCamp@getui.com,邮件主题请以“报名+姓名+学校”命名
备注:带“*”为必交的材料,其余为弹性材料,如能提供将对审核选拔有所帮助。
审核选拔:
收到报名申请材料后,将安排专人对报名材料进行初步审核,并结合线上面试方式同步复审,择优录取。
相关说明
费用说明:
本次夏令营不收取任何培训费用,并且为每位入营学员提供路费报销(飞机经济舱、高铁二等座);所有入营学员在夏令营期间的食宿等均由组委会提供。
防疫说明
本次活动举办及学员安排将严格遵守全国疫情防控要求和当地防疫政策,必要时,将视情况作出相应调整。
数安港介绍
续写数据智能创新史,打造数据安全先行区。2022年2月,浙江省温州市政府启动重点建设项目——中国(温州)数安港。
坐落于瓯海区的数安港,致力于推进数据要素、优质企业和创新力量的集聚,探索安全合规的数据市场化新路径,加快培育数据智能与安全服务产业生态。目前已成功吸引华为、京东、每日互动等26家企业入驻。
被寄予厚望的数安港,是产业发展的风向标、培育人才的创新园,更有望成为中国数字经济的重要枢纽。
这一片创新的热土,诚邀有志之士的加入!
2022数据智能夏令营
即刻报名
咨询电话:13777844272 张老师(微信同号)
咨询QQ:997786184
申请邮箱:DataCamp@getui.com
作为浙江省温州市政府2022年启动的重点建设项目,中国(温州)数据智能与安全服务创新园【简称中国(温州)数安港】致力于推进数据要素、优质企业和创新力量的集聚,探索安全合规的数据市场化新路径,加快培育数据智能与安全服务产业生态。
数安港正着力打造一套数据安全与合规体系、一个大数据联合计算中心、一个专业司法保障部门、一个工程师学院等“九个一”体系。其中,专业人才的培育既是数安港建设的核心之一,更是数智产业创新发展的重要引擎。
对此,中国(温州)数安港特面向高校学生及社会青年人才发起“数据智能夏令营”活动,通过提供全方位、沉浸式学习课程和实践机会,挖掘、培育更多“高精尖”数据技术人才,为数据智能领域创新发展注入新力量。
|主办单位|
中国(温州)数据智能与安全服务创新园
温州市高教园区建设管理委员会
|承办单位|
每日互动股份有限公司
浙江省大数据联合计算中心有限公司
活动安排
活动时间:2022年7月1日-7月7日
活动地点:中国(温州)数安港
(浙江省温州市瓯海经济开发区北纬一路27号)
整体日程:
7月1日:入营报到+欢迎派对
7月2日-7月6日:夏令营课程培训
7月7日:小组汇报+结营仪式
具体课程安排(拟):
夏令营导师阵容(拟邀)
陈积明 浙江工业大学副校长
李 玺 浙江大学教授
金 盛 浙江大学副教授
王 巍 微博COO、新浪移动CEO
汪 源 网易副总裁、网易杭州研究院执行院长
王仲远 快手技术副总裁、MMU负责人
徐甲甲 科大讯飞股份有限公司副总裁
方 毅 每日互动股份有限公司CEO
杜小飞 数因科技CEO
汪奕菲 极豆科技CEO
叶新江 每日互动股份有限公司CTO
吴嘉之 资深算法专家
何 莺 量化算法专家
报名与选拔
招募对象:
对数据智能相关领域有浓厚兴趣,并有志于在温发展的高校学生及社会青年人才(计算机、信息技术、电子信息工程等理工类专业,经管、法学、新闻传播等人文社科类专业人员优先)。
报名时间:
即日起至2022年6月27日18:00
报名材料:
*1、个人简历
*2、过往竞赛及项目经历
3、成绩证明
4、专业技能资格证书
报名方式:
将上述报名材料以邮件形式发送至报名邮箱DataCamp@getui.com,邮件主题请以“报名+姓名+学校”命名
备注:带“*”为必交的材料,其余为弹性材料,如能提供将对审核选拔有所帮助。
审核选拔:
收到报名申请材料后,将安排专人对报名材料进行初步审核,并结合线上面试方式同步复审,择优录取。
相关说明
费用说明:
本次夏令营不收取任何培训费用,并且为每位入营学员提供路费报销(飞机经济舱、高铁二等座);所有入营学员在夏令营期间的食宿等均由组委会提供。
防疫说明
本次活动举办及学员安排将严格遵守全国疫情防控要求和当地防疫政策,必要时,将视情况作出相应调整。
数安港介绍
续写数据智能创新史,打造数据安全先行区。2022年2月,浙江省温州市政府启动重点建设项目——中国(温州)数安港。
坐落于瓯海区的数安港,致力于推进数据要素、优质企业和创新力量的集聚,探索安全合规的数据市场化新路径,加快培育数据智能与安全服务产业生态。目前已成功吸引华为、京东、每日互动等26家企业入驻。
被寄予厚望的数安港,是产业发展的风向标、培育人才的创新园,更有望成为中国数字经济的重要枢纽。
这一片创新的热土,诚邀有志之士的加入!
2022数据智能夏令营
即刻报名
咨询电话:13777844272 张老师(微信同号)
咨询QQ:997786184
申请邮箱:DataCamp@getui.com
收起阅读 »
云函数与云对象相关
不知何月何日在云函数中穿插了一段云对象的代码,可能是之前想试一下云对象用法没删干净,但是一直在h5运行也没有问题就给忘了。然后最近app调试一直报错require(...).main is not a function,一段一段代码去排查注释才发现的问题。
表现:H5运行正常,APP运行调用函数反馈访问任何一个云函数功能均得到报错:require(...).main is not a function
对于 require() is not a function 网络常见回答是教用户在require()后面添加分号 ; 不过报错在APP段始终存在的。
针对这种奇奇怪怪的问题还是多从自己的代码方面看看有无冗余代码。类似问题还有诸如错误的import引用了未知变量。
当然云函数与云对象不可共存是文档中明确标注的问题,不过还是希望以后能在编译时检测到提示吧,虽然是自己的疏忽。
不知何月何日在云函数中穿插了一段云对象的代码,可能是之前想试一下云对象用法没删干净,但是一直在h5运行也没有问题就给忘了。然后最近app调试一直报错require(...).main is not a function,一段一段代码去排查注释才发现的问题。
表现:H5运行正常,APP运行调用函数反馈访问任何一个云函数功能均得到报错:require(...).main is not a function
对于 require() is not a function 网络常见回答是教用户在require()后面添加分号 ; 不过报错在APP段始终存在的。
针对这种奇奇怪怪的问题还是多从自己的代码方面看看有无冗余代码。类似问题还有诸如错误的import引用了未知变量。
当然云函数与云对象不可共存是文档中明确标注的问题,不过还是希望以后能在编译时检测到提示吧,虽然是自己的疏忽。
收起阅读 »
承接uni-app项目外包,网站、小程序、APP都可以接哦
在线接单,享受满减优惠5k-0.5k,1w-1k,2w-2k,以此类推,
个人团队接uni-app外包项目开发。承接UI、H5、小程序、、PC端网站、后台系统等产品
有需求的老板可以联系
联系QQ:1819080149 vx:web9688
在线接单,享受满减优惠5k-0.5k,1w-1k,2w-2k,以此类推,
个人团队接uni-app外包项目开发。承接UI、H5、小程序、、PC端网站、后台系统等产品
有需求的老板可以联系
联系QQ:1819080149 vx:web9688

2022后的跨平台应用框架只有2个,一个是Tauri,一个是Flutter
Electron目前是桌面应用最成熟的方案,太多的成熟案例了VScode,Teams,国内的有迅雷等等。
QT起步很早,但是单一个框架商业化,还不是像Unity那样行业内有绝对优势的真的发展的下去吗?其实走开源路线也能赚钱,不知道QT的team怎么想的。
Tauri是Electron的新竞争对手,桌面端目前没有成熟案例,不过热度升的是真的快。
Tauri和Flutter一样野心很大,想跨全平台,还想做Android和iOS。
不过是否能做成Android和iOS还是一个问号,别最后像Capacitor那样说是新技术,但是没人用尴。
Tauri自身还在和Quasar合作,Quasar是目前我个人认为基于Vue的最好的跨平台框架了,但是他自身是一个UI+后端统一api的缝合怪,Tauri正在和Quasar合作,缝合Tauri后我去试试再。
前端基于webview其实不是致命伤,最多部分优化不好的应用或者很老的机器跑起来才卡。
Flutter桌面应用刚起步,没有成熟案例,不过手机跨两端还是Flutter最成熟,热度也最高,对于一个2019年正式推出的框架成绩真的很好了。
RN热度依然在降,做过实际项目的都知道,稍微复杂一点,还不如两个Team各自写原生的。Airbnb退出就是最好的证明。
其他的一些选择:
微软基于.net的MAUI不好说,谁知道他们是否又能像VScode那样,突然又蹦出一个杀手级的应用或者说开发套件
苹果SwiftUI和安卓Compose各自搞得那套不会给对手优化到哪里去的。
Uni-app还是跨平台小程序唯一选择,没有桌面端api和UI配套,只能吃吃国内各家小程序各自搞垄断的红利了。
我大胆预言一下,2022后的跨平台应用框架只有2个,一个是Tauri,一个是Flutter。
Electron目前是桌面应用最成熟的方案,太多的成熟案例了VScode,Teams,国内的有迅雷等等。
QT起步很早,但是单一个框架商业化,还不是像Unity那样行业内有绝对优势的真的发展的下去吗?其实走开源路线也能赚钱,不知道QT的team怎么想的。
Tauri是Electron的新竞争对手,桌面端目前没有成熟案例,不过热度升的是真的快。
Tauri和Flutter一样野心很大,想跨全平台,还想做Android和iOS。
不过是否能做成Android和iOS还是一个问号,别最后像Capacitor那样说是新技术,但是没人用尴。
Tauri自身还在和Quasar合作,Quasar是目前我个人认为基于Vue的最好的跨平台框架了,但是他自身是一个UI+后端统一api的缝合怪,Tauri正在和Quasar合作,缝合Tauri后我去试试再。
前端基于webview其实不是致命伤,最多部分优化不好的应用或者很老的机器跑起来才卡。
Flutter桌面应用刚起步,没有成熟案例,不过手机跨两端还是Flutter最成熟,热度也最高,对于一个2019年正式推出的框架成绩真的很好了。
RN热度依然在降,做过实际项目的都知道,稍微复杂一点,还不如两个Team各自写原生的。Airbnb退出就是最好的证明。
其他的一些选择:
微软基于.net的MAUI不好说,谁知道他们是否又能像VScode那样,突然又蹦出一个杀手级的应用或者说开发套件
苹果SwiftUI和安卓Compose各自搞得那套不会给对手优化到哪里去的。
Uni-app还是跨平台小程序唯一选择,没有桌面端api和UI配套,只能吃吃国内各家小程序各自搞垄断的红利了。
我大胆预言一下,2022后的跨平台应用框架只有2个,一个是Tauri,一个是Flutter。
收起阅读 »