网页优化-缓存并加载本地js,css等资源文件(有坑,内容中道出)

Posted xiaohuanqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网页优化-缓存并加载本地js,css等资源文件(有坑,内容中道出)相关的知识,希望对你有一定的参考价值。

博客转移到:http://www.wangchengmeng.club/

现在很多项目中多变化的页面更希望使用H5来实现,方便快捷,且不需要时刻的去升级版本。但在体验上H5还是没有原生的好,在native和H5之间的交互,已经webview加载的速度上都有一定的弊端,优化的方案很多,今天尝试了一下将js css等资源文件缓存到本地,这样后续加载网页的时候速度上就会快一些。
当然,真正影响加载速度的有大概几个点:
1.网页中的诸多请求
2.js的执行已经css样式的渲染
3.图片等比较大的资源加载
4.网络等外界因素

今天就先解决第二点的优化,加载本地js css文件。

shouldOverrideUrlLoading(WebView view, String url)
这个方法大家都很熟悉,url拦截,也是native和H5交互的一个重点,主要是两端定义似有协议,拦截到是自定义的协议那么可以做对应的事情:

H5端:
    定义一个点击事件:
html:
<div>
    <button class="size" id="btn1" onclick="clickme()">button-1</button>
</div>
javascript:
   clickme =  function()  
      document.location = "js://webview?arg1=111&arg2=222";
    

android端:

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
            Uri uri = Uri.parse(url);
            //判断scheme 如果是私有定义的 拦截
            if (uri.getScheme()
                    .equals("js")) 
                if (uri.getAuthority()
                        .equals("webview")) 
                    //获取携带的参数
                    String arg1 = uri.getQueryParameter("arg1");
                    //TODO 拦截掉 做对应的客户端需要做的操作
                
                return true;
            
            return super.shouldOverrideUrlLoading(view, url);
        

除了shouldOverrideUrlLoading该方法以外还有一个方法叫shouldInterceptRequest,该方法是拦截H5资源加载的方法,在5.10以前是shouldInterceptRequest(WebView view, String url),后面被shouldInterceptRequest(WebView view, WebResourceRequest request)替代(如需仔细了解该方法咨询搜索)。今天的内容就主要是该方法中去操作。

再分享前,再分享自己踩过的一个很重要的坑,再本地测试的时候我是将js和css文件放在assert文件夹中的,且将Html文件也放在里面(为了方便),会有一个很重要的问题就是 shouldInterceptRequest该方法不会执行,具体是什么原因希望了解的人可以分享一下。然后我将html放入手机存储中就可以了。

1.一般再开发中H5 会有专门前端人员写(本地测试是自己写的)拿到前端的js和css文件后命好名放在asset文件夹中(如需要动态去下载另外,且名字一定和前端确定好,script标签中src路径名称相同)

2.然后当H5执行到js或者css的时候客户端会有拦截,直接加载本地的js和css文件,具体代码:

        @Nullable
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) 
            //资源拦截 加载本地 js css 文件
            String path = request.getUrl()
                    .getPath();
            String fileName = request.getUrl()
                    .getLastPathSegment();

            try 
                if (path.endsWith(".js")) 
                    InputStream inputStream = getAssets().open(fileName);
                    return new WebResourceResponse("text/javascript", "utf-8", inputStream);
                 else if (path.endsWith("css")) 
                    InputStream inputStream = getAssets().open(fileName);
                    return new WebResourceResponse("text/css", "utf-8", inputStream);

                
             catch (Exception e) 
                e.printStackTrace();
            
            return super.shouldInterceptRequest(view, request);
        

其实也很简单,只是本地测试过程中踩了个坑,希望记录一下,有知道的可以请教一下。

以上是关于网页优化-缓存并加载本地js,css等资源文件(有坑,内容中道出)的主要内容,如果未能解决你的问题,请参考以下文章

网站性能优化

网站发布到服务器 不能加载js和css

前端优化

网页加载性能调优

基于Vue的SPA如何优化页面加载速度

前端优化常用技巧