年底啦!总结下吧

不知不觉一年就过去了,这是我来公司的第二年,比起上一年今年在前端这一块变化还是非常的大的,可以说整个前端变化都非常的大,我们公司的前端也跟上了整体的步伐。接下来是对今年的一些思考和展望。

The Good

首先说说好的方面吧,去年我们前端是只有我一个人,今年前端团队终于多了两个人,在前端方面我也没有像之前那么随意了,更加注重团队的发展和怎么才能让我们前端小组开发的更爽,工作效率更高。

总的来说 2016 年主要的个人贡献就是完成了前端工程的基础构建。

前端工程化

回想起去年我刚来的时候,前端什么都没有,还是用着比较传统的方式,移动端用的是 zepto,后台用的是 jquery + bootstrap。到年中的时候才在移动端用了些自动化的工具。当时还没有前端工程化的概念。自从去年年末接触到 react 的时候才开始觉得我们的前端需要有所改变,不再是单纯做一个切图仔。

库/框架选型

在 520 活动的时候我们就开始用了 vue.js 作为前端的主要框架作为移动端页面的主要框架,解放了不少生产力,通过前端组件化可以合理的对 UI 组件进行分治,大大加强了代码的复用率,也方便了日后的维护。

简单构建优化和模块化开发

在选用 vue.js 之前我是用 grunt 来做为构建工具,现在因为项目需要进行模块化开发,最后选用了 webpack 作为构建工具,模块化开发的最大价值应该是分治,因为 Webkit 宣布默认打开 ES6 module 功能,CommonJS、AMD、UMD以及所有模块加载器全部过时,我们选用了 ES6 module。

自动化

还记得之前有个同事说过,如果你一件事情重复做了 3 遍就需要想办法去做优化,也就是 Don`t repeat your self。前端的自动化是通过 make 加上 npm script 组合的一连串命令执行预先写好的 node 代码完成自动化构建、上传静态文件、自动分环境等操作,上线只需一个命令加上去 apolo 点一下就行了。

同时用 Yeoman 编写了前端项目的脚手架,从此新项目开始就不用傻傻的去复制就项目的代码了,同时还可以再创建项目的时候加入一些配置,按照需求创建项目。

积累

我在项目中加入了一个各个项目公用的 git submodule。一年之中不断的写了许多公用的代码和工具的方法,包括了一些简单的弹窗和 Ajax 模块等,这个仓库以后一定还会慢慢的积累,方便日后的开发。对于不能放在公共仓库的代码就放在脚手架内。

后台前端框架

之前用的是 react + reflux,今天在 6.0 改版的时候决定重新写后台,借此机会我换了下结构,用的是 react + redux,虽然项目看起来好像复杂了不少,不过理解了之后一定是有利于项目的开发和日后的维护的。同时对之前简单的构建工具的配置进行了整理,开发起来会更加的方便。

The Bad

好的说完了说说做的不好的吧。

  • 首先是我的个人问题,工作的时候有时会有点小情绪,这个需要克制一下。

  • 工作缺少自测,其实这点是必须做的,但是我常常会忽略或者是做的不够认真,以后开发如果条件允许就去借一些手机在身边一起开发

  • 应该及时重构代码而不是“到时候”,提升代码质量。

展望

今年前端团队终于小有规模,希望在来年我们能共同进步吧。

原文地址: https://hongguancheng.github.io/2016/12/30/2016-summary/

<think>嗯,用户之前问过安卓四大组件,现在又问Fragment和WebView,看来他们可能是在学习Android开发,想深入理解常用组件。我需要先理清这两个概念的关系,确保回答能补充之前的四大组件内容。 Fragment是Activity的一部分,用于模块化UI,特别是处理不同屏幕尺寸的情况。用户可能想知道Fragment的优势,比如复用性,或者和Activity的区别。要举例子,比如浏览器中的标签页,每个标签可能是一个Fragment,方便切换和管理。 WebView是用来显示网页的控件,用户可能想知道如何在应用内集成浏览器功能。需要提到基本的用法,比如加载URL,处理JavaScript,还有安全方面的注意事项,比如漏洞和HTTPS支持。 还要考虑用户可能的实际需求,比如如何实现多个页面切换,或者处理网页加载时的性能优化。可能需要提到与Service、BroadcastReceiver的协作,比如后台加载或网络状态监听。 要注意代码示例的正确性,比如Fragment的创建和添加到Activity,WebView的基本配置。同时,提醒用户版本差异,比如AndroidX的包名变化,以及网络权限的添加。 最后总结两者的结合使用场景,比如浏览器应用的主界面结构,如何用Fragment管理多个WebView实例,这样用户能有一个完整的理解。</think>好的,我们以浏览器应用开发为场景,详细解析Fragment和WebView的实现逻辑及协作关系: --- ### **一、Fragment(碎片化界面组件)** **设计定位**:Activity的模块化UI容器(可视为"子Activity") #### **典型应用场景**: 1. **标签页管理**(每个标签页对应一个Fragment) 2. **响应式布局**(手机/平板不同屏幕适配) 3. **UI组件复用**(组合式界面开发) #### **浏览器标签页实现示例**: ```java public class TabFragment extends Fragment { private WebView mWebView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_tab, container, false); mWebView = view.findViewById(R.id.webview); return view; } public void loadUrl(String url) { mWebView.loadUrl(url); // 网页加载方法 } } ``` #### **生命周期对比**: ``` Activity生命周期: onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy() Fragment生命周期: onAttach() → onCreate() → onCreateView() → onActivityCreated() → onDestroyView() → onDetach() ``` #### **核心特性**: | 特性 | 说明 | |-----------------------|----------------------------------------------------------------------| | 回退栈管理 | 通过`FragmentTransaction.addToBackStack()`实现导航历史 | | 动态替换 | 使用`replace()`方法切换界面模块 | | 参数传递 | 通过`setArguments(Bundle)`初始化数据 | | 与Activity通信 | 使用`requireActivity()`获取宿主引用,或定义接口回调 | --- ### **二、WebView(网页渲染引擎)** **核心能力**:基于Chromium内核的网页容器(Android 4.4+) #### **基础配置流程**: ```java WebView webView = findViewById(R.id.webview); // 基础设置 webView.getSettings().setJavaScriptEnabled(true); // 启用JS webView.getSettings().setDomStorageEnabled(true); // 启用DOM存储 webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, WebRequest request) { view.loadUrl(request.getUrl().toString()); // 禁止跳转系统浏览器 return true; } }); webView.loadUrl("https://www.example.com"); ``` #### **关键功能扩展**: 1. **混合开发支持**: ```java // 建立JS与Java通信桥梁 webView.addJavascriptInterface(new JsBridge(), "NativeBridge"); class JsBridge { @JavascriptInterface public void showToast(String msg) { Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show(); } } ``` 2. **下载管理器集成**: ```java webView.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); // 触发系统下载 }); ``` 3. **性能优化配置**: ```java // 启用硬件加速 webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); // 内存管理优化 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } ``` #### **安全防护要点**: ```xml <!-- AndroidManifest.xml 必要权限控制 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ``` ```java // 防范常见漏洞 webView.getSettings().setAllowFileAccess(false); // 禁用文件访问 webView.getSettings().setAllowContentAccess(false); // 禁用内容访问 ``` --- ### **Fragment与WebView协作模式** **浏览器典型架构**: ``` MainActivity (Activity) ├── TabStripFragment (管理标签页头) ├── TabContentFragment (ViewPager2容器) │ ├── WebViewFragment1 (内含WebView) │ ├── WebViewFragment2 │ └── WebViewFragment3 └── ToolbarFragment (地址栏/控制栏) ``` **动态添加标签页示例**: ```java FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); TabFragment newTab = TabFragment.newInstance("https://www.newpage.com"); transaction.add(R.id.fragment_container, newTab); transaction.addToBackStack(null); transaction.commit(); ``` **内存泄漏防护**: ```java @Override public void onDestroyView() { if (mWebView != null) { mWebView.stopLoading(); // 停止加载 mWebView.setWebViewClient(null); mWebView.setWebChromeClient(null); mWebView.destroy(); mWebView = null; } super.onDestroyView(); } ``` --- ### **版本适配要点** | Android版本 | 注意事项 | |----------------------|--------------------------------------------------------------------------| | Android 5.0+ | 强制启用HTTPS(混合内容策略) | | Android 7.0+ | 使用FileProvider处理文件访问 | | Android 10+ | 限制后台剪贴板访问 | | AndroidX WebView | 需添加依赖:`implementation 'androidx.webkit:webkit:1.6.1'` | --- ### **调试技巧** 1. Chrome DevTools远程调试: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } ``` 2. 启用详细日志: ```java webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { Log.d("WebViewConsole", consoleMessage.message()); return true; } }); ``` 这种架构设计既能实现多标签页浏览的核心功能,又能保证系统资源的合理利用。实际开发中建议结合`WebViewPool`实现WebView实例复用,并通过`LifecycleObserver`实现生命周期自动化管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值