精华内容
下载资源
问答
  • 在上一篇《我是怎样网站用HTML5 Manifest》介绍了怎么Manifest一个离线网页应用,结果被广大网友吐槽说这个东西已经被deprecated,移出web标准了,现在被Service Worker替代了,不管怎么样,Manifest的一些...

    在上一篇《我是怎样让网站用上HTML5 Manifest》介绍了怎么用Manifest做一个离线网页应用,结果被广大网友吐槽说这个东西已经被deprecated,移出web标准了,现在被Service Worker替代了,不管怎么样,Manifest的一些思想还是可以借用的。笔者又将网站升级到了Service Worker,如果是用Chrome等浏览器就用Service Worker做离线缓存,如果是Safari浏览器就还是用Manifest,读者可以打开这个网站https://www.rrfed.com感受一下,断网也是能正常打开。

    1. 什么是Service Worker

    Service Worker是谷歌发起的实现PWA(Progressive Web App)的一个关键角色,PWA是为了解决传统Web APP的缺点:

    (1)没有桌面入口

    (2)无法离线使用

    (3)没有Push推送

    那Service Worker的具体表现是怎么样的呢?如下图所示:

    ee8afe4d8d622604e2015d05726f812a.png

    Service Worker是在后台启动的一条服务Worker线程,上图我开了两个标签页,所以显示了两个Client,但是不管开多少个页面都只有一个Worker在负责管理。这个Worker的工作是把一些资源缓存起来,然后拦截页面的请求,先看下缓存库里有没有,如果有的话就从缓存里取,响应200,反之没有的话就走正常的请求。具体来说,Service Worker结合Web App Manifest能完成以下工作(这也是PWA的检测标准):

    11b0701d7576a8c3f58e832201f4de40.png

    包括能够离线使用、断网时返回200、能提示用户把网站添加一个图标到桌面上等。

    2. Service Worker的支持情况

    Service Worker目前只有Chrome/Firfox/Opera支持:

    7de0db77526cbd3f1d473abfebd99f9f.png

    Safari和Edge也在准备支持Service Worker,由于Service Worker是谷歌主导的一项标准,对于生态比较封闭的Safari来说也是迫于形势开始准备支持了,在Safari TP版本,可以看到:

    824d7000db37256732b181b1743f39ce.png

    在实验功能(Experimental Features)里已经有Service Worker的菜单项了,只是即使打开也是不能用,会提示你还没有实现:

    63064ef503d9e6e1716c9a9932ed919a.png

    但不管如何,至少说明Safari已经准备支持Service Worker了。另外还可以看到在今年2017年9月发布的Safari 11.0.1版本已经支持WebRTC了,所以Safari还是一个上进的孩子。

    Edge也准备支持,所以Service Worker的前景十分光明。

    3. 使用Service Worker

    Service Worker的使用套路是先注册一个Worker,然后后台就会启动一条线程,可以在这条线程启动的时候去加载一些资源缓存起来,然后监听fetch事件,在这个事件里拦截页面的请求,先看下缓存里有没有,如果有直接返回,否则正常加载。或者是一开始不缓存,每个资源请求后再拷贝一份缓存起来,然后下一次请求的时候缓存里就有了。

    (1)注册一个Service Worker

    Service Worker对象是在window.navigator里面,如下代码:

    window

    在页面load完之后注册,注册的时候传一个js文件给它,这个js文件就是Service Worker的运行环境,如果不能成功注册的话就会抛异常,如Safari TP虽然有这个对象,但是会抛异常无法使用,就可以在catch里面处理。这里有个问题是为什么需要在load事件启动呢?因为你要额外启动一个线程,启动之后你可能还会让它去加载资源,这些都是需要占用CPU和带宽的,我们应该保证页面能正常加载完,然后再启动我们的后台线程,不能与正常的页面加载产生竞争,这个在低端移动设备意义比较大。

    还有一点需要注意的是Service Worker和Cookie一样是有Path路径的概念的,如果你设定一个cookie假设叫time的path=/page/A,在/page/B这个页面是不能够获取到这个cookie的,如果设置cookie的path为根目录/,则所有页面都能获取到。类似地,如果注册的时候使用的js路径为/page/sw.js,那么这个Service Worker只能管理/page路径下的页面和资源,而不能够处理/api路径下的,所以一般把Service Worker注册到顶级目录,如上面代码的"/sw-3.js",这样这个Service Worker就能接管页面的所有资源了。

    (2)Service Worker安装和激活

    注册完之后,Service Worker就会进行安装,这个时候会触发install事件,在install事件里面可以缓存一些资源,如下sw-3.js:

    const 

    通过上面的操作,创建和添加了一个缓存库叫fed-cache,如下Chrome控制台所示:

    f8561bc84c46b80d9ad7e2ceb0a02a5a.png

    Service Worker的API基本上都是返回Promise对象避免堵塞,所以要用Promise的写法。上面在安装Service Worker的时候就把首页的请求给缓存起来了。在Service Worker的运行环境里面它有一个caches的全局对象,这个是缓存的入口,还有一个常用的clients的全局对象,一个client对应一个标签页。

    在Service Worker里面可以使用fetch等API,它和DOM是隔离的,没有windows/document对象,无法直接操作DOM,无法直接和页面交互,在Service Worker里面无法得知当前页面打开了、当前页面的url是什么,因为一个Service Worker管理当前打开的几个标签页,可以通过clients知道所有页面的url。还有可以通过postMessage的方式和主页面互相传递消息和数据,进而做些控制。

    install完之后,就会触发Service Worker的active事件:

    this

    Service Worker激活之后就能够监听fetch事件了,我们希望每获取一个资源就把它缓存起来,就不用像上一篇提到的Manifest需要先生成一个列表。

    你可能会问,当我刷新页面的时候不是又重新注册安装和激活了一个Service Worker?虽然又调了一次注册,但并不会重新注册,它发现"sw-3.js"这个已经注册了,就不会再注册了,进而不会触发install和active事件,因为当前Service Worker已经是active状态了。当需要更新Service Worker时,如变成"sw-4.js",或者改变sw-3.js的文本内容,就会重新注册,新的Service Worker会先install然后进入waiting状态,等到重启浏览器时,老的Service Worker就会被替换掉,新的Service Worker进入active状态,如果不想等到重新启动浏览器可以像上面一样在install里面调skipWaiting:

    this

    (3)fetch资源后cache起来

    如下代码,监听fetch事件做些处理:

    this

    先调caches.match看一下缓存里面是否有了,如果有直接返回缓存里的response,否则的话正常请求资源并把它放到cache里面。放在缓存里资源的key值是Request对象,在match的时候,需要请求的url和header都一致才是相同的资源,可以设定第二个参数ignoreVary:

    caches

    表示只要请求url相同就认为是同一个资源。

    上面代码的util.fetchPut是这样实现的:

    let 

    需要注意的是跨域的资源不能缓存,response.status会返回0,如果跨域的资源支持CORS,那么可以把request的mod改成cors。如果请求失败了,如404或者是超时之类的,那么也直接返回response让主页面处理,否则的话说明加载成功,把这个response克隆一个放到cache里面,然后再返回response给主页面线程。注意能放缓存里的资源一般只能是GET,通过POST获取的是不能缓存的,所以要做个判断(当然你也可以手动把request对象的method改成get),还有把一些个人不希望缓存的资源也做个判断。

    这样一旦用户打开过一次页面,Service Worker就安装好了,他刷新页面或者打开第二个页面的时候就能够把请求的资源一一做缓存,包括图片、CSS、JS等,只要缓存里有了不管用户在线或者离线都能够正常访问。这样我们自然会有一个问题,这个缓存空间到底有多大?上一篇我们提到Manifest也算是本地存储,PC端的Chrome是5Mb,其实这个说法在新版本的Chrome已经不准确了,在Chrome 61版本可以看到本地存储的空间和使用情况:

    1ce5f3f0819f127ce905926911835c6e.png

    其中Cache Storage是指Service Worker和Manifest占用的空间大小和,上图可以看到总的空间大小是20GB,几乎是unlimited,所以基本上不用担心缓存会不够用。

    (4)cache html

    上面第(3)步把图片、js、css缓存起来了,但是如果把页面html也缓存了,例如把首页缓存了,就会有一个尴尬的问题——Service Worker是在页面注册的,但是现在获取页面的时候是从缓存取的,每次都是一样的,所以就导致无法更新Service Worker,如变成sw-5.js,但是PWA又要求我们能缓存页面html。那怎么办呢?谷歌的开发者文档它只是提到会存在这个问题,但并没有说明怎么解决这个问题。这个的问题的解决就要求我们要有一个机制能知道html更新了,从而把缓存里的html给替换掉。

    Manifest更新缓存的机制是去看Manifest的文本内容有没有发生变化,如果发生变化了,则会去更新缓存,Service Worker也是根据sw.js的文本内容有没有发生变化,我们可以借鉴这个思想,如果请求的是html并从缓存里取出来后,再发个请求获取一个文件看html更新时间是否发生变化,如果发生变化了则说明发生更改了,进而把缓存给删了。所以可以在服务端通过控制这个文件从而去更新客户端的缓存。如下代码:

    this

    通过响应头header的content-type是否为text/html,如果是的话就去发个请求获取一个文件,根据这个文件的内容决定是否需要删除缓存,这个更新的函数util.updateHtmlPage是这么实现的:

    let 

    代码先去获取一个json文件,一个页面会对应一个json文件,这个json的内容是这样的:

    {

    里面主要有一个updateTime的字段,如果本地内存没有这个页面的updateTime的数据或者是和最新updateTime不一样,则重新去获取 html,然后放到缓存里。接着需要通知页面线程数据发生变化了,你刷新下页面吧。这样就不用等用户刷新页面才能生效了。所以当刷新完页面后用postMessage通知页面:

    let 

    并规定type: 1就表示这是一个更新html的消息,然后在页面监听message事件:

    if 

    然后当我们需要更新html的时候就更新json文件,这样用户就能看到最新的页面了。或者是当用户重新启动浏览器的时候会导致Service Worker的运行内存都被清空了,即存储页面更新时间的变量被清空了,这个时候也会重新请求页面。

    需要注意的是,要把这个json文件的http cache时间设置成0,这样浏览器就不会缓存了,如下nginx的配置:

    location 

    因为这个文件是需要实时获取的,不能被缓存,firefox默认会缓存,Chrome不会,加上http缓存时间为0,firefox也不会缓存了。

    还有一种更新是用户更新的,例如用户发表了评论,需要在页面通知service worker把html缓存删了重新获取,这是一个反过来的消息通知:

    if 

    Service Worker也监听message事件:

    const 

    根据不同的消息类型调不同的回调函数,如果是1的话就是删除cache。用户发表完评论后会触发刷新页面,刷新的时候缓存已经被删了就会重新去请求了。

    这样就解决了实时更新的问题。

    4. Http/Manifest/Service Worker三种cache的关系

    要缓存可以使用三种手段,使用Http Cache设置缓存时间,也可以用Manifest的Application Cache,还可以用Service Worker缓存,如果三者都用上了会怎么样呢?

    会以Service Worker为优先,因为Service Worker把请求拦截了,它最先做处理,如果它缓存库里有的话直接返回,没有的话正常请求,就相当于没有Service Worker了,这个时候就到了Manifest层,Manifest缓存里如果有的话就取这个缓存,如果没有的话就相当于没有Manifest了,于是就会从Http缓存里取了,如果Http缓存里也没有就会发请求去获取,服务端根据Http的etag或者Modified Time可能会返回304 Not Modified,否则正常返回200和数据内容。这就是整一个获取的过程。

    所以如果既用了Manifest又用Service Worker的话应该会导致同一个资源存了两次。但是可以让支持Service Worker的浏览器使用Service Worker,而不支持的使用Manifest.

    5. 使用Web App Manifest添加桌面入口

    注意这里说的是另外一个Manifest,这个Manifest是一个json文件,用来放网站icon名称等信息以便在桌面添加一个图标,以及制造一种打开这个网页就像打开App一样的效果。上面一直说的Manifest是被废除的Application Cache的Manifest。

    这个Maifest.json文件可以这么写:

    {
      

    icon需要准备多种规格,最大需要512px * 512px的,这样Chrome会自动去选取合适的图片。如果把display改成standalone,从生成的图标打开就会像打开一个App一样,没有浏览器地址栏那些东西了。start_url指定打开之后的入口链接。

    然后添加一个link标签指向这个manifest文件:

    <

    这样结合Service Worker缓存:

    bdfe5da112f93a2e3c9272b19117ebd1.png

    把start_url指向的页面用Service Worker缓存起来,这样当用户用Chrome浏览器打开这个网页的时候,Chrome就会在底部弹一个提示,询问用户是否把这个网页添加到桌面,如果点“添加”就会生成一个桌面图标,从这个图标点进去就像打开一个App一样。感受如下:

    9868a926fa21d7dcd614e35dead395f4.png

    比较尴尬的是Manifest目前只有Chrome支持,并且只能在安卓系统上使用,IOS的浏览器无法添加一个桌面图标,因为IOS没有开放这种API,但是自家的Safari却又是可以的。

    综上,本文介绍了怎么用Service Worker结合Manifest做一个PWA离线Web APP,主要是用Service Worker控制缓存,由于是写JS,比较灵活,还可以与页面进行通信,另外通过请求页面的更新时间来判断是否需要更新html缓存。Service Worker的兼容性不是特别好,但是前景比较光明,浏览器都在准备支持。现阶段可以结合offline cache的Manifest做离线应用。

    相关阅读:

    1. 为什么要把网站升级到HTTPS
    2. 怎样把网站升级到http/2
    3. 我是怎样让网站用上HTML5 Manifest
    展开全文
  • Manifest是用来离线页面的,即使断网也能正常打开页面,起来简单,但是在实际使用中存在以下问题:(1)如何自动缓存所有的页面的资源?因为manifest不能使用*通配符进行cache(2)如果网站资源更新,怎么让...

    cc7e7c98776ff1f9e266f6f28c2b911f.png

    Manifest是用来做离线页面的,即使断网也能正常打开页面,用起来简单,但是在实际使用中存在以下问题:

    (1)如何自动缓存所有的页面的资源?因为manifest不能使用*通配符进行cache

    (2)如果网站资源更新,怎么让manifest文件自动更新?不然如果用户不清缓存即使联网也会加载老页面

    我觉得很多网站没有使用Manifest是因为上面提到的两个原因,有些人有尝试过,但使用起来比较麻烦,离线应用价值好像不太大。但是使用Manifest还是有很多好处的,特别是像博客等之类的偏向于展示的网站,或者是在线APP,这种网站的数据动态变化频率比较低,不需要频繁地向服务请求数据。这样当用户需要频繁退回首页或者频繁地在几个页面来回切换的时候,由于几乎所有资源都在本地,所以加载起来是瞬时的。

    1. 使用Manifest

    使用Manifest很简单,就是在html标签上加一个manifest属性:

    <

    这个属性指向一个manifest的文件,这个文件指明了当前页面哪些资源需要进行离线缓存,如下home.appcache:

    #9/27/2017, 3:04:25 PM
    

    这个文件第一行必须以CACHE MANIFEST开头,否则浏览器解析会报错,注释使用#开头,在这一行下面跟着需要缓存的资源,接着的NETWORK表示哪些资源需要联网加载,一般需要写成NETWORK *,表示除了CACHE外的其它所有资源都需要联网,包括一些动态请求,如果你不是写的*,而是写了具体路径,那些既没有在CAHCE的,也没有在NETWORK的就会报加载失败的错误,如下所示:

    6087c43cc290db1783c89bf61fec5a4e.png

    即使联网也会这样,所以一般写成*。

    FALLBACK表示替代资源,这些资源加载不到就替代加载哪些资源,如上面的文件https://github.com访问不了就使用一个静态的html访问:https://github.com/html/manifest/html/home.html

    打开支持Manifest的网站,例如https://fed.renren.com,可以观察到Chrome控制台cache的过程:

    24a2adee36800f4a850eaf285399516a.png

    然后再刷新页面,你会发现页面几乎所有资源都是在本地缓存取的,如下图所示:

    baa4376860642a86eed26f0aa964920b.png

    并且你把网断了,刷新页面,页面依旧能够正常加载出来。这个在Chrome/Firefox/Safari等浏览器均支持。

    除了Manifest之外,还有另外一个缓存的手段,就是设置HTTP报文头的Cache-Control字段进行缓存,这个可以缓存JS/CSS/图片资源,但是如果你把HTML也缓存了就会有一个问题,如果用户不清除缓存,即使你的页面更新了,用户仍然会加载老的页面,直到缓存设定Max-Age时间到了。所以用Manifest可以解决这个问题。

    Manifest怎么知道当前页面数据更新了呢?只要把你把manifest文件如上面的home.appcache更改一下就可以了,浏览器打开页面时都会去加载这个文件,一旦发现这个文件发生了变化下次刷新的时候就会重新加载所有Cache的文件,最简单的可以把注释里的时间改成当前的时间就可以了:

    #9/29/2017, 9:08:49 AM

    所以当网站的资源发生更改就可以改变这个manifest的内容,进而联网的浏览器就能进行更新。

    使用Manifest需要注意以下问题:

    (1)Manifest有大小限制,它其实也算本地存储,本地存储一般每个域有限制使用的空间,PC Chrome是5Mb,参考如下表格:

    BrowserApplication Cache (AppCache) Storage LimitSafari Desktop (Mac & Win)UnlimitedSafari Mobile (iOS)10 MBChrome Desktop (Mac & Win)5 MB *Chrome Mobile (Android)Unlimited **Firefox 4 BetaUnlimited (with user prompt)IENo idea. It sucks. ***

    (2)Manifest文件如home.appcahce不能跨域,如果跨域需要支持CORS

    (3)Manifest Cache的资源不能跨域,同样如果跨域该资源需要支持CORS,一般浏览器会自动处理

    2. 解决Manifefst的自动生成和更新问题

    由于Manifest不能使用通配符匹配资源,所以需要把要进行cache的资源一个个列出来,而网站的内容经常是动态更新的,所以这个就比较麻烦。为此笔者写了一个自动生成manifest的NPM包generate-manifest,用起来非常简单:

    =https://github.com

    它就会生成一个home.appchache的Manifest文件,这个文件包括页面上的img/js/css的资源链接:

    #9/27/2017, 3:04:25 PM
    

    还可以支持其它参数定制,详见:generate-manifest。

    这样就解决了自动生成的问题,自动更新应该怎么办呢?

    由于我是一个博客网站,网站内容发生变化的地方主要有:1. 发表/更改博客; 2. 用户发表评论; 3. 网站的浏览量发生变化,第一个解决的方法写了一个接口,只要发表博客就调一下这个接口去生成一个新的manifest文件:

    https://www.rrfed.com/refresh-manifest.php?link=https://www.rrfed.com/2017/09/26/manifest/

    然后就会调上面的generate-manifest的包,生成一个manifest.appcache的文件,在html里面是根据路径的最后一个部分决定manifest的名字:

    <?

    这个和生成的文件名一一对应。

    第二个问题:用户发表评论——在调发表接口那里自动地调一下这个接口,需要注意的是这个接口需要防脚本注入,不然比较危险,

    第三个问题:阅读量数据变化的——写一个Linux定时任务,使用crontab添加一个定时任务,执行crontab -e添加:

    0 

    上面的意思是每天3:00的时候跑一下update-all.sh这个脚本,这个脚本把所有页面的更新命令都写进去:

    =https://fed.renren.com
    generate-manifest --url

    第一点提到的发表文章,也会添加一行命令到这个脚本里面。

    由于阅读量这个数据不是很重要,所以一天更新一次就好了。这样可以让用户在同一天的操作有缓存。如果第二天再来看的话就更新一下。

    因此基本上就解决了自动更新的问题。

    还有一个问题是,Manifest改了之后的第一次刷新还是老的页面,只有第二次刷新的时候才是对的,所以我们希望改了manifest之后能够一刷新就是新的,而不是之前缓存的那个,也不需要刷两次。

    那么怎么办呢?Manifest有一个更新的事件,一旦manifest文件有更新就会触发这个事件,所以我们可以监听这个事件,然后自动刷新页面让页面重新加载就可以了,如下代码:

    function 

    综上,我们很好地利用Manifest做了一个离线页面应用,解决了自动生成和自动更新的问题。即使用户没有离线,第二次加载的资源都是在本地缓存的,所以当用户在几个页面来回切换的时候这个速度是很快的,如很多人可能会在主页的列表和内容页之间来回切换。

    虽然Manifest已经被deprecated了,被Service Worker取代了,但是由于它的简单易用以及兼容性好,我们还是可以用一用。

    相关阅读:

    1. 为什么要把网站升级到HTTPS
    2. 怎样把网站升级到http/2
    展开全文
  •  《ios web应用开发:运用html5、css3与javascript》的重点是使用html5、css3 及javascript 等web 标准来为ios 设计与开发,主题围绕为apple 移动设备设计界面和开发应用的完整流程而展开,并实现了一个名为“the...
  • 怎样的结果是最重要的而不是罗列自己了什么任务。数据去量化你的结果是一个很好的方式,不知道怎么去量化的话可以多了解下你的上级是如何写 PPT、画大饼的。举个例子你们要提高日活,那么肯定会有个...
  • 自动化测试学习路线

    2020-06-16 23:20:24
    2.在网站一些练习(w2schools.com、runoob.com),学习HTML/CSS下的html、XML、webservice三个教程 3.学习最简单的网络爬虫(python 的requests库) 4.学习python的测试框架unit test,知道怎样用unit test和...

    1.学习基本语法;

    2.在网站上做一些练习(w2schools.com、runoob.com),学习HTML/CSS下的html、XML、webservice三个教程

    3.学习最简单的网络爬虫(python 的requests库)

    4.学习python的测试框架unit test,知道怎样用unit test和python的mock模块写单元测试

    5.将3和4结合起来,掌握http自动化接口测试

    6.selenium的库和页面对象模式

    7.把2、4、5、6结合起来,写既支持web测试又支持接口测试的自动化测试脚本

    8.学习robot framework,可以把自动化测试变成关键字驱动和数据驱动

    9.学python高级一点的语法。如装饰器 和线程、进程、协程。可以让测试并行运行并自动记录测试步骤到log文件 

    10.学jenkins,测试不再需要手动启动。测试可以分布运行到多个环境

    11.学docker、git、gitlib等简单使用。测试脚本不用手动更新,测试环境不用人工搭建

    12.学习JavaScript、ajax、jquery、bootstrap

    13.学习mysql或mongdb是怎样和flash一起用

    14.开发测试管理工具

    15.学习压力测试工具jmeter、locust

     

    展开全文
  • asp.net知识库

    2015-06-18 08:45:45
    页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能Querystring传值 Asp...
  • 假设把你的文档看成一个单独的对象,DOM就是如何用HTML或者XML对这个对象进行操作和控制的标准。 面向对象的思想方法已经非常流行了,在编程语言(例如java,js)中,都运用面向对象的编程思想。在XML中,就是要将...
  • ·对Ajax的改进:引入了许多Ajax和JSON处理方面的更新,包括HTML5元素的序列化; ·attribute(改进了.attr()的性能)、jQuery()核心函数、CSS(.css()性能有两倍提升)、特效和事件、DOM操作等也有显著改进 1.5 ...
  • JAVA 正则表达式

    热门讨论 2010-01-15 11:16:37
    Java 正则的功用还有很多,事实上只要是字符处理,就没有正则不到的事情存在。(当然,正则解释时 较耗时间就是了|||……) JAVA中正则表达式的应用 (一) 陈广佳 (cgjmail@163.net) 电子信息工程系...
  • 你只需要30分钟就可以将PHP的核心语言特点全部掌握,你可能已经非常了解HTML,甚至你已经知道怎样用编辑设计软件或者手工来制作好看的WEB站点。由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,...
  • 36.6.5 不是浏览器会怎样 279 36.7 合作伙伴的错误有哪些 280 第37章 手机的处理 281 37.1 该应用程序包含显式指令 281 37.2 按钮 282 37.3 有保障的市场 282 37.4 细枝末节 283 37.4.1 Archos 5 ...
  • 大公司里怎样开发和部署前端代码?</a></p> 当你读完上面的回答,大致就会明白,现在比较成熟的持久化缓存方案就是在静态资源的名字后面加 hash 值,因为每次修改文件生成的 hash 值不一样&...
  • 用HTML标签承载页面内容 用CSS渲染页面 用JavaScript处理交互式行为 jQuery入门和提高 Vue.js入门 Element的使用 Bootstrap的使用 Day31~35 - 玩转Linux操作系统 操作系统发展史和Linux概述 Linux基础命令 Linux...
  • 培训机构分析报告(TI ... "text": "网络录制下的视频还可通过自身网站以及淘宝、qq等平台出售赚钱" }, { "id": "itrjutkk", "text": "2.1-2.3节点内容已概括,btw,<br>拿的出会说...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    4.2 引 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    4.2 引 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 ...
  • Swift个游戏.epub 爱一起画git.epub 白板编程浅谈——Why, What, How.epub 看云新手入门.epub 知道创宇研发技能表v3.0.epub 码农增刊·硅谷之火.epub 禅与 Objective-C 编程艺术.epub 移动H5前端性能优化指南....
  • Swift个游戏.epub 爱一起画git.epub 白板编程浅谈——Why, What, How.epub 看云新手入门.epub 知道创宇研发技能表v3.0.epub 码农增刊·硅谷之火.epub 禅与 Objective-C 编程艺术.epub 移动H5前端性能优化指南....
  • 无论你怎样做组件,都会有人给你抱怨:要是这里支持 xxx 参数就好了。 毕竟使用了组件,就一定不如自己定制的拓展性更强,节省了劳动力,就要付出被约束的代价,Fit 作为一个...
  • ELDK使用与开发手册

    2018-03-07 10:53:39
    如果你的主机是Linux操作系统,我们建议你kermit或者cu作为终端控制程序。确定硬件和软件控制流都已经关闭。 5.7 开始的步骤 在默认配置中,U-Boot运行在一种互动模式,它通过串口“UART1”提供命令行形式的用户...
  • 了解和测量网站真实的性能其实非常困难,像<code>load和<code>DOMContentLoaded不会告诉我们用户什么时候可以在屏幕上看到内容。而<code>FP和<code>FCP又只能捕获整个渲染过程的最开始,<code>FMP更好...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    4 <br>0008 为程序设置版本和帮助信息 4 <br>0009 设置Windows应用程序启动窗体 5 <br>0010 设置Web应用程序起始页 5 <br>0011 如何设置程序的出错窗口 5 <br>0012 如何进行程序调试 6 ...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

怎样用html5做简单网站