当前位置: 首页 > news >正文

个人网站好备案吗wordpress 字体不一样

个人网站好备案吗,wordpress 字体不一样,wordpress插件+手机版,广州网站开发解决方案作者#xff1a;前行的乌龟到现在组件化真的不是什么新鲜东西了#xff0c;大公司都用的滚瓜烂熟#xff0c;龙飞凤舞了#xff0c;也就是现在部分中型项目和小项目在组件化的路上努力。所以同志们#xff0c;组件化没玩过的#xff0c;不熟悉的赶紧搞起来#xff0c;说… 作者前行的乌龟到现在组件化真的不是什么新鲜东西了大公司都用的滚瓜烂熟龙飞凤舞了也就是现在部分中型项目和小项目在组件化的路上努力。所以同志们组件化没玩过的不熟悉的赶紧搞起来说一点你不会组件化发布影子工程那么对你来说就是个噩梦。从本质上来讲任何技术进步都是在现实需求的逼迫下抓耳挠腮耗尽无数头发才想出来的。哈哈这里说个笑话罢了。所以呢组件化这个东西出来这么久了页发展了这么久了用的人越来越多那肯定是对我们显示开发大有裨益的下伙伴们不会不熟悉抓紧啦要不面试问你你怎么回答呢下面来正式说说组件化组件化这个东西其实并不复杂他就是种思路本质上是一种 app 架构思路说穿了很简单的难在组件化改造的时候真正写起代码会出现不少棘手的问题当然这些坑基本前人都趟完了这里我主要是记录下要是你看到熟悉的部分请不要骂我啊毕竟都是前辈们的东西啊。这里补充一下组件化是一种 app 架构他的发展也是沿着正常的技术发展脉络来的也是为了以追求高复用高可维护性的目的的代码封装区别是组件化是对整个 app 的再次封装。废话了这么多那么什么是组件化呢各位看官想不要着急在详细说组件化之前我们要搞懂2个概念就是上面说的组件和模块。首先组件和模块都不是官方规定的都是这些技术发展下来大家约定俗成的概念其实很简单一说就明白模块android 中的模块就是业务模块单指业务是按照业务对 app 进行拆分比如说订单我们搞成一个模块个人中心我们搞成一个模块视频音频这些都搞成模块在app中的体现就是 一个个modulemodule 的中文意思也是模块这不准这就是 google 对我们的暗示呢。模块化的目的是为了搭积木随便拿几个模块module 出来就可以谁谁便便的上线一个 app你还别说现在影子 app 的需求很旺盛你去看看大公司的项目那个不是一堆影子工程头条还搞出一个头条视频的马甲呢这其实就是把视频 module 拿出来加上一个启动页。这样的例子是比比皆是的要不说不会组件化影子工程对你就是噩梦呢哈哈到时候维护那是想也别想了代码你要搞多少份啊。组件这个一样简单啊说穿了就是我们平时干的事对功能的封装这就是组件一个功能就是一个组件IO数据库网络等等这些功能都是组件这么说你就明白了吧。既然这样那为毛线我们还要搞出来这个一个组件的概念当然了任何事都是有其意义的因为组件对功能代码的封装有个很高了明确的要求一处封装处处使用。要我们把维护性复用性扩展性性能做到极致因为这样才能真正做到一处封装处处使用。当然组件的范围现在也是覆盖的很广的app 中的一切都是组件基本上我们分为基础功能组件通用UI组件基础业务组件。以上我谈了下我自己对于模块化组件化的理解是目前开发中对于模块和组件的理解。在模块化和组件化的发展中概念也是有些调整变化的大家只要看现在是什么样子就好了深入学习的话有兴趣可以看看组件化模块化的发展历程。我认为 Android 模块化探索与实践 对于模块化组件化概念的解释是最优秀的。组件化和模块化在现在看是一回事了如果把一个项目看成是袋中的组合的话那么模块就是体积最大的哪些袋子组件就是体积小的袋子大的袋子是最直接可被外接观测和接触的袋子大的袋子也是用小的袋子组成的一个不太恰当的比喻吧模块和组件就是这样的关系是我们对业务和功能拆分封装的理解。好了正式开始介绍了组件化啦组件化在工程表现上就是我们把 app 按照其业务的不同划分为不同的 module模块把各种功能封装成一个个 librarymodule 之间是严格禁止横向依赖的要不怎么单独使用呢我不能为了用一个 module把相关的module 都带上吧要是这么 module 还有依赖的module 呢这样谈复用性就是扯淡了。主 app 就是我们常说的壳工程依赖这些 modulelibrary 由需求的 module 依赖但是要考虑library 版本的问题随着业务和功能的扩展library 的数量也是巨大的微信在组件化拆分时据说拆分出80多个 module可见 library 也是少不了的。module 和 library 多数时候我们是提供arr 和 jar 来给壳工程引用的arr 和 jar 在编译时是不会再编译的只会检查版本保留一个最新的版本既提高了 app 的编译速度也提供一种资源冲突解决方式。下面我放一些图来描述一下组件化大伙仔细看看图比文字可生动多了modules.png项目如何组件化.组件化核心router我们在抽象 module 时module 之间是没有相互依赖的是严格解耦的为了达到我们复用的目的。module 之间不能相互依赖就没法调用别的 module 的代码了那么面对业务之间的页面相互调起相互通信这些常见的需求我们该怎么办没错就是大伙在上面的图里面看见的东西 router。router 是我们统一制定的模块间通讯协议router 中我们主要是处理以下几个问题模块之间页面跳转模块之间数据传递模块初始化处理router.pngrouter 这东西有现成的你也可以自己封装。使用的思路都是把 router 作为一个组件所有的业务 module 都依赖这个 router 组件当然壳app 也是然后我们把需要的模块间页面跳转数据传递初始化都注册到 router 中这里面就体现到我们定义的统一通用的模块通讯协议的重要性了router 维护多个集合保存这里关系然后我们通过router 就可以实现模块间的通讯了。router 的封装还是挺麻烦的要写好了不容易现在用的比较多的有阿里的 ARouter最早出现的 ActivityRouterspiny同学的router这是我的最爱目前不维护了思路很棒并且考虑到了进程化的问题可惜没有使用 APT 注解技术练手的 router上面我介绍了几个 router 路由基本上不论是自己写还是用现成的router 基本上都是上面这几个的样子了当然了现在好的 router 还是要使用 APT注解技术来动态去 router 注册模块方法自己写代码去注册的话使用很使用有些问题不好处理比如 router 的静态实例要是被回收了你再 new 一个出来那么模块注册的方法怎么办写起来太麻烦还不如 APT 注解来的方便扩展性也好。这里有个ToyBricks_Android项目模块化解决方案 可以解决 APT不能扫描 arr 包的问题。最后说一下module 间的通讯其实可以分成3种页面调起某种事件的通知直接调用某些模块的业务方法页面调起现在的 router 都可以很好的完成这个任务。某些事件的通知比如我切换城市了通知某些页面去显示或是刷新数据这个根据业务来说影响的范围会很广的会影响多个业务的因为 module 的复用性我们在 module 中是不能确定会具体影响哪些业务module 的那么这种场景使用 eventbus/广播比较合适了。直接调用默写模块的业务方法这属性业务模块间在业务上的强耦合了这个碰到产品这么设计你也没办法一般碰到这样的场景也是会保证相关的业务module 都是会加载的所以呢在定义 router 灵活一些可以做到调用指定module 的某些方法找到另一个说法我很喜欢和我的理念也很接近出自Android 架构设计MVC、MVP、MVVM和组件化所谓的组件化通俗理解就是将一个工程分成各个模块各个模块之间相互解耦可以独立开发并编译成一个独立的 APP 进行调试然后又可以将各个模块组合起来整体构成一个完整的 APP。它的好处是当工程比较大的时候便于各个开发者之间分工协作、同步开发被分割出来的模块又可以在项目之间共享从而达到复用的目的。组件化有诸多好处尤其适用于比较大型的项目。各个模块之间如何进行数据共享和数据通信我们可以把需要共享的数据划分成一个单独的模块来放置公共数据。各个模块之间的数据通信我们可以使用阿里的 ARouter 进行页面的跳转使用封装之后的 RxJava 作为 EventBus 进行全局的数据通信。router 我不想说太多也说不好这部分大伙看我最后的链接吧或是看看上面4个路由也可以不论如何实现router 是为了给 module 模块搭建一个通讯的中间平台目的就是这样。仔细的大家多看吧这里我也是看别人的。我再逼逼一下module 和 library 我们尽量不要提供源代码的方式提供依赖这不符合我们复用的目的到时候你发布几个影子功能或是别的 app那么你使用源代码依赖方式的 module 和 library 你怎么提供维护所以尽量使用 arr 和 jar 的方式。我们可以把一些定位相近library 打包成一个 module 也是不错的。我们一定要熟悉gradle的使用在组件化中我们会大量的使用 gradle 提供各种资源加载的配置和环境配置组件化最核心的目的就是代码的高可复用和高可维护和高可扩展性能其他的优点都是属于连带性质的我们要先把握住核心点学习其他的都不是主要有时间再看组件化碰到的问题1. 子模块单独编译测试在做组件化开发时我们测试 module 库都是把 module 单独达成 apk 文件在发布module时 提供 library 供外界依赖这都是通过配置 module 的 gradle 的编译模式实现的首先在子模块build.gradle中定义常量来标示模块目前是否处于开发模式def isDebug true在子模块的build.gradle中进行模式配置。debug模式下编译成独立apprelease模式下编译成library。1if (isDebug.toBoolean()) {2    apply plugin: com.android.application3} else {4    apply plugin: com.android.library5}两种模式下模块AndroidManifest.xml文件是有差别的。作为独立运行的app有自己的Application要加Launcher的入口intent作为library不需要。这个问题很好解决写两个不同的AndroidManifest.xml即可并在gradle中进行配置。在 gradle 脚本中配置 1android { 2    sourceSets { 3        main { 4            if(isDebug.toBoolean()) { 5                manifest.srcFile src/debug/AndroidManifest.xml 6            } else { 7                manifest.srcFile src/release/AndroidManifest.xml 8            } 9        }10    }11}2. sdk和第三方库的版本一致性不同module依赖sdk版本不一致会因兼容性问题导致编译问题。不同module引用了同一个第三方库的不同版本并且这个库没有做到向前兼容就有可能出现方法找不到、参数不对应等问题。所以有必要统一整个project的依赖版本。在最外层build.gradle中定义的常量能被整个project的build.gradle文件引用统一的版本定义可以放在这里。 1ext { 2    android_compileSdkVersion  25 3    android_buildToolsVersion  25.0.2 4    android_minSdkVersion  21 5    android_targetSdkVersion  25 6 7    lib_appcompat  com.android.support:appcompat-v7:25.1.1 8    lib_picasso  com.squareup.picasso:picasso:2.5.2 9    lib_gson  com.google.code.gson:gson:2.6.110}我没试过 arr资源的 module 是否还可以使用这种方式3. 资源id冲突android 中 module的资源文件最后都是会合并到主项目中的资源文件的 id 最终和 moudle 是的 id 是不一样的所以这就会出现资源重名的问题解决这个问题我们的做法就是module 资源加一个统一的前缀 1andorid{ 2    ... 3 4    buildTypes{ 5        ... 6    } 7 8    resourcePrefix moudle_prefix 910}但是注意 res 文件夹下的文件可以用 gradle 脚本加前缀但是图片资源不行图片资源我们还是需要在命名时自己添加前缀4. application初始化的问题子模块作为application时有一些初始化的工作需要在Application.onCreate时进行。而作为library时调不到这个onCreate。所以自己写一个静态方法供主工程的Application调用。 1public class ApplicationA extends Application { 2 3Override public void onCreate() { 4  super.onCreate(); 5  //给底层library设置context 6  AppContext.init(getApplicationContext()); 7} 8  /** 9   * 作为library时需要初始化的内容10   */11  public static void onCreateAsLibrary() {12    //给FunctionBus传入接口的实例13    FunctionBus.setFunction(new FunctionA() {14      Override public String getData(String key) {15        return xixi;16      }17    });18  }19}主工程的Application onCreate时记得初始化子模块。1public class MainApplication extends Application {23  Override public void onCreate() {4    super.onCreate();5    AppContext.init(getApplicationContext());6    ApplicationA.onCreateAsLibrary();7    ApplicationB.onCreateAsLibrary();8  }9}除了提供方法在壳工程里面调用还可以结合使用了 APT 技术的 router 来做使用注解就不用我们自己去调用了彻底解耦5. library依赖问题先说一个问题在组件化工程模型图中多媒体组件和Common组件都依赖了日志组件而A业务组件有同时依赖了多媒体组件和Common组件这时候就会有人问你这样搞岂不是日志组件要被重复依赖了而且Common组件也被每一个业务组件依赖了这样不出问题吗其实大家完全没有必要担心这个问题如果真有重复依赖的问题在你编译打包的时候就会报错如果你还是不相信的话可以反编译下最后打包出来的APP看看里面的代码你就知道了。组件只是我们在代码开发阶段中为了方便叫的一个术语在组件被打包进APP的时候是没有这个概念的这些组件最后都会被打包成arr包然后被app壳工程所依赖在构建APP的过程中Gradle会自动将重复的arr包排除APP中也就不会存在相同的代码了但是虽然组件是不会重复了但是我们还是要考虑另一个情况我们在build.gradle中compile的第三方库例如AndroidSupport库经常会被一些开源的控件所依赖而我们自己一定也会compile AndroidSupport库 这就会造成第三方包和我们自己的包存在重复加载解决办法就是找出那个多出来的库并将多出来的库给排除掉而且Gradle也是支持这样做的分别有两种方式根据组件名排除或者根据包名排除下面以排除support-v4库为例1dependencies {2    compile fileTree(dir: libs, include: [*.jar])3    compile(com.jude:easyrecyclerview:$rootProject.easyRecyclerVersion) {4        exlude module: support-v4//根据组件名排除5        exlude group: android.support.v4//根据包名排除6    }7}library重复依赖的问题算是都解决了但是我们在开发项目的时候会依赖很多开源库而这些库每个组件都需要用到要是每个组件都去依赖一遍也是很麻烦的尤其是给这些库升级的时候为了方便我们统一管理第三方库我们将给给整个工程提供统一的依赖第三方库的入口前面介绍的Common库的作用之一就是统一依赖开源库因为其他业务组件都依赖了Common库所以这些业务组件也就间接依赖了Common所依赖的开源库。 1dependencies { 2    compile fileTree(dir: libs, include: [*.jar]) 3    //Android Support 4    compile com.android.support:appcompat-v7:$rootProject.supportLibraryVersion 5    compile com.android.support:design:$rootProject.supportLibraryVersion 6    compile com.android.support:percent:$rootProject.supportLibraryVersion 7    //网络请求相关 8    compile com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion 9    compile com.squareup.retrofit2:retrofit-mock:$rootProject.retrofitVersion10    compile com.github.franmontiel:PersistentCookieJar:$rootProject.cookieVersion11    //稳定的12    compile com.github.bumptech.glide:glide:$rootProject.glideVersion13    compile com.orhanobut:logger:$rootProject.loggerVersion14    compile org.greenrobot:eventbus:$rootProject.eventbusVersion15    compile com.google.code.gson:gson:$rootProject.gsonVersion16    compile com.github.chrisbanes:PhotoView:$rootProject.photoViewVersion1718    compile com.jude:easyrecyclerview:$rootProject.easyRecyclerVersion19    compile com.github.GrenderG:Toasty:$rootProject.toastyVersion2021    //router22    compile com.github.mzule.activityrouter:activityrouter:$rootProject.routerVersion23}246. module不同业务环境使用不同代码我们做项目至少会有测试和线上2套环境吧组件化让我们开始重视 gradle通过 gradle 配置我们可以减少很多代码的书写的切换环境我们也是可以用 gradle 实现的在不通过的环境下注册不同的代码文件看下面这张图我们有 debug 和 release2个环境里面放的是不同环境执行的代码main 里面是跟环境切换无关的代码部分我我们这样设置 gradle 就可以了 1android { 2    // ... 3    sourceSets { 4        debug { 5            java.srcDirs  [src/main/java, src/debug/java] 6        } 7        release { 8            java.srcDirs  [src/main/java, src/release/java] 9        }10    }11}此外在发布该 library 时需要指定一些设置如下1android {2    // ...3    defaultConfig {4        // ...5        defaultPublishConfig release6        publishNonDefault true7    }8}说明defaultPublishConfig release默认 library 只会生产 release 下的版本此版本将会被所有项目使用通过defaultPublishConfig可以控制默认生产哪个版本的库。publishNonDefault true默认情况下不能生产所有版本的 library通过设置publishNonDefault为true可以同时生产所有版本的 library。业务组件 module 依赖不同的基础组件生产的 library如下1dependencies {2    // ...3    debugCompile project(path: :baselibrary, configuration: debug)4    releaseCompile project(path: :baselibrary, configuration: release)5}6在使用通过这样的配置脚本解决了多个 APK 包依赖同一组件生产的不同的 library最终得到我们需要的开发/测试/生产 APK 包。合并多个 module 到一个文件夹studio 中的 module 我们在引用时都是用项目名 冒号来表示的1implementation project(:basecomponents)2注意这只是表示我们要引用这个名字的 module 了而这个 module 的地址这里我们不管那么就可以理解为 module 的地址可以随我们任意配置那么在哪里配置 module 的地址呢答案就是在 setting.gradle 文件里我们给 :basecomponents 这个 module 指定他的地址就行比如我们想新建一个名字为 components 的文件夹存放我们的组件 module 组件我们给2个 ( basecomponents,aaa )然后我们在 setting.gradle 里指定每个项目的文件路径1include :app, :basecomponents, :aaa23project(:basecomponents).projectDir  new File( components/basecomponents )4project(:aaa).projectDir  new File( components/aaa )一个好的组件化文档是必须的组件化是 android 开发步入新时代的未来是代码膨胀支持快速开发的必然一个好的组件化文档在现今来看也是必须的了下面贴个图组件化的坑组件化是好但是坑也是不少不好填尤其是 databindingdaggerbufferkinft这是源于 studio 编译的问题。studio 中 module 虽然是在代码上独立于壳工程的但是在编译时最后还是要合并到壳工程中的要不怎么达成一个 APK 文件要是多个 APK 文件把不成了插件化了嘛插件化坑更多啊。合并 module 到壳工程就会产生一个根本问题module 的 R 文件数值改变了。module 的 R文件数据不是固定的只有壳工程的 R 文件才是常量值时不变的module 的 R 文件数值在把 modul 的资源合并到壳工程后才会确定下来那么这就对依靠编译时注解的技术造成了难题你指定的 R 路径最后找不到并且据说这里面还涉及注解的 final 不了解看到有人这么说所以大家在开发组件化时对于带注解技术的框架要多注意有坑要多看才能爬过去组件化文章Android 模块化探索与实践 安居客的时间案例对概念的解释非常到位适合初学者和概念混乱的同学看特别是有提供详细的 demo 哦关于Android模块化我有一些话不知当讲不 这是我目前看到的最贴近实际的好文了绝对值得一看的Android组件化方案https://blog.csdn.net/guiying712/article/details/55213884这篇文章讲的最好还设计大量 gradle 配置的思考android开发由模块化到组件化https://blog.csdn.net/dd864140130/article/details/53645290)优秀的组件化方案Android彻底组件化方案实践https://www.jianshu.com/p/1b1d77f58e84Android彻底组件化demo发布https://www.jianshu.com/p/59822a7b2fad---END---推荐阅读2020年10月编程语言排行榜C语言登顶Java下滑“终于懂了” 系列Android屏幕刷新机制—VSync、Choreographer 全面理解25岁程序员 VS 35岁程序员你中了几条有同学这么设置Intellij IDEA据说效率还不错~细数 2020 年官方对 Android 的那些重大更新Android Debug 调试原理再见onActivityResult你好Activity Results API面试官邪魅一笑: 你说说 Java8 的 ConcurrentHashMap 更文不易点个“在看”支持一下?
http://www.pierceye.com/news/681166/

相关文章:

  • 网站建设合同的效力网站建设公司需要交税么
  • 色弱可以做网站开发吗建网站的步骤及方法
  • 卖衣服的网站排名discuz分类信息模板
  • 广西网站开发公司招聘网页制作软件
  • 网站框架一般用什么做dede搭建网站教程
  • 郑州网站开发比较好的网络公司网络推广公司有多少家
  • 银川做网站服务免费word模板
  • 个人网站备案方法网站开发制作云盘
  • 培训做网站传奇手游发布网站
  • 中国保密在线网站培训系统手机购物平台
  • 厦门网站制作建设沐风 wordpress 主题
  • 网站选择城市怎么做北京招聘信息
  • 一个做搞笑类视频的网站取名手机端企业网站源码
  • 房地产网站模板网站建设论文范文
  • 任丘网站制作公司pc网站制作公司
  • 惠州城乡规划建设局网站工程公司经营范围
  • 淮南服装网站建设地址巴彦淖尔网站建设公司
  • 如何让自己的网站被百度收录wordpress 悬浮网易云
  • 天津展示型网站建设外包腾讯云wordpress镜像
  • python做网站点登入没反映wordpress母公司
  • 中国建设培训网站查询系统地产项目网站建设ppt
  • 温州高端网站建设网站开发实验心得
  • 设计参考网站有哪些陕西省西安市事业单位招聘网
  • 月编程做网站wordpress需要调用缩略图
  • 做一份网站动态图多少钱网站托管服务公司
  • 宣传式网站营销型网站套餐
  • 建设网站如何优化关键词江门排名优化公司
  • 做教学的视频网站wordpress小工具推荐
  • 唯品会专门做特卖的网站保险行业网站模板
  • 电商类公司网站应该怎么搭建广州做网站公司哪家比较好