HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

Uniapp 添加自定义参数,添加 webpack 插件,用 vue.config.js

uniapp

实际项目中,我们需要加入一些自定义的参数。比如针对 ENV=production / NODE_ENV=development ,两种编译方式,设置不同的参数。

1、当 ENV=production,api 使用域名 app.example.com
2、当 NODE_ENV=development,api 使用域名 dev.example.com

可以这样实现,在项目根目录下创建文件 vue.config.js,添加如下代码:

const webpack = require('webpack')  

module.exports = {  
    configureWebpack: {  
        plugins: [  
            new webpack.DefinePlugin({  
                "process.env": {  
                    'SERVER_URL': process.env.NODE_ENV == 'production' ?  
                        JSON.stringify('https://app.example.com/') : JSON.stringify('https://dev.example.com/')  
                }  
            })  
        ]  
    }  
}

需要调用的地方,直接使用 process.env.SERVER_URL,比如我在 config.js 中这样:

var config = {  
    apiUrl: process.env.SERVER_URL   'api/',  
}  

export default config

webpack 会在编译的时候替换掉 process.env.SERVER_URL,你可以在 dist 输出目录搜索 "example.com",就可以验证是否成功了。

使用Webpack PWA等其他插件

PWA 仅是针对Web发布的技术,chrome,firefox,微软Edge 都支持,而且可以直接加入系统的应用列表,入口和电脑应用一样,方便直接启动。

Webpack 有针对pwa的插件,在 uniapp 下,同样可以再 vue.config.js 中添加,代码参考如下:

注:参考代码里的 CopyWebpackPlugin,是无需编译,直接copy发布用的,也可以参考。

const webpack = require('webpack')  
const path = require('path')  
const CopyWebpackPlugin = require('copy-webpack-plugin')  

const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');  
const WebpackPwaManifest = require('webpack-pwa-manifest');  

const {  
    getManifestJson,  
    parseManifestJson  
} = require('@dcloudio/uni-cli-shared/lib/manifest');  

const manifest = parseManifestJson(getManifestJson());  

module.exports = {  
    configureWebpack: {  
        plugins: [  
            new CopyWebpackPlugin([  
                {  
                    from: path.join(__dirname, 'src/packages/static'),  
                    to: path.join(__dirname, 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'static')  
                }  
            ]),  
            new SWPrecacheWebpackPlugin(  
                {  
                    cacheId: 'bookcapt-cids',  
                    dontCacheBustUrlsMatching: /\.\w{8}\./,  
                    filename: 'service-worker.js',  
                    minify: false,  
                    navigateFallback: manifest.h5.router.base,  
                    staticFileGlobsIgnorePatterns: [/\.map$/, /manifest\.json$/, /automator\.json/]  
                }  
            ),  
            new WebpackPwaManifest({  
                name: '布克船长CIDAS',  
                short_name: '布克船长CIDAS',  
                description: '布克船长核心能力测评系统(CIDAS)',  
                background_color: '#f8f8f8',  
                theme_color: '#f8f8f8',  
                orientation: "landscape",  
                display: "standalone",  
                start_url: manifest.h5.router.base,  
                icons: [  
                    {  
                        src: path.resolve('src/static/pwa/logo.png'),  
                        sizes: [96, 128, 192],  
                        destination: path.join('assets', 'icons')  
                    }  
                ]  
            })  
        ]  
    }  
}

PWA页面见:https://app.readlevel.com/exam/#/

继续阅读 »

实际项目中,我们需要加入一些自定义的参数。比如针对 ENV=production / NODE_ENV=development ,两种编译方式,设置不同的参数。

1、当 ENV=production,api 使用域名 app.example.com
2、当 NODE_ENV=development,api 使用域名 dev.example.com

可以这样实现,在项目根目录下创建文件 vue.config.js,添加如下代码:

const webpack = require('webpack')  

module.exports = {  
    configureWebpack: {  
        plugins: [  
            new webpack.DefinePlugin({  
                "process.env": {  
                    'SERVER_URL': process.env.NODE_ENV == 'production' ?  
                        JSON.stringify('https://app.example.com/') : JSON.stringify('https://dev.example.com/')  
                }  
            })  
        ]  
    }  
}

需要调用的地方,直接使用 process.env.SERVER_URL,比如我在 config.js 中这样:

var config = {  
    apiUrl: process.env.SERVER_URL   'api/',  
}  

export default config

webpack 会在编译的时候替换掉 process.env.SERVER_URL,你可以在 dist 输出目录搜索 "example.com",就可以验证是否成功了。

使用Webpack PWA等其他插件

PWA 仅是针对Web发布的技术,chrome,firefox,微软Edge 都支持,而且可以直接加入系统的应用列表,入口和电脑应用一样,方便直接启动。

Webpack 有针对pwa的插件,在 uniapp 下,同样可以再 vue.config.js 中添加,代码参考如下:

注:参考代码里的 CopyWebpackPlugin,是无需编译,直接copy发布用的,也可以参考。

const webpack = require('webpack')  
const path = require('path')  
const CopyWebpackPlugin = require('copy-webpack-plugin')  

const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');  
const WebpackPwaManifest = require('webpack-pwa-manifest');  

const {  
    getManifestJson,  
    parseManifestJson  
} = require('@dcloudio/uni-cli-shared/lib/manifest');  

const manifest = parseManifestJson(getManifestJson());  

module.exports = {  
    configureWebpack: {  
        plugins: [  
            new CopyWebpackPlugin([  
                {  
                    from: path.join(__dirname, 'src/packages/static'),  
                    to: path.join(__dirname, 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'static')  
                }  
            ]),  
            new SWPrecacheWebpackPlugin(  
                {  
                    cacheId: 'bookcapt-cids',  
                    dontCacheBustUrlsMatching: /\.\w{8}\./,  
                    filename: 'service-worker.js',  
                    minify: false,  
                    navigateFallback: manifest.h5.router.base,  
                    staticFileGlobsIgnorePatterns: [/\.map$/, /manifest\.json$/, /automator\.json/]  
                }  
            ),  
            new WebpackPwaManifest({  
                name: '布克船长CIDAS',  
                short_name: '布克船长CIDAS',  
                description: '布克船长核心能力测评系统(CIDAS)',  
                background_color: '#f8f8f8',  
                theme_color: '#f8f8f8',  
                orientation: "landscape",  
                display: "standalone",  
                start_url: manifest.h5.router.base,  
                icons: [  
                    {  
                        src: path.resolve('src/static/pwa/logo.png'),  
                        sizes: [96, 128, 192],  
                        destination: path.join('assets', 'icons')  
                    }  
                ]  
            })  
        ]  
    }  
}

PWA页面见:https://app.readlevel.com/exam/#/

收起阅读 »

[uni-app]-安卓原生app特有的bug描述

[uni-app]-安卓原生app,在彼显现(v-if)此隐藏(v-else)的两个结构相似的doc对象中,在相同位置的同类型组件(特别是如 image、input 等这些组件)会进行复用,复用组件的v-if属性和样式会进行混用,动态切换的时候就会出现各种缺陷(明明是显示的组件其特有功能失效、呈现样式与预期的不一样,但微信小程序和苹果app的功能和呈现样式都正常)。


        <!-- 动态切换loginStatus的时候 图片圆角与预期的不一样 -->  
        <image v-if="loginStatus"  class="head-img-1" />  
        <image v-else  class="head-img-2" />  

<style>  
    .head-img-1 {  
        width: 80rpx;  
        height: 80rpx;  
        background-color: #999999;  
        border-radius: 40rpx;  
    }  

    .head-img-2 {  
        width: 80rpx;  
        height: 80rpx;  
        background-color: #999999;  
        border-radius: 8rpx;  
    }  
</style>
继续阅读 »

[uni-app]-安卓原生app,在彼显现(v-if)此隐藏(v-else)的两个结构相似的doc对象中,在相同位置的同类型组件(特别是如 image、input 等这些组件)会进行复用,复用组件的v-if属性和样式会进行混用,动态切换的时候就会出现各种缺陷(明明是显示的组件其特有功能失效、呈现样式与预期的不一样,但微信小程序和苹果app的功能和呈现样式都正常)。


        <!-- 动态切换loginStatus的时候 图片圆角与预期的不一样 -->  
        <image v-if="loginStatus"  class="head-img-1" />  
        <image v-else  class="head-img-2" />  

<style>  
    .head-img-1 {  
        width: 80rpx;  
        height: 80rpx;  
        background-color: #999999;  
        border-radius: 40rpx;  
    }  

    .head-img-2 {  
        width: 80rpx;  
        height: 80rpx;  
        background-color: #999999;  
        border-radius: 8rpx;  
    }  
</style>
收起阅读 »

H5开发业务外包,找个人或小团队支持。

Vue 外包

公司寻找可以长期提供前端技术开发支持的兼职个人或团队。现需要做一个类似http://www.ixiashan.cn/default 这种的h5(基于vue的最好),如果有整套可以直接用的最好;如果没有,可以作为成员之一加入我们的开发团队(远程即可)。有兴趣的联系我WX:Jonathanfu

继续阅读 »

公司寻找可以长期提供前端技术开发支持的兼职个人或团队。现需要做一个类似http://www.ixiashan.cn/default 这种的h5(基于vue的最好),如果有整套可以直接用的最好;如果没有,可以作为成员之一加入我们的开发团队(远程即可)。有兴趣的联系我WX:Jonathanfu

收起阅读 »

支付宝小程序使用动态加载插件

淘宝联盟

支付宝小程序插件支持动态加载,下面以淘宝联盟支付宝小程序营销套件为例说明一下在 uni-app 中的使用方式。

安装插件

在 npm 下载 miniapp-bc-user 模块后,将 miniapp-bc-user 模块及其依赖的 tslib 模块移动到 mycomponents 目录下

manifest 配置

在 manifest.json 中 mp-alipay 节点下配置 "useDynamicPlugins" : true

page 使用

<template>  
    <view>  
        <bc-module v-if="showComponent" code="suite://bc.suite.union618/bc.template.nav" name="block-nav" />  
    </view>  
</template>  

<script>  
    const {  
        loadBC  
    } = __non_webpack_require__('/mycomponents/miniapp-bc-user')  
    export default {  
        data() {  
            return {  
                showComponent: false,  
            }  
        },  
        async onReady() {  
            await loadBC().then(() => {  
                this.showComponent = true  
            })  
        }  
    }  
</script>  

<style>  

</style>

注意事项

  • 在 HBuilderX 3.1.19 版本之前,还需要在每次编译到小程序平台后,手动在生成的支付宝小程序 app.json 中增加 "useDynamicPlugins" : true
  • 需要使用 non_webpack_require 替代 require 来加载 miniapp-bc-user 模块,因为在此原生组件内也加载了相关模块,并依赖的模块内共享的状态,如果直接使用 require 会被 webpack 编译,和原生组件内引用的并非同一个模块,导致状态无法共享。
  • 需要开启压缩编译,因为在支付宝小程序内也使用了 webpack 编译,require 会被编译为 webpack_require 且由于编译时未进行安全重命名导致和 uni-app 框架的 webpack_require 冲突,启用 uni-app 的压缩编译后,uni-app 框架的 __webpack_require__ 会被压缩命名,避免和小程序框架冲突。
继续阅读 »

支付宝小程序插件支持动态加载,下面以淘宝联盟支付宝小程序营销套件为例说明一下在 uni-app 中的使用方式。

安装插件

在 npm 下载 miniapp-bc-user 模块后,将 miniapp-bc-user 模块及其依赖的 tslib 模块移动到 mycomponents 目录下

manifest 配置

在 manifest.json 中 mp-alipay 节点下配置 "useDynamicPlugins" : true

page 使用

<template>  
    <view>  
        <bc-module v-if="showComponent" code="suite://bc.suite.union618/bc.template.nav" name="block-nav" />  
    </view>  
</template>  

<script>  
    const {  
        loadBC  
    } = __non_webpack_require__('/mycomponents/miniapp-bc-user')  
    export default {  
        data() {  
            return {  
                showComponent: false,  
            }  
        },  
        async onReady() {  
            await loadBC().then(() => {  
                this.showComponent = true  
            })  
        }  
    }  
</script>  

<style>  

</style>

注意事项

  • 在 HBuilderX 3.1.19 版本之前,还需要在每次编译到小程序平台后,手动在生成的支付宝小程序 app.json 中增加 "useDynamicPlugins" : true
  • 需要使用 non_webpack_require 替代 require 来加载 miniapp-bc-user 模块,因为在此原生组件内也加载了相关模块,并依赖的模块内共享的状态,如果直接使用 require 会被 webpack 编译,和原生组件内引用的并非同一个模块,导致状态无法共享。
  • 需要开启压缩编译,因为在支付宝小程序内也使用了 webpack 编译,require 会被编译为 webpack_require 且由于编译时未进行安全重命名导致和 uni-app 框架的 webpack_require 冲突,启用 uni-app 的压缩编译后,uni-app 框架的 __webpack_require__ 会被压缩命名,避免和小程序框架冲突。
收起阅读 »

团队接单 uniapp、小程序、公众号、网站 有意联系Q:1940125999 V:18080373482

外包

团队接单 uniapp、小程序、公众号、网站 有意联系Q:1940125999 V:18080373482

团队接单 uniapp、小程序、公众号、网站 有意联系Q:1940125999 V:18080373482

代写 iOS 原生插件 需求

插件需求

代写 iOS 原生插件

有需要请联系 1585538620@qq.com

代写 iOS 原生插件

有需要请联系 1585538620@qq.com

语音识别插件配置问题

nodejs

在开发app过程中,问题一:我使用的是百度语音识别,安卓测试没有问题,苹果测试报11201错误(发生未知错误,核心技术由科大讯飞提供),我是使用的百度语音识别,为什么在苹果环境会出现科大讯飞的报错?问题二:我更换了语音识别模式为科大讯飞,在安卓机上测试报错(未经授权的语音应用,错误代码11201),我按照官方提供的文档操作,为什么还是会报错呢?

继续阅读 »

在开发app过程中,问题一:我使用的是百度语音识别,安卓测试没有问题,苹果测试报11201错误(发生未知错误,核心技术由科大讯飞提供),我是使用的百度语音识别,为什么在苹果环境会出现科大讯飞的报错?问题二:我更换了语音识别模式为科大讯飞,在安卓机上测试报错(未经授权的语音应用,错误代码11201),我按照官方提供的文档操作,为什么还是会报错呢?

收起阅读 »

uniapp原生开发不要使用Java8的lambda语法!

帮助文档

这么过分,一定要发DCLOUD论坛!

现在是凌晨1:00。本人在开发一个uniapp原生插件,需要集成第三方的sdk,在本地调试时一切正常,然后按照教程将插件打包后使用HubliderX在云端打包,却发现使用了sdk的方法除了一其中一个以外都不能用了???点击无任何反应,但是测试方法还能正常使用,然后我就开始各种找原因,,,,最后找了一天才发现,好像是正常的方法都没用lambda语法写,抱着试一试的心态,,,,结果真是这个原因。。。。乌鱼子!

HBuilderX2.3.8+开始支持配置云端打包java编译参数。 格式如下:
"compileOptions": { //可选,Java编译参数配置
"sourceCompatibility": "1.8",
"targetCompatibility": "1.8"
}
云端打包使用的jdk版本为1.8,仅支持取值"1.6"、"1.7"、"1.8"。

明明说的云端打包用的1.8.。。。结果不能用lambda语法。。。。绝了呀兄弟。为了这个无语的问题,我测试了整整一天啊!我的头发啊!
最后附上代码

//这是可以的,使用普通的写法  
apiInstance.cossQrReqCert(context, new CossReqCertCallBack() {  
    @Override  
     public void onCossReqCert(CossReqCertResult cossReqCertResult) {  
                    options.put("errCode",cossReqCertResult.getErrCode());//错误码  
                    options.put("errMsg",cossReqCertResult.getErrMsg());//错误信息  
                    options.put("msspID",cossReqCertResult.getMsspID());//  
                    callback.invoke(options);  
     }  
});
//这样就不行了。。  
apiInstance.cossQrReqCert(context, cossReqCertResult -> {  
                options.put("errCode",cossReqCertResult.getErrCode());//错误码  
                options.put("errMsg",cossReqCertResult.getErrMsg());//错误信息  
                options.put("msspID",cossReqCertResult.getMsspID());//  
                callback.invoke(options);  
});
继续阅读 »

这么过分,一定要发DCLOUD论坛!

现在是凌晨1:00。本人在开发一个uniapp原生插件,需要集成第三方的sdk,在本地调试时一切正常,然后按照教程将插件打包后使用HubliderX在云端打包,却发现使用了sdk的方法除了一其中一个以外都不能用了???点击无任何反应,但是测试方法还能正常使用,然后我就开始各种找原因,,,,最后找了一天才发现,好像是正常的方法都没用lambda语法写,抱着试一试的心态,,,,结果真是这个原因。。。。乌鱼子!

HBuilderX2.3.8+开始支持配置云端打包java编译参数。 格式如下:
"compileOptions": { //可选,Java编译参数配置
"sourceCompatibility": "1.8",
"targetCompatibility": "1.8"
}
云端打包使用的jdk版本为1.8,仅支持取值"1.6"、"1.7"、"1.8"。

明明说的云端打包用的1.8.。。。结果不能用lambda语法。。。。绝了呀兄弟。为了这个无语的问题,我测试了整整一天啊!我的头发啊!
最后附上代码

//这是可以的,使用普通的写法  
apiInstance.cossQrReqCert(context, new CossReqCertCallBack() {  
    @Override  
     public void onCossReqCert(CossReqCertResult cossReqCertResult) {  
                    options.put("errCode",cossReqCertResult.getErrCode());//错误码  
                    options.put("errMsg",cossReqCertResult.getErrMsg());//错误信息  
                    options.put("msspID",cossReqCertResult.getMsspID());//  
                    callback.invoke(options);  
     }  
});
//这样就不行了。。  
apiInstance.cossQrReqCert(context, cossReqCertResult -> {  
                options.put("errCode",cossReqCertResult.getErrCode());//错误码  
                options.put("errMsg",cossReqCertResult.getErrMsg());//错误信息  
                options.put("msspID",cossReqCertResult.getMsspID());//  
                callback.invoke(options);  
});
收起阅读 »

纯前端开发怎么开发微信射击类的小游戏

微信小程序 JavaScript

欢迎加入技术讨论

欢迎加入技术讨论

团队在线接活 uni-app,小程序,公众号,网站平台... 有意者联系 qq:1606007510,vx:14778209885

外包

团队在线接活 uni-app,小程序,公众号,网站平台... 有意者联系 qq:1606007510,vx:14778209885

团队在线接活 uni-app,小程序,公众号,网站平台... 有意者联系 qq:1606007510,vx:14778209885

企业级产品研发技术交流分享

小程序 java uniapp模板 uniapp插件 uniapp

技术栈介绍:
1、前端:小程序使用uniapp开发框架,web管理端使用基于Vue.js 2.x系列 + Element UI 的后台管理系统解决方案。
2、后端:使用java语言基于框架springcloud+netty开发,数据库redis+mysql。

技术方案:
springboot,mybatis,mysql,redis,springcloud,zuul,feign,swagger,eureka,netty

系统采用SaaS架构:小程序前端、个人web后端、总部web后端

有需要技术学习的同学,可以加我微信:18810760218

完整的企业级项目:包括架构、源码、数据库、部署、产品介绍

可以作为整个软件开发团队的技术底座、架构底座、应用底座、产品底座

60+核心功能,做为产品功能底座

继续阅读 »

技术栈介绍:
1、前端:小程序使用uniapp开发框架,web管理端使用基于Vue.js 2.x系列 + Element UI 的后台管理系统解决方案。
2、后端:使用java语言基于框架springcloud+netty开发,数据库redis+mysql。

技术方案:
springboot,mybatis,mysql,redis,springcloud,zuul,feign,swagger,eureka,netty

系统采用SaaS架构:小程序前端、个人web后端、总部web后端

有需要技术学习的同学,可以加我微信:18810760218

完整的企业级项目:包括架构、源码、数据库、部署、产品介绍

可以作为整个软件开发团队的技术底座、架构底座、应用底座、产品底座

60+核心功能,做为产品功能底座

收起阅读 »

iOS端调用的文字转语音并监听播报完毕

iOS
if (uni.getSystemInfoSync().platform == "ios") {  

    var AVAudioSession = plus.ios.importClass("AVAudioSession");  
    var AVSpeechSynthesizer = plus.ios.importClass("AVSpeechSynthesizer");  
    var AVSpeechUtterance = plus.ios.importClass("AVSpeechUtterance");  
    var AVSpeechSynthesisVoice = plus.ios.importClass("AVSpeechSynthesisVoice");  

    AVAudioSession.sharedInstance().setCategoryerror("AVAudioSessionCategoryPlayback", null);  

    var sppech = new AVSpeechSynthesizer();  

    var utterance = AVSpeechUtterance.speechUtteranceWithString("你的文字");  
    var voice = AVSpeechSynthesisVoice.voiceWithLanguage("zh-CN");  

    utterance.plusSetAttribute("voice",voice);  
    utterance.plusSetAttribute("rate", 0.65);// 0.65为速度,越大播报速度越快  

    sppech.speakUtterance(utterance);  

    // 监听播报完毕  
    var delegate = plus.ios.implements("AVSpeechSynthesizerDelegate", {  
        "speechSynthesizer:didFinishSpeechUtterance:":function(synthesizer,utterance){  

            console.log("播报完");  

        }  
    })  

    sppech.plusSetAttribute("delegate", delegate);  

}
继续阅读 »
if (uni.getSystemInfoSync().platform == "ios") {  

    var AVAudioSession = plus.ios.importClass("AVAudioSession");  
    var AVSpeechSynthesizer = plus.ios.importClass("AVSpeechSynthesizer");  
    var AVSpeechUtterance = plus.ios.importClass("AVSpeechUtterance");  
    var AVSpeechSynthesisVoice = plus.ios.importClass("AVSpeechSynthesisVoice");  

    AVAudioSession.sharedInstance().setCategoryerror("AVAudioSessionCategoryPlayback", null);  

    var sppech = new AVSpeechSynthesizer();  

    var utterance = AVSpeechUtterance.speechUtteranceWithString("你的文字");  
    var voice = AVSpeechSynthesisVoice.voiceWithLanguage("zh-CN");  

    utterance.plusSetAttribute("voice",voice);  
    utterance.plusSetAttribute("rate", 0.65);// 0.65为速度,越大播报速度越快  

    sppech.speakUtterance(utterance);  

    // 监听播报完毕  
    var delegate = plus.ios.implements("AVSpeechSynthesizerDelegate", {  
        "speechSynthesizer:didFinishSpeechUtterance:":function(synthesizer,utterance){  

            console.log("播报完");  

        }  
    })  

    sppech.plusSetAttribute("delegate", delegate);  

}
收起阅读 »