1.dayjs源码解析(一):概念、标源标详locale、标源标详constant、标源标详utils tags
2.Nuxt.js踩坑记,标源标详利用Nuxt一键生成多页面静态站点
3.vue.jsåjsçåºå«ï¼
4.arcgis 标源标详api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
5.thingjsä¸threejsçåºå«ï¼
6.深入理解Node.js的Inspector
dayjs源码解析(一):概念、locale、标源标详nrf sniffer 源码constant、标源标详utils tags
深入剖析 Day.js 源码(一):概念、标源标详locale、标源标详constant、标源标详utils
Day.js 是标源标详一款轻量级的时间库,由饿了么的标源标详开发大佬 iamkun 维护,主打无需引入过多依赖,标源标详以减少打包体积的标源标详特性。本文将通过解析 Day.js 的标源标详源码,揭示其结构与功能的奥秘,旨在为开发者提供深入理解与应用 Day.js 的工具。
目录概览
本文将分五章展开 Day.js 的源码解析,分别从代码结构、基础概念、时间标准、语言(文化)代码以及 locale、constant、utils 的asp oracle 源码实现进行深入探讨。我们将逐步揭开 Day.js 的核心逻辑与设计思路。
代码结构与依赖分析
Day.js 的源代码目录结构简洁明了,主要依赖集中在入口文件 src/index.js 中。此文件依赖链简单,未直接引用 locale 和 plugin 目录下的语言包与插件,体现出 Day.js 优化体积、按需加载的核心优势。
基础概念与时间标准
在解析源码之前,理解以下基础概念至关重要,包括时间标准、GMT、UTC、ISO 等。这些标准与概念为后续分析提供了背景知识。
时间标准解释
格林尼治平均时间(GMT)与协调世界时(UTC)是本文中的核心时间概念。GMT 作为本初子午线上的平太阳时,而 UTC 则是基于原子时标准,与格林威治标准时间(GTM)关系密切。本文详细解释了 UTC 的定义、用途与与 0 度经线平太阳时的关系。
ISO 标准
ISO 是国际标准化组织推荐的日期和时间表示方法。在 JavaScript 中,Date.prototype.toISOString() 方法返回遵循 ISO 标准的java websocket 源码字符串,以 UTC 时间为基准。
语言(文化)代码与 locale
不同语言对时间的描述各具特色,Day.js 通过 locale 实现了多语言支持,用户可根据需求引入相应的语言包。本文介绍了语言代码与 locale 的关联,以及如何按需加载特定语言。
constant 与 utils
src/constant.js 和 src/utils.js 分别负责存储常量与工具函数。constant 文件中包含了时间单位与格式化的正则表达式,而 utils.js 则封装了一系列实用工具函数,用于简化时间操作。
总结与展望
本文完成了 Day.js 源码解析的第一部分,深入探讨了概念、locale、constant、utils 的实现。接下来,我们将分析 Day.js 的核心文件 src/index.js,解析 Dayjs 类的实现细节。欢迎关注后续内容,期待与您共同探索 Day.js 的更多奥秘。
Nuxt.js踩坑记,利用Nuxt一键生成多页面静态站点
本文介绍使用Nuxt.js创建多页面静态站点的方法,利用Nuxt.js的mis系统 源码模板、路由配置、模块、插件和页面布局等功能,实现快速开发。
Nuxt.js是一个基于Vue.js的通用应用框架,它预设了服务端渲染应用所需的各种配置,简化了开发过程。
Nuxt.js提供了多种模板,包括starter-template、typescript-template、express-template等,用于快速创建项目。使用vue-cli可以轻松安装Nuxt.js,并生成项目结构。
项目配置方面,Nuxt.js默认配置覆盖了大部分使用情形,可以使用nuxt.config.js进行自定义设置,包括路由、模块、插件和页面布局等。
路由配置基于pages目录结构生成vue-router模块的路由配置,可以修改或添加新路由。Nuxt.js社区提供router-module等模块,bash shell 源码实现更加个性化的自定义路由。
插件可以向Vue注入常用属性或方法,例如埋点插件用于统计PV页面浏览量。埋点插件通过plugins配置项实现,设置watch参数监听路由变化,确保每次页面进入或跳转时自动统计。
页面元信息可以通过head方法设置,避免重复的meta标签,使用hid键为每个meta标签赋予唯一标识。seo.config.js文件可以抽取公用的头部信息,与页面路由关联,实现个性化设置。
Nuxt.js中引入了layout概念,将页面划分为三层:layout、page和component,提供灵活的布局方案。指定布局可以使用页面文件中的layout属性,不指定时默认使用default布局。
状态管理方面,Nuxt.js支持vuex,无需额外配置,只需在项目根目录创建store文件夹。store支持普通方式和模块方式,实现状态树的划分。
一键静态化功能可以生成应用的静态目录和文件,方便部署。静态化时需注意资源版本更新问题,通过git控制上线,实现版本智能更新,避免文件名变动导致的git清理需求。
虽然在静态化编译时遇到一些问题,例如Nuxt.js和vue-server-renderer模块之间的兼容性问题,但可以通过修改源码或使用npm模块间接解决。
本文介绍了Nuxt.js的多个核心功能及其使用方法,旨在帮助开发者快速构建多页面静态站点。如有疑问或需要进一步了解,欢迎交流讨论。
vue.jsåjsçåºå«ï¼
å端éé¢node.jsåvue.jsåºå«æ¯ä»ä¹ï¼
两è çåºå«æ¯ï¼ä¸ä¸ªæ¯æå¡ç«¯è¯è¨ï¼ä¸ä¸ªæ¯å端æ¡æ¶ã
1ãnodejsæ¯ä¸ä¸ªjsè¿è¡äºæå¡ç«¯çç¯å¢ï¼æ¯ä¸ä¸ªæå¡ç«¯è¯è¨ï¼èvueæ¯å端渲æçåºï¼æ¯ä¸ä¸ªå端æ¡æ¶ã
2ãNodeç¨äºæ¹ä¾¿å°æ建ååºé度快ãæäºæ©å±çç½ç»åºç¨ï¼
3ãèvueç¨äºå®ç°ååºçæ°æ®ç»å®åç»åçè§å¾ç»ä»¶ãæ¯ä¸å¥ç¨äºæ建ç¨æ·çé¢çæ¸è¿å¼JavaScriptæ¡æ¶ã
Node.js
æ¯ä¸ä¸ªåºäºChromeV8å¼æçJavaScriptè¿è¡ç¯å¢ã
Node.js使ç¨äºä¸ä¸ªäºä»¶é©±å¨ãéé»å¡å¼I/Oç模åï¼ä½¿å ¶è½»éåé«æã
Node.jsçå 管çå¨npmï¼æ¯å ¨çæ大çå¼æºåºçæç³»ç»ã
Vue.js
æ¯ä¸ä¸ªæ建æ°æ®é©±å¨çwebçé¢çæ¸è¿å¼æ¡æ¶ã
Vue.jsçç®æ æ¯éè¿å°½å¯è½ç®åçAPIå®ç°ååºçæ°æ®ç»å®åç»åçè§å¾ç»ä»¶ãå®ä¸ä» æäºä¸æï¼è¿ä¾¿äºä¸ç¬¬ä¸æ¹åºææ¢æ项ç®æ´åãå¦ä¸æ¹é¢ï¼å½ä¸åæ件ç»ä»¶åVueçæç³»ç»æ¯æçåºç»å使ç¨æ¶ï¼Vueä¹å®å ¨è½å¤ä¸ºå¤æçå页åºç¨ç¨åºæä¾é©±å¨ã
vue.jsåjqueryçåºå«ä¸ã主ä½ä¸å
1ãvue.jsï¼æ¯ä¸å¥ç¨äºæ建ç¨æ·çé¢çæ¸è¿å¼JavaScriptæ¡æ¶ã
2ãjqueryï¼æ¯ä¸ä¸ªå¿«éãç®æ´çJavaScriptæ¡æ¶ï¼æ¯ç»§Prototypeä¹ååä¸ä¸ªä¼ç§çJavaScript代ç åºã
äºãç¹ç¹ä¸å
1ãvue.jsï¼Vue被设计为å¯ä»¥èªåºåä¸éå±åºç¨ãVueçæ ¸å¿åºåªå ³æ³¨è§å¾å±ï¼æ¹ä¾¿ä¸ç¬¬ä¸æ¹åºææ¢æ项ç®æ´åã
2ãjqueryï¼å ·æç¬ç¹çé¾å¼è¯æ³åçå°æ¸ æ°çå¤åè½æ¥å£ï¼å ·æé«æçµæ´»çcsséæ©å¨ï¼å¹¶ä¸å¯å¯¹CSSéæ©å¨è¿è¡æ©å±ï¼æ¥æ便æ·çæ件æ©å±æºå¶å丰å¯çæ件ã
ä¸ãä¼å¿ä¸å
1ãvue.jsï¼ç®æ æ¯éè¿å°½å¯è½ç®åçAPIå®ç°ååºçæ°æ®ç»å®åç»åçè§å¾ç»ä»¶ã
2ãjqueryï¼æä¾äºå¯¹åºæ¬JavaScriptç»æçå¢å¼ºï¼æ¯å¦å ç´ è¿ä»£åæ°ç»å¤ççæä½ã
åèèµææ¥æºï¼ç¾åº¦ç¾ç§-jQuery
åèèµææ¥æºï¼ç¾åº¦ç¾ç§-Vue.js
认è¯Vue.js+Vue.jsçä¼ç¼ºç¹+åä¸å ¶ä»å端æ¡æ¶çåºå«Vue.jsä¸å ¶ä»æ¡æ¶çåºå«ï¼
1.ä¸AngularJSçåºå«
ç¸åç¹ï¼
é½æ¯ææ令ï¼å ç½®æ令åèªå®ä¹æ令ã
é½æ¯æè¿æ»¤å¨ï¼å ç½®è¿æ»¤å¨åèªå®ä¹è¿æ»¤å¨ã
é½æ¯æååæ°æ®ç»å®ã
é½ä¸æ¯æä½ç«¯æµè§å¨ã
ä¸åç¹ï¼
1.AngularJSçå¦ä¹ ææ¬é«ï¼æ¯å¦å¢å äºDependencyInjectionç¹æ§ï¼èVue.jsæ¬èº«æä¾çAPIé½æ¯è¾ç®åãç´è§ã
2.å¨æ§è½ä¸ï¼AngularJSä¾èµå¯¹æ°æ®åèæ£æ¥ï¼æ以Watcherè¶å¤è¶æ ¢ã
Vue.js使ç¨åºäºä¾èµè¿½è¸ªçè§å¯å¹¶ä¸ä½¿ç¨å¼æ¥éåæ´æ°ãææçæ°æ®é½æ¯ç¬ç«è§¦åçã
对äºåºå¤§çåºç¨æ¥è¯´ï¼è¿ä¸ªä¼åå·®å¼è¿æ¯æ¯è¾ææ¾çã
2.ä¸Reactçåºå«
ç¸åç¹ï¼
Reactéç¨ç¹æ®çJSXè¯æ³ï¼Vue.jså¨ç»ä»¶å¼åä¸ä¹æ¨å´ç¼å.vueç¹æ®æä»¶æ ¼å¼ï¼å¯¹æ件å 容é½æä¸äºçº¦å®ï¼ä¸¤è é½éè¦ç¼è¯å使ç¨ã
ä¸å¿ææ³ç¸åï¼ä¸åé½æ¯ç»ä»¶ï¼ç»ä»¶å®ä¾ä¹é´å¯ä»¥åµå¥ã
é½æä¾åççé©åå½æ°ï¼å¯ä»¥è®©å¼åè å®å¶åå°å»å¤çéæ±ã
é½ä¸å ç½®åæ°AJAXï¼Routeçåè½å°æ ¸å¿å ï¼èæ¯ä»¥æ件çæ¹å¼å è½½ã
å¨ç»ä»¶å¼åä¸é½æ¯æmixinsçç¹æ§ã
ä¸åç¹ï¼
Reactä¾èµVirtualDOM,èVue.js使ç¨çæ¯DOM模æ¿ãReactéç¨çVirtualDOMä¼å¯¹æ¸²æåºæ¥çç»æåèæ£æ¥ã
Vue.jså¨æ¨¡æ¿ä¸æä¾äºæ令ï¼è¿æ»¤å¨çï¼å¯ä»¥é常æ¹ä¾¿ï¼å¿«æ·å°æä½DOMã
nodejsåvuejsçåºå«nodejsåvuejsçåºå«
å®å ¨ä¸¤ç äºï¼ä¸ä¸ªæ¯å端æ¡æ¶ï¼ä¸ä¸ªæ¯æå¡ç«¯è¯è¨ã
Node.jsæ¯ä¸ä¸ªåºäºChromeV8å¼æçJavaScriptæ§è¡ç¯å¢ã
Node.js使ç¨äºä¸ä¸ªäºä»¶é©±å¨ãéé»å¡å¼I/Oç模åï¼ä½¿å ¶è½»éåé«æã
Node.jsçå 管çå¨npmï¼æ¯å ¨çæ大çå¼æºåºçæç³»ç»ã
Vue.jsæ¯ä¸ä¸ªæ建èµæ驱å¨çwebä»é¢çæ¸è¿å¼æ¡æ¶ãVue.jsçç®æ æ¯éè¿å°½å¯è½ç®åçAPIå®ç°ååºçèµæç³»ç»åç»åçæ£è§å 件ãå®ä¸ä» æäºä¸æï¼è¿ä¾¿äºä¸ç¬¬ä¸æ¹åºææ¢æä¸æ¡æ´åã
å¦ä¸æ¹é¢ï¼å½ä¸åæ¡£æ¡å 件åVueçæç³»ç»æ¯æ´çåºç»å使ç¨æ¶ï¼Vueä¹å®å ¨è½å¤ä¸ºå¤æçå页åºç¨ç¨å¼æä¾é©±å¨ã
vuejs2.0å1.0çåºå«
å»é¤äºä¸äºç³ç²ï¼ä¾å¦:vm.$dispatch,vm.$broadcase
ç®åäºä¸äºç¨æ³,ä¾å¦ï¼v-el:å为ref=
æ´å¤ååå¯ä»¥å°githubçvuejsç¨å¼ç ä»åºæ£è§ç¬¬ä¸æèµæ~
vuejsvue-cliåwebpackçåºå«
ç§è®¤ä¸ºYeomançGeneratorsæ¯å¤©ççæä¾èææ¶çå·¥å ·ï¼å¦æç¨webstormæ°å»ºYeomanä¸æ¡ï¼å°±å¯ä»¥æ¾å°ä¸äºæå ³reactçèææ¶
nodejsåjavascriptsdkåleancloudçåºå«
node.jsåjavascriptåºå«è¿æ¯æºå¤§çï¼1个平å°ï¼1个æ¯ç¨å¼è¯è¨ï¼
javascriptæ¯å®¢æ·ç«¯ç¨å¼è¯è¨ï¼éè¦æµè§å¨çjavascriptç´è¯å¨è¿è¡è§£éæ§è¡ï¼
node.jsæ¯ä¸ä¸ªåºäºChromeJavaScriptæ§è¡æ¶å»ºç«çå¹³å°ï¼å®æ¯å¯¹GoogleV8å¼æè¿è¡äºå°è£ çæ§è¡ç¯å¢ï¼
ç®åç说node.jså°±æ¯ææµè§å¨çç´è¯å¨å°è£ èµ·æ¥ä½ä¸ºä¼ºæå¨æ§è¡å¹³å°ï¼ç¨ç±»ä¼¼javascriptçç»æè¯æ³è¿è¡ç¨å¼è®¾è®¡ï¼å¨node.jsä¸æ§è¡ã
apacheånodejsçåºå«
apacheæ¯å¤æ§è¡ç»ªæºå¶ï¼ä»ä¸ºæ¯ä¸ä¸ªè®¿é®ä½¿ç¨è 建ç«åç¬çæ§è¡ç»ªï¼å½¼æ¤äºä¸å½±åï¼ä½æ¯æ§è¡ç»ªå ç¨è®°å¿ä½ï¼è®¿é®é大记å¿ä½ä¼åä¸æ¶ï¼
nodejsåApacheçä¸ä¸ªå¾å¤§ä¸åå¨äºâåæ§è¡ç»ªæºå¶âï¼ä¸åç使ç¨è 使ç¨åä¸ä¸ªæ§è¡ç»ªï¼éç¨éé»å¡I/Oåäºä»¶é©±å¨æææé«äºä¼ºæå¨ç并åæ°ä¸éï¼åæ¶çº¿ä¸äººæ°ï¼ã
nodejsstreamåbufferçåºå«
max_allowed_packet=M
[mysql]
disable-auto-rehash#å 许éè¿TABé®æ示
default-character-set=utf8
connect-timeout=3
getåpostçåºå«ï¼nodejsï¼use
getæ¯ä»ä¼ºæå¨ä¸è·åèµæï¼postæ¯å伺æå¨ä¼ éèµæã2getæ¯æå¼æ°èµæ伫åå å°æ交表åçACTIONå±æ§ææçURLä¸ï¼å¼å表åå å个æ ä½ä¸ä¸å¯¹åºï¼å¨URLä¸å¯ä»¥çå°ãpostæ¯éè¿HTTPpostæºå¶ï¼å°è¡¨åå å个æ ä½ä¸å ¶å 容æ¾ç½®å¨HTMLHEADERå ä¸èµ·ä¼ éå°ACTIONå±æ§ææçURLå°åã使ç¨è çä¸å°è¿ä¸ªè¿ç¨ã
3对äºgetæ¹å¼ï¼ä¼ºæå¨ç«¯ç¨Request.QueryStringè·ååæ°çå¼ï¼å¯¹äºpostæ¹å¼ï¼ä¼ºæå¨ç«¯ç¨Request.Formè·åæ交çèµæã?4getä¼ éçèµæéè¾å°ï¼ä¸è½å¤§äº2KBãpostä¼ éçèµæéè¾å¤§ï¼ä¸è¬è¢«é¢è®¾ä¸ºä¸åéå¶ãä½ç论ä¸ï¼IIS4ä¸æ大é为KBï¼IIS5ä¸ä¸ºKBã?
5getå®å ¨æ§é常ä½ï¼postå®å ¨æ§è¾é«ã
6HTTPå®ä¹äºä¸ä¼ºæå¨äºå¨çä¸åæ¹æ³ï¼æåºæ¬çæ¹æ³æ¯GETåPOSTãäºå®ä¸GETéç¨äºå¤æ°è¯·æ±ï¼èä¿çPOSTä» ç¨äºæ´æ°ç«ç¹ãæ ¹æ®HTTPè§èï¼GETç¨äºèµè®¯è·åï¼èä¸åºè¯¥æ¯å®å ¨çåå¹ççãæè°å®å ¨çæå³ç该æä½ç¨äºè·åèµè®¯èéä¿®æ¹èµè®¯ãæ¢å¥è¯è¯´ï¼GET请æ±ä¸è¬ä¸åºäº§çå¯ä½ç¨ãå¹ççæå³ç对åä¸URLçå¤ä¸ªè¯·æ±åºè¯¥è¿ååæ ·çç»æãå®æ´çå®ä¹å¹¶ä¸åçèµ·æ¥é£æ ·ä¸¥æ ¼ãä»æ ¹æ¬ä¸è®²ï¼å ¶ç®æ æ¯å½ç¨æ·å¼å¯ä¸ä¸ªè¿ç»æ¶ï¼å¥¹å¯ä»¥ç¡®ä¿¡ä»èªèº«çè§åº¦æ¥ç没ææ¹åèµæºãæ¯å¦ï¼æ°é»ç«ç¹ç头çä¸ææ´æ°ãè½ç¶ç¬¬äºæ¬¡è¯·æ±ä¼è¿åä¸åçä¸æ¹æ°é»ï¼è¯¥æä½ä»ç¶è¢«è®¤ä¸ºæ¯å®å ¨çåå¹ççï¼å 为å®æ»æ¯è¿åå½åçæ°é»ãåä¹äº¦ç¶ãPOST请æ±å°±ä¸é£ä¹è½»æ¾äºãPOST表示å¯è½æ¹å伺æå¨ä¸çèµæºç请æ±ãä»ç¶ä»¥æ°é»ç«ç¹ä¸ºä¾ï¼è¯»è 对æç« ç注解åºè¯¥éè¿POST请æ±å®ç°ï¼å 为å¨æ³¨è§£æ交ä¹åç«ç¹å·²ç»ä¸åäº7å¨FORMæ交çæ¶åï¼å¦æä¸æå®Methodï¼åé¢è®¾ä¸ºGET请æ±ï¼Formä¸æ交çèµæå°ä¼éå å¨urlä¹åï¼ä»¥?åå¼ä¸urlåå¼ãåæ¯æ°ååå åæ ·ä¼ éï¼ä½ç©ºæ ¼è½¬æ¢ä¸ºâ+âå·ï¼å ¶å®ç¬¦å·è½¬æ¢ä¸º%XX,å ¶ä¸XX为该符å·ä»¥è¿å¶è¡¨ç¤ºçASCIIï¼æISOLatin-1ï¼å¼ãGET请æ±è¯·æ交çèµææ¾ç½®å¨HTTP请æ±å议头ä¸ï¼èPOSTæ交çèµæåæ¾å¨å®ä½èµæä¸ï¼GETæ¹å¼æ交çèµææå¤åªè½æä½å ç»ï¼èPOSTå没ææ¤éå¶nodejs4.0å5.0çåºå«
Node.jsv5isanintermediatefeaturereleaselinethatisbestsuitedforuserswhohaveaneasiertimeupgradingtheirNode.jsinstallations,suchasdevelopersusingthetechnologyforfront-endtoolchains.Thisversionwillbesupportedforamaximumofonlyeightmonthsandwillbecontinuallyupdatedwithnewfeaturesandbetterperformance;itisnotsupportedunderourLTSplan.
Thereleasecadenceforv5.xwillbemorerapidthaninthepast.Expectanewreleaseonceeveryonetooweeksforv5.x.Ifupgradingisachallengeforyou,wesuggestyoudonotusethisrelease.Therewillbesignificantongoingdevelopment.Thefocusisongettingthereleasestousersassoonaspossible.
npmhasbeenupgradedtov3inNode.jsv5.0.0,which(amongstotherchanges)willinstalldependenciesasflataspossibleinnode_modules.v5.0.0alsoeswithV.6,whichshipsthenew.targetandspreadoperatorJavaScriptlanguagefeatures.Ifyouwanttolearnmoreaboutothertechnicaldetailsaroundthis,pleasecheckoutourreleasepost.
Itâsanother-qualityreleasefromus,andweareaveragingroughlyuniquecontributorspermonthtothecodebase.Weareextremelyexcitedwithalltheenthusia***andamazingworkthatisgoingintothisNode.jsv5andfuturereleases.
nodejsä¸module.exportsåexportsçåºå«
mouble(app)
mouble.exports
ä½ å¯ä»¥ç¨å®å»ºç«ä½ ç模ç»ãä¾å¦ï¼ï¼å设è¿æ¯rocker.jsæ¡£æ¡ï¼
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
exports.name=function(){
console.log('MynameisLemmyKilmister');
};
å¨å¦ä¸ä¸ªæ¡£æ¡ä¸ä½ è¿æ ·å¼ç¨
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
varrocker=require('./rocker.js');
rocker.name();'MynameisLemmyKilmister'
é£å°åºModule.exportsæ¯ä»ä¹å¢ï¼å®æ¯å¦åæ³å¢ï¼
å ¶å®ï¼Module.exportsææ¯çæ£çä»é¢ï¼exportsåªä¸è¿æ¯å®çä¸ä¸ªè¾ å©å·¥å ·ãæç»è¿åç»å¼å«çæ¯Module.exportsèä¸æ¯exportsã
ææçexportsæ¶éå°çå±æ§åæ¹æ³ï¼é½èµå¼ç»äºModule.exportsãå½ç¶ï¼è¿æ个åæï¼å°±æ¯Module.exportsæ¬èº«ä¸å ·å¤ä»»ä½å±æ§åæ¹æ³ãå¦æï¼Module.exportså·²ç»å ·å¤ä¸äºå±æ§åæ¹æ³ï¼é£ä¹exportsæ¶éæ¥çèµè®¯å°è¢«å¿½ç¥ã
ä¿®æ¹rocker.jså¦ä¸ï¼
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
module.exports='ROCKIT!';
exports.name=function(){
console.log('MynameisLemmyKilmister');
};
å次å¼ç¨æ§è¡rocker.js
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
varrocker=require('./rocker.js');
rocker.name();TypeError:ObjectROCKIT!hasnomethod'name'
åç°æ¥éï¼ç©ä»¶âROCKIT!â没ænameæ¹æ³
rocker模ç»å¿½ç¥äºexportsæ¶éçnameæ¹æ³ï¼è¿åäºä¸ä¸ªå串âROCK
IT!âãç±æ¤å¯ç¥ï¼ä½ ç模ç»å¹¶ä¸ä¸å®éå¾è¿åâä¾é¡¹åç©ä»¶âãä½ ç模ç»å¯ä»¥æ¯ä»»ä½åæ³çjavascriptç©ä»¶--boolean,number,date,
JSON,string,function,
arrayççã
ä½ ç模ç»å¯ä»¥æ¯ä»»ä½ä½ 设å®ç»å®çä¸è¥¿ãå¦æä½ æ²¡ææ¾å¼çç»Module.exports设å®ä»»ä½å±æ§åæ¹æ³ï¼é£ä¹ä½ ç模ç»å°±æ¯exports设å®ç»Module.exportsçå±æ§ã
ä¸é¢ä¾åä¸ï¼ä½ ç模ç»æ¯ä¸ä¸ªç±»ï¼
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
module.exports=function(name,age){
this.name=name;
this.age=age;
this.about=function(){
console.log(this.name+'is'+this.age+'yearsold');
};
};
å¯ä»¥è¿æ ·åºç¨å®ï¼
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
varRocker=require('./rocker.js');
varr=newRocker('Ozzy',);
r.about();Ozzyisyearsold
ä¸é¢ä¾åä¸ï¼ä½ ç模ç»æ¯ä¸ä¸ªæ°ç»ï¼
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
module.exports=['LemmyKilmister','Ozzy
O***ourne','RonnieJamesDio','StevenTyler','MickJagger'];
å¯ä»¥è¿æ ·åºç¨å®ï¼
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
varrocker=require('./rocker.js');
console.log('Rockininheaven:'+rocker[2]);Rockininheaven:Ronnie
JamesDio
ç°å¨ä½ æç½äºï¼å¦æä½ æ³ä½ ç模ç»æ¯ä¸ä¸ªç¹å®çåå«å°±ç¨Module.exportsãå¦æä½ æ³ç模ç»æ¯ä¸ä¸ªå ¸åçâä¾é¡¹åç©ä»¶âå°±ç¨exportsã
ç»Module.exportsæ°å¢å±æ§ç±»ä¼¼äºç»exportsæ°å¢å±æ§ãä¾å¦ï¼
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
module.exports.name=function(){
console.log('MynameisLemmyKilmister');
};
åæ ·ï¼exportsæ¯è¿æ ·ç
å¤å¶ç¨å¼ç
ç¨å¼ç å¦ä¸:
exports.name=function(){
console.log('MynameisLemmyKilmister');
};
vue.jsåangularjsçåºå«æ¯ä»ä¹ï¼ReactåVueæ许å¤ç¸ä¼¼ä¹å¤ï¼å®ä»¬é½æï¼
1.使ç¨VirtualDOM
2.æä¾äºååºå¼ï¼Reactiveï¼åç»ä»¶åï¼Composableï¼çè§å¾ç»ä»¶ã
3.å°æ³¨æåéä¸ä¿æå¨æ ¸å¿åºï¼ä¼´éäºæ¤ï¼æé å¥çè·¯ç±åè´è´£å¤çå ¨å±ç¶æ管ççåºã
ReactåVueçåºå«ï¼
1.å¤ææ§
å¨APIä¸è®¾è®¡ä¸¤æ¹é¢ä¸Vue.jsé½æ¯Angular1ç®åå¾å¤ï¼å æ¤ä½ å¯ä»¥å¿«éå°ææ¡å®çå ¨é¨ç¹æ§å¹¶æå ¥å¼åã
2.çµæ´»æ§å模åå
Vue.jsæ¯ä¸ä¸ªæ´å çµæ´»å¼æ¾ç解å³æ¹æ¡ãå®å è®¸ä½ ä»¥å¸æçæ¹å¼ç»ç»åºç¨ç¨åºï¼èä¸æ¯å¨ä»»ä½æ¶åé½å¿ é¡»éµå¾ªAngular1å¶å®çè§åï¼è¿è®©Vueè½éç¨äºåç§é¡¹ç®ãæ们ç¥éæå³å®æ交ç»ä½ æ¯éå¸¸å¿ è¦çã
è¿ä¹å°±æ¯ä¸ºä»ä¹æ们æä¾Webpacktemplateï¼è®©ä½ å¯ä»¥ç¨å åéï¼å»éæ©æ¯å¦å¯ç¨é«çº§ç¹æ§ï¼æ¯å¦ç模åå è½½ãlintingãCSSæåççã
3.æ°æ®ç»å®
Angular1使ç¨ååç»å®ï¼Vueå¨ä¸åç»ä»¶é´å¼ºå¶ä½¿ç¨ååæ°æ®æµãè¿ä½¿åºç¨ä¸çæ°æ®æµæ´å æ¸ æ°ææã
4.æ令ä¸ç»ä»¶
å¨Vueä¸æ令åç»ä»¶åå¾æ´æ¸ æ°ãæ令åªå°è£ DOMæä½ï¼èç»ä»¶ä»£è¡¨ä¸ä¸ªèªç»èªè¶³çç¬ç«åå ââæèªå·±çè§å¾åæ°æ®é»è¾ãå¨Angularä¸ä¸¤è æä¸å°ç¸æ··çå°æ¹ã
5.æ§è½
Vueææ´å¥½çæ§è½ï¼å¹¶ä¸é常é常容æä¼åï¼å 为å®ä¸ä½¿ç¨èæ£æ¥ã
Vue.jsæ¯ä¸ä¸ªç¨æ¥å¼åWebçé¢çå端åºããVue.jsæå¨æåãè´åäºæ®åå½å Vue.jsææ¯ä½ç³»ï¼è®©æ´å¤å欢å端ç人åäºè§£åå¦ä¹ Vue.jsãå¦æä½ å¯¹Vue.jsåºç¡ç¥è¯æå ´è¶£ï¼å¦æä½ å¯¹æºç 解ææå ´è¶£ï¼å¦æä½ å¯¹Vue.js2.0æå ´è¶£ï¼å¦æä½ å¯¹ä¸»æµæå å·¥å ·æå ´è¶£ï¼å¦æä½ å¯¹å¦ä½å®è·µæå ´è¶£ï¼ãVue.jsæå¨æåãé½æ¯ä¸æ¬ä¸å®¹éè¿ç以示ä¾ä»£ç 为å¼å¯¼ãç¥è¯æ¶µçå ¨é¢çæä½³éæ©ã
ãVue.jsæå¨æåãä¸å ±ç« ï¼ç±æµ å ¥æ·±å°è®²è§£äºVue.jsåºæ¬è¯æ³åæºç 解æã主è¦å 容å æ¬æ°æ®ç»å®ãæ令ã表åæ§ä»¶ç»å®ãè¿æ»¤å¨ãç»ä»¶ã表åéªè¯ãæå¡éä¿¡ãè·¯ç±åè§å¾ãvue-cliãæµè¯å¼ååè°è¯ãæºç 解æå主æµæå æå»ºå·¥å ·çã该书å å®¹å ¨é¢ï¼è®²è§£ç»è´ï¼ç¤ºä¾ä¸°å¯ï¼éç¨äºåå±æ¬¡çå¼åè ã
arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js: esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类的介绍,还有就是在线例子: esri 官网在线例子,这个也是学习 arcgis api 3.x 的好素材。
内容概览
基于arcgis api 的 Draw 工具基本绘制 拓展 Draw 工具的绘制 源代码 demo 下载
本篇实现地图态势标绘功能模块
截图如下
本篇核心的在于调用 arcgis api 的 Draw 工具: Draw
构造函数:
一般来说,传参 map 对象进来就行,其他参数可选的,用默认的就行,除非你想专门设置。 默认的可绘制图形类型常量 Constants:
可以设置绘制的符号样式:
其中,activate 函数可以激活触发绘制的行为,绘制结束之后在绘制结束事件里面获取 geometry:
地图态势标绘实现的思路:利用 arcgis api 的 Draw工具实现普通的点线面绘制,但是对于燕尾箭头、集结地、弧线、曲线、简单箭头等特殊的军事态势需要自定义来绘制了,所以需要拓展 Draw 工具才能实现,也是本篇的精华所在。
1是继承拓展 Draw 的文件目录;2是实现态势标绘模块的 js 文件。 首先,需要在 map.html 页面引用进来:
其中,paths 代表需要引用的路径。
其次,在 map.js 文件的初始化里面引用拓展的 js 文件 DrawEx 以及 DrawExt:
最后,在工具栏菜单的态势标绘菜单响应事件里面调用 plot.js 即可:
其次,触发调用 Draw 绘制:
最后,添加绘制图形在地图上展示:
demo源码下载 下载提取码:g5cy
thingjsä¸threejsçåºå«ï¼
html5canvasåwebglåthree.jsæä»ä¹åºå«
åºäºwebglç3Dæ¡æ¶ä¹ç®å§ï¼ä¼æå¨ç¥å°ºé èï¼WebGLä½ä¸ºOpenGLçåéï¼å¨HTML5ä¸æå¾å¤§çæ¿æ¦æ¯æå度ï¼ä¸è¿webglæ¯å¾åºå±çä¸ç§ææ¯ï¼ä¸å®¹æå½¢æ3Då¼åæ¦å¿µï¼æ以æå¾å¤åºäºwebglç3Dæ¡æ¶äº§çï¼å¸¸è§çæthree.jsãthingjsãd3.jsççã
thingjsæ¯è¿ä¸¤å¹´çæ°å ´æ¡æ¶ï¼æ¯three.jsæ´ä¸ºé¡¶å±ï¼ç¸å½äºä¸éè¦ä»»ä½3Dä¸ä¸ç¥è¯å¨å¤ï¼åªæå¾js,html5,canvaså¼åé»è¾å°±å¯éµå以è°è¯3Dææï¼å éå¼åæçï¼æ以åå°ä¸å°ä¼ä¸å¼åè ç欢è¿ã
thingjså¨çº¿å¹³å°æä¾3Då¯è§åå¼åå¥ä»¶ï¼3D模ååºæåä¸å¤ä¸ªæ¨¡åååºæ¯ï¼é¡¹ç®å¯¼å ¥å¹³å°æé»è®¤ç¯å ï¼å©ç¨3Dæºç å¼åç¯å ææãåæ¢2D/3dçï¼å 费注åthingjsè´¦æ·å¯çå°ä»¥ä¸3Dç¼è¾å¨ææã
javascriptç¨ä»ä¹å¼åå·¥å ·JavaScriptèªæ¨åºå就大åå¼åè çéçï¼åºäºJavaScriptçå¼åå·¥å ·ï¼è¿éå å«å¤§éçJSå¼åèµæºï¼å æ¬å端ãæ¡æ¶ãéç¨ç±»çï¼ä¸è®¡å ¶æ°ï¼å¼åè 们å¯ä»¥çµæ´»éæ©ï¼è½»æ¾æ建åºç¨ãæ¬æå享å款JavaScriptå¼å工仿æå ·
1.Kreate
è¿æ¬¾å·¥å ·æå©äºå¯¹jQuery对象快éçæDOMãä½ å¯ä»¥å建å个æå¤ä¸ªå ç´ ã
2.NightWatchjs
Nightwatchjsæ¥æä¸ä¸ªç®æ´è强大çè¯æ³ï¼è½å¤å è®¸ä½ å¿«éç¼åæµè¯ãå®æ¯ä¸ç¨äºæµè§å¨åºç¨åç½ç«çä¸æ¬¾ç«¯å°ç«¯çæµè¯è§£å³æ¹æ¡ã
3.Gulpjs
Gulpæ¯æ¯è¾ç«çå¼æºé¡¹ç®ï¼é ç½®æ´ç®æ´ãæ´ç´è§ï¼åå°å¾å¤å¼åè çéçã
4.EasyStarjs
Easystarjsæ¯å©ç¨JavaScriptAPIç¼åçï¼å¸¸ç¨è¯æ建HTML5游æãå¼åè å¯ä»¥å°å ¶ä¸ç°æçJSæ¡æ¶æé 使ç¨ã
5.Headroom.js
Headroom.jsæ¯ä¸æ¬¾è½»é级ãé«æ§è½çJSç»ä»¶ï¼æ ä¾èµæ§ï¼ã
6.Harpjs
Harpæ¯ä¸æ¬¾å¿«éçãè½»é级çWebæå¡å¨ãHarpservesJadeï¼Markdownï¼EJSï¼CoffeeScript,Sass,LESS以åStylusasHTMLãCSSJavaScripåå¯è½»æ¾é ç½®ã
7.GanttTwproject
Twoprojectæ¯ä¸æ¬¾å¨çº¿å è´¹çJSå¼åå·¥åµçå ·ï¼åºäºjqueryå建èæ¥ï¼æ¥æ强大迷人çå大åç¹æ§ï¼å æ¬CSSç®è¤æ ·å¼ãèµæºç¼è¾çã
8.Mocha
Mochaæ¯ä¸æ¬¾åè½ä¸°å¯çJavaScriptæµè¯æ¡æ¶ï¼å¯åºäºnode.jsåæµè§å¨è¿è¡ï¼å®ä½¿å¼æ¥æµè¯åå¾æ´ä¸ºç®åæ趣ï¼æ¯æçµæ´»ä¸åç¡®çè¾åºï¼ææå¼å¸¸ç°è±¡ã
9.ResponsiveNav
ResponsiveNavæ¯ä¸æ¬¾è½»é级çæ件ï¼å¸®å©ä½ 为å°å±å¹å建è¿æ¥å¯¼èªãæ¯æ为移å¨è®¾å¤å建触æ¸äº¤äºè®¾è®¡ä»¥åCSS转æ¢çç¹æ§ã
.FileAPI
æ³è¦å¼åç©èç½3Dåºç¨ï¼ç¨thingjsæ¹ä¾¿è¿æ¯threejsæ¹ä¾¿ï¼
æ¨è使ç¨thingjsæ¥å¼åï¼æ们å¯ä»¥å¯¹æ¯çä¸ä¸threejsåthingjsï¼é¦å äºè§£ä¸ä¸webGLã
WebGLå¯ä»¥å¤ç3Då¾åï¼å¬èµ·æ¥æ¯é常é«å ´çä¸ä»¶äºï¼ä½æ¯WebGLå®å¨æ¯å¤ªåºå±äºï¼WebGl解å³æ¯å¦ä½åç»å¸ä¸ç»å¾çé®é¢ï¼æä¹ç»ç¹ï¼çº¿ï¼é¢ï¼ææ¸ å«æ£ä¹ä¸è²ï¼æä¹è´´å¾ï¼æä¹å¤çå 线ï¼è§è§è½¬å¨ä¹åæä¹æ¢ç®ç»å¶ççãè¿äºå¯¹äºä¸ä¸ªå3Dåºç¨çå¼åè æ¥è¯´è¦å¦çä¸è¥¿å¤ªå¤äºãThreejsåºçåºç°è§£å³äºåºå±ç渲æç»èåå¤æçæ°æ®ç»æï¼ç»äºå°å¤æçåºå±ç»èæ½è±¡åºæ¥ï¼ä½¿å¾å¤§å®¶å¼å3dåºç¨æ´å®¹æäºä¸äºãåå¾å¤å¼åè 交æµthreejsé½æ¯ä»ä»¬é¦æ¬¡æ¥è§¦çWebGL3Dåºï¼å¹¶è½å¾å®¹æçå°±è½å¼å§åä¸èç»äºå®éªãä½æ¯ä½¿ç¨Threejså¼ååºç¨è¿æ¯é¨æ§å¾é«ï¼ä½å°±ä¸ä¸ªå 载模åï¼è°å ï¼éæ©æ¨¡åå¼¹æ¡çåè½ï¼å°±è½å¹²åºThreejsä¸ç¾è¡ä»£ç ãåæ¶è¿æå¾å¤å¤æç3Dæ¦å¿µéè¦ç解ãè¿æ¶å°±éè¦ThingJSäºã
ThingJSæ¯æ´ä¸ºä¸å±çæ½è±¡ï¼ä¸ç¨å ³å¿ï¼æ¸²æï¼meshï¼å 线çå¤ææ¦å¿µãå®æ½è±¡æ¯ä¸ä¸ªä¸ªå ·ä½ç模åï¼ThingJSå°è£ äºå¯¹æ¨¡å交äºäºä»¶çåç§apiï¼æ¯å¦åå»ï¼å·¦é®ï¼é¼ æ æ»è¿çï¼ThingJSå°è£ äºå¯¹æ¨¡åçæä½ï¼ä¾å¦ç§»å¨ï¼æ¾å¤§ç¼©å°ï¼ä¸è²ï¼å¾è¾¹ï¼çè³å¼é¨ï¼ThingJSè¿å°è£ äºæ¨¡åçå±æ¬¡å ³ç³»ï¼ä¾å¦ç©çåä½æ¯æ¾å¨æ个æ¿é´éçï¼æ¿é´åå¨æ个楼å±ï¼æ¥¼å±åæ¯æ个大楼çã大楼å¨ååºéã
æ´å¤äºè§£å¯ä»¥çä¸ä¸ç½é¡µé¾æ¥
深入理解Node.js的Inspector
深入理解Node.js的Inspector
Inspector是Node.js提供的一款强大调试工具,它不仅能用于调试Node.js代码,还能实时收集Node.js进程的内存、CPU等数据。本文将从使用和原理两个方面,详细讲解Inspector的使用方法和工作原理。
一、Inspector的使用
1.1 本地调试
我们从一个简单的http服务器开始,使用`node --inspect httpServer.js`启动服务器。在浏览器中打开开发者工具,选择调试Node.js的选项,点击后即可看到Inspector界面。在界面上设置断点,访问服务器时,开发者工具会停留在断点处,展示执行上下文。
1.2 远程调试
对于远程服务器的调试,只需在浏览器url输入框输入特定格式的地址,即可连接远程服务器进行调试。这种远程调试方式适合通用场景。
1.3 自动探测
若需要自动探测远程服务器,通过浏览器的`chrome://inspect/#devices`界面配置远程服务器地址,然后点击`inspect`按钮或`Open dedicated DevTools for Node`按钮,即可开始调试。
二、Inspector调试的原理
了解了使用方法后,我们来探索Inspector调试的原理。浏览器和服务器通过WebSocket协议通信。当在浏览器上设置断点时,浏览器会发送请求给服务器通知调试开始。服务器执行到断点时会通知浏览器,并返回执行上下文。通过这些交互,实现了代码调试。
三、Inspector的实现
理解了浏览器与服务器的通信过程后,我们深入探讨Inspector的实现。本文主要分析如何使用V8的Inspector以及Node.js中关于Inspector的实现部分。
3.1 开源实现
为了简化理解,我们分析了一个简单的调试工具源码,以直观展示Inspector原理。初始化代码创建Inspector并启动,之后分析了WebSocket服务器和inspector客户端的实现逻辑。
3.2 Node.js的实现(v)
Node.js实现较为复杂,这里仅概述流程。初始化时创建inspector::Agent并启动,之后分析了初始化、启动Io线程、创建InspectorIo对象、在线程中执行InspectorIo::ThreadMain函数等关键步骤。
四、动态开启Inspector
动态开启Inspector时,可通过URL参数控制,适合在Node.js进程出现问题时使用。本地调试时,VSCode等工具可以直接显示数据。
五、收集数据
V8 inspector提供了强大的功能,不仅能用于调试,还能收集内存、CPU等数据。具体功能请参考文档。
总结:Node.js的Inspector在额外线程中运行,通过Node.js作为中间人,实现了客户端与V8 inspector的通信,为Node.js进程的调试和诊断提供了有效方式。