diff --git a/.browserslistrc b/.browserslistrc
new file mode 100644
index 0000000000..e222c6ead2
--- /dev/null
+++ b/.browserslistrc
@@ -0,0 +1,9 @@
+[production]
+>0.2%
+not dead
+not op_mini all
+ie 9
+
+[development]
+last 5 chrome version
+last 5 firefox version
diff --git a/.commitlintrc.js b/.commitlintrc.js
new file mode 100644
index 0000000000..048131d35f
--- /dev/null
+++ b/.commitlintrc.js
@@ -0,0 +1,18 @@
+module.exports = {
+ parserPreset: {
+ parserOpts: {
+ headerPattern: /^(\w*)(?:\((.*)\))?:[ ]?(.*)$/,
+ headerCorrespondence: ['type', 'scope', 'subject'],
+ },
+ },
+ rules: {
+ 'type-empty': [2, 'never'],
+ 'type-case': [2, 'always', 'lower-case'],
+ 'subject-empty': [2, 'never'],
+ 'type-enum': [
+ 2,
+ 'always',
+ ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'up', 'revert', 'merge'],
+ ],
+ },
+};
diff --git a/.editorconfig b/.editorconfig
new file mode 100755
index 0000000000..7e3649acc2
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+# http://editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab
diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index 45303fee25..0000000000
--- a/.eslintrc
+++ /dev/null
@@ -1,12 +0,0 @@
----
-"extends":
- - "defaults"
-
-"env":
- "browser": true
- "node": true
-
-"globals":
- "hexo": true
- "jQuery": true
- "$": true
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000000..445c266627
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,32 @@
+module.exports = {
+ root: true,
+ parser: '@typescript-eslint/parser',
+ plugins: ['@typescript-eslint'],
+ extends: [
+ 'plugin:react/recommended',
+ 'plugin:react-hooks/recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'prettier',
+ 'prettier/react',
+ 'prettier/@typescript-eslint',
+ ],
+
+ settings: {
+ react: {
+ pragma: 'React',
+ version: 'detect',
+ },
+ },
+
+ env: {
+ browser: true,
+ es6: true,
+ },
+
+ rules: {
+ 'comma-dangle': [2, 'always-multiline'],
+ 'semi': [2, 'always'],
+ '@typescript-eslint/no-empty-interface': [0],
+ 'react/prop-types': [0],
+ },
+};
diff --git a/.gitignore b/.gitignore
index f6ae7351a8..d1bd248f95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,32 +1,29 @@
-.DS_Store
-Thumbs.db
-db.json
-*.log
-# Runtime data
-pids
-*.pid
-*.seed
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
-# Directory for instrumented libs generated by jscoverage/JSCover
-#public/
-.deploy*/
-# Coverage directory used by tools like istanbul
-coverage
+# production
+/build
+/dist
-# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
+# nginx
+config/error.log
+config/nginx.pid
-# node-waf configuration
-.lock-wscript
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
-# Compiled binary addons (http://nodejs.org/api/addons.html)
-build/Release
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
-# Dependency directory
-# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
-node_modules
-public
-.o2/
-themes/o2/
-.idea/
-*.xml
+.eslintcache
+react-app-env.d.ts
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 255b3aab54..0000000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,610 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- DEFINITION_ORDER
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- project
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- project
-
-
- true
-
-
-
- DIRECTORY
-
- false
-
-
-
-
-
-
-
- $USER_HOME$/.subversion
-
-
-
-
- 1483093838660
-
-
- 1483093838660
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.npmrc b/.npmrc
index fa352dcd32..b8db633588 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1,2 +1 @@
-phantomjs_cdnurl=https://npm.taobao.org/dist/phantomjs
-production=true
\ No newline at end of file
+sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
diff --git a/.nvmrc b/.nvmrc
deleted file mode 100644
index 7813681f5b..0000000000
--- a/.nvmrc
+++ /dev/null
@@ -1 +0,0 @@
-5
\ No newline at end of file
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 0000000000..3edab60ad8
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,23 @@
+module.exports = {
+ arrowParens: 'always',
+ bracketSpacing: true,
+ endOfLine: 'lf',
+ jsxBracketSameLine: false,
+ jsxSingleQuote: false,
+ parser: 'babel-ts',
+ printWidth: 100,
+ quoteProps: 'as-needed',
+ semi: true,
+ singleQuote: true,
+ tabWidth: 2,
+ trailingComma: 'all',
+ useTabs: false,
+ overrides: [
+ {
+ files: ['*.scss', '*.css'],
+ options: {
+ parser: 'css',
+ },
+ },
+ ],
+};
diff --git a/.stylelintrc.js b/.stylelintrc.js
new file mode 100644
index 0000000000..47fd73b849
--- /dev/null
+++ b/.stylelintrc.js
@@ -0,0 +1,17 @@
+module.exports = {
+ extends: [
+ 'stylelint-config-standard',
+ 'stylelint-config-recess-order',
+ 'stylelint-config-prettier',
+ ],
+ plugins: ['stylelint-scss', 'stylelint-order'],
+ rules: {
+ 'selector-pseudo-class-no-unknown': null,
+ 'at-rule-no-unknown': null,
+ 'no-empty-source': null,
+ 'scss/at-rule-no-unknown': true,
+ 'no-descending-specificity': null,
+ 'selector-list-comma-newline-after': null,
+ 'declaration-empty-line-before': null,
+ },
+};
diff --git a/.travis.yml b/.travis.yml
index 1023867e51..46f8d4d1c0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,29 +1,18 @@
language: node_js
sudo: false
node_js:
-- '8'
+- '14'
cache:
- apt: true
- directories:
- - node_modules
+ yarn: true
addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - g++-4.8
ssh_known_hosts: github.com
-install:
- - npm install
script:
-- npm run build
-- npm run clean
-- npm run deploy "${TRAVIS_PULL_REQUEST}"
+- yarn run build:release
+- yarn run deploy "${TRAVIS_PULL_REQUEST}"
branches:
only:
- - v2
+ - v3
env:
global:
- - CXX: g++-4.8
- GH_REPO: github.com/o2team/o2team.github.io.git
- secure: BF/nWKPH+6N0b8nV64VMNjNwT/DdhyMBCZJ6zdot3sT/3lhlG9vXFAR/p1LGI4+35gPx+lsuzOOEzRLQ1QP1SRVFmbIE9wGcfx2uAjwAitg7pLDkM0JSn/B4DYdb8wXBCg76ahTP71HB10T5IH/Lz4zy4Sm8nbWGe1NKtk16xhq181dcEpdM/SbwbBI0hJOUJsTBJScCR4PjzX69kbc58z8wXChdJ3Lkd2cFO8CsKwXODAkwqLjbHquW2jD1yjFwMLlsM5pI2nHgctoEyhM+Z1n/FacQ3jc48HYNSUeuJVgIcFU77xGKTwjm/91c2KucpD0NtihEWufklZCV/XYJGbkXdi3FvG6iJMZCoyMBJy6aX21QCX3gj2TClyJU929/13xnMtVr4qunnW3Cjc9wS4PaBNi4aJhaTRGpNXcBPYKigFtutytLJFalDdMemV7IUEvJgn3UtA5YwT8MC4JZJ26NZNMn+nXNWxHT6TVjq0l77/jp1ylKLy9kqYbQkuK/svrKgH2lcf8u7lji1lVPKKBHGnisbqKmZI+4qu0QqRFuBKKAoU+3iOmTMAdZGiT5CgZ6MBI+wmG6MGYAo6DOSSsMa/rtO+0XYJ77twa92PvY8DnRdc6Atvx/oxgunbrBDq1DTfLXE0fp2Ok0STjrWcIZXRQZRWqxMauy30jRJsQ=
diff --git a/.travis/deploy.sh b/.travis/deploy.sh
index 41242abc3c..27ef97fdef 100755
--- a/.travis/deploy.sh
+++ b/.travis/deploy.sh
@@ -1,12 +1,12 @@
#!/bin/bash
if [ "$1" = "false" ]
# not a pull request, deploy to github pages
-then ( cd public
+then ( cd dist
git init
- git config user.name "AOTULabs"
- git config user.email "o2labs@qq.com"
+ git config user.name "aotu-travis"
+ git config user.email "aotu@jd.com"
git add .
git commit -m "Deployed from Travis CI"
git push --force --quiet "https://${GH_TOKEN}@${GH_REPO}" master:master
)
-fi
\ No newline at end of file
+fi
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 20efd1b3e9..0000000000
--- a/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
diff --git a/README.md b/README.md
index 5000b3f3e4..b903fe001e 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1,34 @@
# aotu.io
-前端只是我们的正餐,其实我们还有许多的甜点!
+[](https://travis-ci.org/o2team/o2team.github.io)
-## Blog 相关
-### 写作方向
-请参考 [写作方向建议](https://github.com/o2team/o2team.github.io/wiki/Z4-Post-Advices)
+## 简介
-### 文章格式
+O2 Lab® 来自京东零售集团,创建于2015年10月,是一个专注于用户体验及产品价值提升的产品研发团队。
-请参考 [阮一峰——中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)
+我们围绕多端开发、服务端开发、人工智能、产品设计、视觉设计等方向沉淀与传播相关的专业知识及案例,为业界贡献经验价值。
-### 发布流程
+我们的核心产品包括「羚珑 - 智能设计平台」、「Taro - 多端统一开发解决方案」、「Deco - 设计稿一键转代码平台」、「Tide - 云端研发工作台」、「UIPaaS - 设计研发一体化方案」 等,深耕智慧设计、智能研发、跨端云研发体系的能力,助力泛零售业务实现智慧营销。
-1. [安装使用](https://github.com/o2team/o2team.github.io/wiki/A0-How-to-use)
-1. [新建文章](https://github.com/o2team/o2team.github.io/wiki/A1-New-Post)
-1. [文章发布](https://github.com/o2team/o2team.github.io/wiki/Z0-Publish)
-1. [审核校对](https://github.com/o2team/o2team.github.io/wiki/%E5%AE%A1%E6%A0%B8%E6%A0%A1%E5%AF%B9)
+京东集团奉行客户为先、诚信、协作、感恩、拼搏、担当的价值观,以“技术为本,致力于更高效和可持续的世界”为使命,目标是成为全球最值得信赖的企业。
-## Co-Editor
+## 关注
-### 关于联合编辑
+### 📃 微信公众号
-凹凸实验室的宗旨是`面向开发(Open Oriented)`,所以我们支持`开源`和`创作共用`的精神,欢迎其他优秀的个人、团队来凹凸实验室投稿。
+分享与讨论技术
-我们在收到你的投稿之后,会第一时间进行审核,审核通过后即发布官网进行安利推广。除此之外,凹凸实验室会利用自己的公众号来安利推送您的文章,同时发布到`掘金`APP。
+
-### 如何投稿?
+### 🎥 微信视频号
-有3种方法投稿:
+凹凸日常和技术分享
-#### 1)`fork` + `pull request`
+
-1. `fork` 凹凸实验室官网源码:https://github.com/o2team/o2team.github.io
-2. 在v2分支的`source/_posts/` 路径下新建文章,格式参考现有的文章,图床请使用您自己的图床哦
-3. `pull request`,注明『投稿』
-#### 2)直接加入凹凸实验室
-
-1. 新建一个[issue](https://github.com/o2team/o2team.github.io/issues)
-
- 标题为`申请加入凹凸实验室`,标签打上`co-editor`,在issue里面提供你简要的公司、团队或个人信息。
-
-2. 在审核完信息后我们会联系你并将你加入到凹凸实验室
-3. 加入凹凸后可以直接在[o2team.github.io](https://github.com/o2team/o2team.github.io)仓库上提交文章
-
- 参考[如何添加文章](https://github.com/o2team/o2team.github.io/wiki/A1-New-Post)
-
-#### 3)将文章的markdown文件发送给`aotu{at}jd.com`
-
-Co-Editor投稿的文章,可以在MD文档头部的`front-formatter`中设定你们的名称(name)和链接(url),这些信息用于文章页面的末尾的版权声明。
-
-示例如下:
-
-```yaml
-title: feWorkflow - 使用electron, react, redux, immutable构建桌面App
-subtitle: "使用react, redux, immutable框架做ui开发,仍然基于运行gulpfile的方案,这样可以使每个使用自己团队的gulp工作流快速接入和自由调整。"
-cover: //img12.360buyimg.com/ling/jfs/t1/53860/29/2535/37986/5d07017fE74648962/7f866b67c5ae6d8a.jpg
-date: 2016-07-05 00:24:35
-categories: NodeJS
-tags:
- - React
- - Electron
-author:
- nick: whatif
- github_name: whatifhappen
-coeditor:
- name: whatifhappen
- url: https://github.com/whatifhappen
---
-```
-
-关于联合编辑更为详细的说明,请参考文档:[Co-Editor](https://github.com/o2team/o2team.github.io/wiki/Z3-Co-Editor)
-
-### 关注公众号
-
-关注公众号可以及时了解我们的信息、博文推送。
-
-
-
-## 其他
-1. [安装使用](https://github.com/o2team/o2team.github.io/wiki/A0-How-to-use)
-1. [新建文章](https://github.com/o2team/o2team.github.io/wiki/A1-New-Post)
-1. [博客特性](https://github.com/o2team/o2team.github.io/wiki/B0-Features)
-1. [Roadmap](https://github.com/o2team/o2team.github.io/wiki/B1-roadmap)
-1. [更新日志](https://github.com/o2team/o2team.github.io/wiki/B2-change-logs)
-1. [文章发布](https://github.com/o2team/o2team.github.io/wiki/Z0-Publish)
-1. [文章运营](https://github.com/o2team/o2team.github.io/wiki/Z1-Operation)
-1. [Web开发测试题](https://github.com/o2team/o2team.github.io/wiki/Z2-Web-Developer-Test)
-1. [联合编辑](https://github.com/o2team/o2team.github.io/wiki/Z3-Co-Editor)
+哦对了,你有发现 [aotu.io](https://aotu.io) 的小彩蛋吗?
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index 3143c5c3a5..0000000000
--- a/_config.yml
+++ /dev/null
@@ -1,196 +0,0 @@
-# Hexo Configuration
-## Docs: http://hexo.io/docs/configuration.html
-## Source: https://github.com/hexojs/hexo/
-
-# Site
-title: Aotu.io
-subtitle: 凹凸实验室
-subtitle_desc: Open Oriented Development Center
-slogan: Open Oriented, more haste, less speed.
-keywords: 凹凸实验室, Aotu, 前端开发, 全栈开发, IOS开发, Android开发
-description: 凹凸实验室(Aotu.io) 始建于2015年,是一个年轻基情的技术社区组织。
O2面向多终端技术体系,致力于构建沉淀与分享包括但不限于交互、页面制作技巧、前端开发、原生APP开发等方面的专业知识及案例。
-author: 凹凸实验室
-language: zh-cn
-timezone: Asia/Shanghai
-
-# URL
-## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
-url: https://aotu.io
-root: /
-permalink: notes/:year/:month/:day/:title/
-permalink_defaults:
-
-# Directory
-source_dir: source
-public_dir: public
-tag_dir: tags
-archive_dir: notes
-category_dir: cates
-code_dir: downloads/code
-i18n_dir: :lang
-skip_render:
- - 'baidu*.html'
- - 'demo/**'
-
-# Writing
-new_post_name: :year-:month-:day-:title.md # File name of new posts
-default_layout: post
-titlecase: false # Transform title into titlecase
-external_link: true # Open external links in new tab
-filename_case: 0
-render_drafts: true
-post_asset_folder: false
-relative_link: false
-future: true
-highlight:
- enable: true
- line_number: true
- auto_detect: true
- tab_replace:
-
-# Category & Tag
-default_category: uncategorized
-category_map:
-tag_map:
-
-# Date / Time format
-## Hexo uses Moment.js to parse and display date
-## You can customize the date format as defined in
-## http://momentjs.com/docs/#/displaying/format/
-date_format: YYYY-MM-DD
-time_format: HH:mm:ss
-
-# generator-index
-index_generator:
- per_page: 24
- order_by: -date
-
-# tag generator
-## https://github.com/hexojs/hexo-generator-tag
-tag_generator:
- per_page: 24
-
-# fragments generator
-## https://github.com/mamboer/hexo-generator-fragments
-fragments_generator:
- dir: fragments
- per_page: 24
- index_dir: index
-
-# Pagination
-## Set per_page to 0 to disable pagination
-per_page: 24
-pagination_dir: page
-
-# Extensions
-## Plugins: http://hexo.io/plugins/
-## Themes: http://hexo.io/themes/
-theme: lattice
-
-
-# Feeds
-## https://www.npmjs.com/package/hexo-generator-xfeed
-xfeed:
- type: atom
- path: atom.xml
- limit: false
-
-# Json Feeds
-## https://github.com/alexbruno/hexo-generator-json-feed
-jsonFeed:
- limit: 30
-
-#stylus
-stylus:
- compress: false
- sourcemaps:
- comment: true
- inline: true
- sourceRoot: ''
- basePath: .
-
-
-# lunr
-lunr:
- field: all
- path: assets/lunr/
-
-# Deployment
-## Docs: http://hexo.io/docs/deployment.html
-deploy:
- type: git
- message: Super AOTUMan at {{ now('YYYY-MM-DD HH:mm:ss') }}
- repo:
- github: git@github.com:o2team/o2team.github.io.git,master
-
-# Disqus
-disqus_shortname:
-
-# Analytics
-baidu_analytics: e850b980d029480b092fdd7503c3f8de
-google_analytics:
-ta_analytics: 53685723
-
-# Social
-twitter: o2circle
-github:
- user: o2team
- repo: o2team.github.io
-
-# baidu sitemap
-baidusitemap:
- url: http://aotu.io/
-
-baiduce: 2b74a5aea155a215abea8547f929190c
-
-# filter_cleanup
-hfc_useref:
- enable: true
- concat: true
-
-hfc_html:
- enable: true
-
-hfc_css:
- enable: true
- exclude:
- - '*.min.css'
-
-hfc_js:
- enable: true
- mangle: true
- exclude:
- - '*.min.js'
-
-hfc_img:
- enable: true
- interlaced: false
- multipass: false
- optimizationLevel: 2
- pngquant: false
- progressive: false
-
-hfc_favicons:
- enable: true
- src: img/logo.png
- target: img/
- opts:
- appName: Aotu.io
- appDescription: "AotuLabs's Offical Site"
- theme_color: "#2f83cd"
- icons:
- android: true
- appleIcon: true
- appleStartup: false
- coast: false
- favicons: true
- firefox: false
- opengraph: false
- windows: true
- yandex: false
-
-# O2 Theme Customation
-logo_url: img/o2logo.png
-
-wechat:
- jssdk_url: https://aotu.jd.com/aotu-wx-api/api/wx/jssdk/signature
diff --git a/config/jelly.map b/config/jelly.map
new file mode 100644
index 0000000000..842da7569a
--- /dev/null
+++ b/config/jelly.map
@@ -0,0 +1,245 @@
+~(^/notes/2015/10/21/z-index-and-translate3d) https://jelly.jd.com/article/6006b1025b6c6a01506c8775;
+~(^/notes/2015/10/26/zepto-cors) https://jelly.jd.com/article/6006b1025b6c6a01506c8776;
+~(^/notes/2015/11/02/flash-canvas) https://jelly.jd.com/article/6006b1025b6c6a01506c8777;
+~(^/notes/2015/11/08/css-stack-order) https://jelly.jd.com/article/6006b1025b6c6a01506c8779;
+~(^/notes/2015/11/20/svg-I-know) https://jelly.jd.com/article/6006b1025b6c6a01506c877d;
+~(^/notes/2015/11/24/3D-CleaningCream) https://jelly.jd.com/article/6006b1025b6c6a01506c8780;
+~(^/notes/2015/11/24/project-summary) https://jelly.jd.com/article/6006b1025b6c6a01506c8781;
+~(^/notes/2016/01/04/css3-animation) https://jelly.jd.com/article/6006b1025b6c6a01506c8789;
+~(^/notes/2016/01/16/UFT) https://jelly.jd.com/article/6006b1035b6c6a01506c878e;
+~(^/notes/2016/03/01/createjs-get-started) https://jelly.jd.com/article/6006b1035b6c6a01506c8796;
+~(^/notes/2016/03/15/jcloud-sum) https://jelly.jd.com/article/6006b1035b6c6a01506c8799;
+~(^/notes/2016/03/16/optimization) https://jelly.jd.com/article/6006b1035b6c6a01506c879a;
+~(^/notes/2016/03/17/http2-char) https://jelly.jd.com/article/6006b1035b6c6a01506c879b;
+~(^/notes/2016/04/13/Iris-Wipe) https://jelly.jd.com/article/6006b1035b6c6a01506c87a0;
+~(^/notes/2016/05/06/CSS3-3D-Animation) https://jelly.jd.com/article/6006b1035b6c6a01506c87a5;
+~(^/notes/2016/05/17/css3-animation-frame) https://jelly.jd.com/article/6006b1035b6c6a01506c87a7;
+~(^/notes/2016/06/24/Shadow-DOM) https://jelly.jd.com/article/6006b1045b6c6a01506c87ac;
+~(^/notes/2016/08/29/SeaJs-From-Entry-To-The-Principle) https://jelly.jd.com/article/6006b1045b6c6a01506c87b6;
+~(^/notes/2016/09/02/Different-Binding) https://jelly.jd.com/article/6006b1045b6c6a01506c87b7;
+~(^/notes/2016/11/17/regexp-theory) https://jelly.jd.com/article/6006b1045b6c6a01506c87c6;
+~(^/notes/2016/11/22/SVG_Web_Animation) https://jelly.jd.com/article/6006b1045b6c6a01506c87c9;
+~(^/notes/2016/11/28/css3-animation-properties) https://jelly.jd.com/article/6006b1045b6c6a01506c87ca;
+~(^/notes/2016/12/04/firewatcher-appreciation) https://jelly.jd.com/article/6006b1045b6c6a01506c87cc;
+~(^/notes/2016/12/07/regexp-practice) https://jelly.jd.com/article/6006b1045b6c6a01506c87cd;
+~(^/notes/2017/04/13/Sticky-footer) https://jelly.jd.com/article/6006b1045b6c6a01506c87e3;
+~(^/notes/2017/05/25/canvas-img-rotate-and-flip) https://jelly.jd.com/article/6006b1045b6c6a01506c87e6;
+~(^/notes/2017/06/27/infinite-scrolling) https://jelly.jd.com/article/6006b1045b6c6a01506c87e9;
+~(^/notes/2017/07/10/Random-Circles) https://jelly.jd.com/article/6006b1045b6c6a01506c87eb;
+~(^/notes/2017/07/17/The-Exploration-and-Practice-of-Vue) https://jelly.jd.com/article/6006b1045b6c6a01506c87ec;
+~(^/notes/2017/08/28/at-ui) https://jelly.jd.com/article/6006b1045b6c6a01506c87f1;
+~(^/notes/2017/11/27/iphonex) https://jelly.jd.com/article/6006b1055b6c6a01506c87fd;
+~(^/notes/2015/11/23/css3-animation-to-movie-part_1) https://jelly.jd.com/article/5da04f5eb50eec01579ac790;
+~(^/notes/2016/06/22/An-interesting-experience-on-console) https://jelly.jd.com/article/5c2ddb0117b02c0047331467;
+~(^/notes/2017/11/06/path-animation) https://jelly.jd.com/article/5c6531ebc5fbdf0053af74bb;
+~(^/notes/2017/11/06/coindozer) https://jelly.jd.com/article/5da9cb00b73b470152998c89;
+~(^/notes/2018/01/04/waterful) https://jelly.jd.com/article/5cc18e24a3137601507fcaa8;
+~(^/notes/2018/03/22/nerv) https://jelly.jd.com/article/5c2d73af17b02c00473313c2;
+~(^/notes/2018/06/06/ImageMagick_intro) https://jelly.jd.com/article/5c34081bd7aa2c0055d09a71;
+~(^/notes/2018/06/07/Taro) https://jelly.jd.com/article/5c2dea3517b02c004733147d;
+~(^/notes/2018/09/11/taro-in-jd) https://jelly.jd.com/article/5c340a8fd7aa2c0055d09a78;
+~(^/notes/2018/10/18/cannonjs) https://jelly.jd.com/article/5c3409fed7aa2c0055d09a75;
+~(^/notes/2018/10/22/Responsive-single-screen-design) https://jelly.jd.com/article/5c510e42c6dc110059dafb93;
+~(^/notes/2018/11/23/SVG_vs_Image_vs_iconfont) https://jelly.jd.com/article/5c510ef9c6dc110059dafba6;
+~(^/notes/2018/11/30/taro_practice) https://jelly.jd.com/article/5c2d704b17b02c00473313bd;
+~(^/notes/2018/12/17/taro-1-2) https://jelly.jd.com/article/5c2de45917b02c004733146d;
+~(^/notes/2018/12/23/phaser3) https://jelly.jd.com/article/5c3411efd7aa2c0055d09a85;
+~(^/notes/2019/06/13/taro-1-3) https://jelly.jd.com/article/5d02003d62ff410159e03fbd;
+~(^/notes/2019/06/21/taro-ext-club) https://jelly.jd.com/article/5cbda2bd1fdd4d015df632a7;
+~(^/notes/2019/07/10/taro-hooks) https://jelly.jd.com/article/5d269c39177c9c0184c29cce;
+~(^/notes/2019/08/05/serverless) https://jelly.jd.com/article/5d3669d1177c9c0184c2a551;
+~(^/notes/2019/08/26/jdindex_2019) https://jelly.jd.com/article/5d5a5dc1d126da015cdcbc87;
+~(^/notes/2019/09/11/project-management-of-programmer) https://jelly.jd.com/article/5d748409b88a970154c53a4c;
+~(^/notes/2019/09/25/taro-flex) https://jelly.jd.com/article/6006b1055b6c6a01506c8820;
+~(^/notes/2019/10/24/taro-open) https://jelly.jd.com/article/5db10ad4b73b4701529993d6;
+~(^/notes/2019/10/28/modified-at) https://jelly.jd.com/article/5db81bd3b73b470152999b28;
+~(^/notes/2019/10/29/css-preprocessor) https://jelly.jd.com/article/5dcb9c73641a030153732a89;
+~(^/notes/2019/12/03/jingxi-index) https://jelly.jd.com/article/6006b1055b6c6a01506c8825;
+~(^/notes/2019/12/05/ling-testing-project) https://jelly.jd.com/article/5de8772491c73e0154a10e67;
+~(^/notes/2020/01/02/gmtc) https://jelly.jd.com/article/5fcee2220927570145049250;
+~(^/notes/2020/01/08/taro-2-0) https://jelly.jd.com/article/5fed407d846cc00148ae5139;
+~(^/notes/2020/02/03/taro-next-alpha) https://jelly.jd.com/article/5e74a413affa830149087895;
+~(^/notes/2020/02/21/jdrd-summary) https://jelly.jd.com/article/5e1c27c6d2fcd20149f6f560;
+~(^/notes/2020/02/28/webfont-processing) https://jelly.jd.com/article/5e4b966301a3a70183dfa982;
+~(^/notes/2020/03/17/technological-growth) https://jelly.jd.com/article/5e6f8438ee9d090158673fdf;
+~(^/notes/2020/03/25/high-performance-miniprogram) https://jelly.jd.com/article/5e71e60faffa83014908764d;
+~(^/notes/2020/04/07/electron-in-taro-ide) https://jelly.jd.com/article/5edde472c27b86015c5016e0;
+~(^/notes/2020/04/13/2020-4-13-taro-components) https://jelly.jd.com/article/5fed3d8a468efc014a4e5775;
+~(^/notes/2020/04/21/atom-services-upgrade) https://jelly.jd.com/article/5e6213d339173d015d42ddec;
+~(^/notes/2020/04/27/taro-build-jd) https://jelly.jd.com/article/5dc95ebeb73b47015299a89f?tunnel=tunnel_default;
+~(^/notes/2020/04/27/taro-vs-jd) https://jelly.jd.com/article/5dd299e55e25630153788c36;
+~(^/notes/2020/05/06/jingxi-automated-testing) https://jelly.jd.com/article/5e9d5ca110f7500156d48b42;
+~(^/notes/2020/05/12/file-upload) https://jelly.jd.com/article/5e734631affa8301490877f1;
+~(^/notes/2020/05/25/taro-3-rc) https://jelly.jd.com/article/5eba3d1238782001536219c9;
+~(^/notes/2020/06/07/sql-to-mongo-2) https://jelly.jd.com/article/5edf43da70bb2b0168e022b2;
+~(^/notes/2020/06/07/sql-to-mongo-1) https://jelly.jd.com/article/5edf432cc27b86015c50187a;
+~(^/notes/2020/06/08/momentum-scrolling) https://jelly.jd.com/article/5edf2be9c27b86015c501846;
+~(^/notes/2020/06/09/strong-svg) https://jelly.jd.com/article/5ee983117c53070156dd45c7;
+~(^/notes/2020/06/22/linearGradient) https://jelly.jd.com/article/6006b1055b6c6a01506c883b;
+~(^/notes/2020/06/22/timer-miniprogram) https://jelly.jd.com/article/5ee875eb7c53070156dd43f6;
+~(^/notes/2020/06/30/taro-3-0-0) https://jelly.jd.com/article/5efb5bc37c53070156dd622e;
+~(^/notes/2020/07/13/jx-automated-testing-weapp) https://jelly.jd.com/article/5f0285b9b22c54014e9754d9;
+~(^/notes/2020/07/17/webpack-analize) https://jelly.jd.com/article/5f0de6dad5205e015b87c128;
+~(^/notes/2020/07/21/618-what-taobao-do) https://jelly.jd.com/article/5f0d520051d3d5018267464c;
+~(^/notes/2020/07/23/mobile-top-nav) https://jelly.jd.com/article/5f0d1f9651d3d50182674624;
+~(^/notes/2020/07/23/how-to-use-grid-layout) https://jelly.jd.com/article/5f080a8c72ddb8015632ed0b;
+~(^/notes/2020/07/24/line-height-in-all-hardware) https://jelly.jd.com/article/5f1aad7a389c9b015a4a23eb;
+~(^/notes/2020/07/27/how-to-use-react-docgen) https://jelly.jd.com/article/5f1e5c35648ca1015bb279a0;
+~(^/notes/2020/08/25/jx-audit-grade-optimization) https://jelly.jd.com/article/5f3b8a846c3f76015f7597b8;
+~(^/notes/2020/08/25/valentine-plugin-cli) https://jelly.jd.com/article/5f447fc70186880153ccdbd4;
+~(^/notes/2020/08/31/taro-versions) https://jelly.jd.com/article/5f9235c98faf9d015810e654;
+~(^/notes/2020/09/01/video-editor-summary) https://jelly.jd.com/article/5efb30b24b54be014cf4e104;
+~(^/notes/2020/09/08/web-vr) https://jelly.jd.com/article/5f586c925e6e88014d42f912;
+~(^/notes/2020/09/10/git-commit-control) https://jelly.jd.com/article/5f51aa34da524a0147e9529d;
+~(^/notes/2020/09/21/jx-weapp-accessible) https://jelly.jd.com/article/5f6452f96729c6015293c067;
+~(^/notes/2020/09/28/taro-vue3) https://jelly.jd.com/article/5f729649c526ae0148c2a29d;
+~(^/notes/2020/10/13/build-performant-flutter-widget) https://jelly.jd.com/article/5f77525fbd5f1801521abc86;
+~(^/notes/2020/10/13/improving-perceived-performance-with-image-placeholders-precaching-and-disabled-navigation) https://jelly.jd.com/article/5f774652bd5f1801521abc7b;
+~(^/notes/2020/10/13/optimizing-performance-in-flutter-web-apps-with-tree-shaking-and-deferred-loading) https://jelly.jd.com/article/5f772b07bd5f1801521abc31;
+~(^/notes/2020/10/28/node-sandbox-escape-analysis) https://jelly.jd.com/article/5f7296d0c526ae0148c2a2bb;
+~(^/notes/2020/11/05/easeJs-center-setting) https://jelly.jd.com/article/5f7327dbbd5f1801521aa7dd;
+~(^/notes/2020/11/12/mongo-replica-set) https://jelly.jd.com/article/5f990ebbbfbee00150eb620a;
+~(^/notes/2020/11/12/react-indoor) https://jelly.jd.com/article/5fbb4fe17482df01463debf8;
+~(^/notes/2020/11/23/vue-ref-sugar-javascript-label) https://jelly.jd.com/article/5fba3ef67482df01463de6d3;
+~(^/notes/2020/11/30/jx-code-slim) https://jelly.jd.com/article/5fbfa6e9cff6b301458392c3;
+~(^/notes/2020/12/24/aotu-5-year) https://jelly.jd.com/article/5fe58d1bb402750151b4e119;
+~(^/notes/2020/12/25/ling-ai-design) https://jelly.jd.com/article/5fe58e83b402750151b4e12b;
+~(^/notes/2020/12/31/ling-atom-design) https://jelly.jd.com/article/5fec7fa0468efc014a4e5309;
+~(^/notes/2020/12/31/deco) https://jelly.jd.com/article/5ffbc4fcdd7c080151c80c74;
+~(^/notes/2021/01/06/quark-design-asset) https://jelly.jd.com/article/5ff5c568adf81001487be87f;
+~(^/notes/2021/01/06/taro-ide-n-tide) https://jelly.jd.com/article/6006b1065b6c6a01506c885e;
+~(^/notes/2021/01/14/taro-history) https://jelly.jd.com/article/6001048e131539014c10a0a6;
+~(^/notes/2021/02/01/both-tech-n-biz) https://jelly.jd.com/article/6017f0ea69400c0171bb0979;
+~(^/notes/2018/04/24/jdindex_2017) https://jelly.jd.com/article/6006b1055b6c6a01506c8808;
+~(^/notes/2018/08/27/the-birth-of-taro-ui) https://jelly.jd.com/article/6006b1055b6c6a01506c880c;
+~(^/notes/2019/02/28/taro-h5-optimize) https://jelly.jd.com/article/6006b1055b6c6a01506c8817;
+~(^/notes/2020/10/13/animation-skill) https://jelly.jd.com/article/6006b1055b6c6a01506c884e;
+~(^/notes/2020/10/13/css3-optimization) https://jelly.jd.com/article/6006b1055b6c6a01506c8850;
+~(^/notes/2015/10/13/start-postcss) https://jelly.jd.com/article/6006b1025b6c6a01506c8773;
+~(^/notes/2015/10/16/vim-list) https://jelly.jd.com/article/6006b1025b6c6a01506c8774;
+~(^/notes/2015/11/06/webp-responsive-image) https://jelly.jd.com/article/6006b1025b6c6a01506c8778;
+~(^/notes/2015/11/11/phantomJs-crawler) https://jelly.jd.com/article/6006b1025b6c6a01506c877a;
+~(^/notes/2015/11/16/101-percent) https://jelly.jd.com/article/6006b1025b6c6a01506c877b;
+~(^/notes/2015/11/17/Git-Commands) https://jelly.jd.com/article/6006b1025b6c6a01506c877c;
+~(^/notes/2015/11/23/css3-animation-to-movie-part_2) https://jelly.jd.com/article/5da04f5eb50eec01579ac790;
+~(^/notes/2015/12/04/edgeAnimate) https://jelly.jd.com/article/6006b1025b6c6a01506c8782;
+~(^/notes/2015/12/09/an-introduction-to-sass-maps) https://jelly.jd.com/article/6006b1025b6c6a01506c8783;
+~(^/notes/2015/12/18/etymology-of-foobar) https://jelly.jd.com/article/6006b1025b6c6a01506c8784;
+~(^/notes/2015/12/23/building-command-line-tools-with-node-js) https://jelly.jd.com/article/6006b1025b6c6a01506c8785;
+~(^/notes/2015/12/23/new-safari-9) https://jelly.jd.com/article/6006b1025b6c6a01506c8786;
+~(^/notes/2015/12/29/ae) https://jelly.jd.com/article/6006b1025b6c6a01506c8787;
+~(^/notes/2016/01/02/3D-panorama) https://jelly.jd.com/article/602f26b361dbb7014cffc5a0;
+~(^/notes/2016/01/07/auto-deploy-website-by-webhooks-of-github) https://jelly.jd.com/article/6006b1025b6c6a01506c878a;
+~(^/notes/2016/01/07/debug-webapp-with-chrome-devtools) https://jelly.jd.com/article/6006b1025b6c6a01506c878b;
+~(^/notes/2016/01/08/promise) https://jelly.jd.com/article/6006b1025b6c6a01506c878c;
+~(^/notes/2016/01/14/introduction-to-JS-game-development) https://jelly.jd.com/article/6006b1025b6c6a01506c878d;
+~(^/notes/2016/01/26/Private-CocoaPods-Specs-Repo/) https://jelly.jd.com/article/5c514506c6dc110059dafca5;
+~(^/notes/2016/01/27/how-to-make-cocoapods) https://jelly.jd.com/article/5c514778c6dc110059dafcab;
+~(^/notes/2016/01/28/3xx-of-http-status) https://jelly.jd.com/article/6006b1035b6c6a01506c8791;
+~(^/notes/2016/02/19/ngrok) https://jelly.jd.com/article/6006b1035b6c6a01506c8792;
+~(^/notes/2016/02/24/node-debug-in-production) https://jelly.jd.com/article/6006b1035b6c6a01506c8793;
+~(^/notes/2016/02/26/use-npm-script-instead-of-gulp) https://jelly.jd.com/article/6006b1035b6c6a01506c8794;
+~(^/notes/2016/02/27/docker) https://jelly.jd.com/article/6006b1035b6c6a01506c8795;
+~(^/notes/2016/03/04/can-we-use-base64-in-h5-webapps) https://jelly.jd.com/article/6006b1035b6c6a01506c8797;
+~(^/notes/2016/03/09/img-loading-optimization-in-mobile) https://jelly.jd.com/article/6006b1035b6c6a01506c8798;
+~(^/notes/2016/03/30/cornerRadius-in-Storyboard) https://jelly.jd.com/article/6006b1035b6c6a01506c879c;
+~(^/notes/2016/03/31/readable) https://jelly.jd.com/article/6006b1035b6c6a01506c879d;
+~(^/notes/2016/04/07/node-excel) https://jelly.jd.com/article/6006b1035b6c6a01506c879e;
+~(^/notes/2016/04/12/jcloud-opt) https://jelly.jd.com/article/6006b1035b6c6a01506c879f;
+~(^/notes/2016/04/14/math-random) https://jelly.jd.com/article/6006b1035b6c6a01506c87a2;
+~(^/notes/2016/04/14/js-reduce) https://jelly.jd.com/article/6006b1035b6c6a01506c87a1;
+~(^/notes/2016/04/21/form-request) https://jelly.jd.com/article/6006b1035b6c6a01506c87a3;
+~(^/notes/2016/04/28/SPM) https://jelly.jd.com/article/6006b1035b6c6a01506c87a4;
+~(^/notes/2016/05/06/Guide-To-Tween-Animation) https://jelly.jd.com/article/6006b1035b6c6a01506c87a6;
+~(^/notes/2016/05/27/adobe-spark) https://jelly.jd.com/article/6006b1035b6c6a01506c87a8;
+~(^/notes/2016/06/23/explore-something-of-webp) https://jelly.jd.com/article/6006b1035b6c6a01506c87a9;
+~(^/notes/2016/06/14/http2) https://jelly.jd.com/article/6006b1035b6c6a01506c87aa;
+~(^/notes/2016/07/03/HIFSD2-Summary) https://jelly.jd.com/article/6006b1045b6c6a01506c87ad;
+~(^/notes/2016/07/05/fe-workflow) https://jelly.jd.com/article/6006b1045b6c6a01506c87ae;
+~(^/notes/2016/07/09/SVG-Symbol-component-practice) https://jelly.jd.com/article/6006b1045b6c6a01506c87af;
+~(^/notes/2016/07/19/A-little-exploration-of-front-end-engineering) https://jelly.jd.com/article/6006b1045b6c6a01506c87b0;
+~(^/notes/2016/07/25/vuejs-mailsign) https://jelly.jd.com/article/6006b1045b6c6a01506c87b1;
+~(^/notes/2016/07/28/o2-wants-you) https://jelly.jd.com/article/6006b1045b6c6a01506c87b2;
+~(^/notes/2016/08/05/robot-design-school) https://jelly.jd.com/article/6006b1045b6c6a01506c87b3;
+~(^/notes/2016/08/09/command-line-development) https://jelly.jd.com/article/6006b1045b6c6a01506c87b4;
+~(^/notes/2016/08/16/nginx-https) https://jelly.jd.com/article/6006b1045b6c6a01506c87b5;
+~(^/notes/2016/08/24/2016-8-24-css-3d-panorama) https://jelly.jd.com/article/6006b1045b6c6a01506c87d1;
+~(^/notes/2016/08/24/2016-8-24-webvr) https://jelly.jd.com/article/6006b1045b6c6a01506c87d2;
+~(^/notes/2016/09/22/es6-import-with-babel) https://jelly.jd.com/article/6030845863dc65014d6fb71d;
+~(^/notes/2016/09/22/http-caching) https://jelly.jd.com/article/6030851d239b6e014a19fb41;
+~(^/notes/2016/09/28/3d-touch) https://jelly.jd.com/article/6006b1045b6c6a01506c87b8;
+~(^/notes/2016/10/08/aframe) https://jelly.jd.com/article/6006b1045b6c6a01506c87b9;
+~(^/notes/2016/10/09/HTML5-SopCast) https://jelly.jd.com/article/603085d363dc65014d6fb755;
+~(^/notes/2016/10/13/vue2) https://jelly.jd.com/article/6030864b63dc65014d6fb75c;
+~(^/notes/2016/10/19/css3-mask) https://jelly.jd.com/article/6006b1045b6c6a01506c87bb;
+~(^/notes/2016/10/24/decorator) https://jelly.jd.com/article/6030875363dc65014d6fb76f;
+~(^/notes/2016/11/02/border-image) https://jelly.jd.com/article/6006b1045b6c6a01506c87bc;
+~(^/notes/2016/11/02/AdobeMax2016) https://jelly.jd.com/article/6006b1045b6c6a01506c87bd;
+~(^/notes/2016/11/07/apng) https://jelly.jd.com/article/6006b1045b6c6a01506c87be;
+~(^/notes/2016/11/08/css3fontweight) https://jelly.jd.com/article/6006b1045b6c6a01506c87bf;
+~(^/notes/2016/11/08/first-mobile-rebuild) https://jelly.jd.com/article/6006b1045b6c6a01506c87c0;
+~(^/notes/2016/11/09/liteo2-app) https://jelly.jd.com/article/6006b1045b6c6a01506c87c1;
+~(^/notes/2016/11/10/weui-wxss) https://jelly.jd.com/article/6006b1045b6c6a01506c87c2;
+~(^/notes/2016/11/14/webpack-tips) https://jelly.jd.com/article/6006b1045b6c6a01506c87c4;
+~(^/notes/2016/11/14/booklist-for-every-programmer) https://jelly.jd.com/article/6006b1045b6c6a01506c87c3;
+~(^/notes/2016/11/15/xcel) https://jelly.jd.com/article/6030a20b239b6e014a19fc07;
+~(^/notes/2016/11/21/liteo2-app-tarots) https://jelly.jd.com/article/6006b1045b6c6a01506c87c7;
+~(^/notes/2016/11/22/figlet) https://jelly.jd.com/article/6006b1045b6c6a01506c87c8;
+~(^/notes/2016/12/02/jcloud) https://jelly.jd.com/article/6006b1045b6c6a01506c87cb;
+~(^/notes/2016/12/08/vim-4) https://jelly.jd.com/article/6006b1045b6c6a01506c87ce;
+~(^/notes/2016/12/26/jd-index-2016-summary) https://jelly.jd.com/article/6006b1045b6c6a01506c87cf;
+~(^/notes/2016/12/28/vue-clock) https://jelly.jd.com/article/6006b1045b6c6a01506c87d0;
+~(^/notes/2017/01/04/geek-talks-s2) https://jelly.jd.com/article/6006b1045b6c6a01506c87d3;
+~(^/notes/2017/01/06/wxapp-img-loader) https://jelly.jd.com/article/6006b1045b6c6a01506c87d4;
+~(^/notes/2017/01/11/mobile-video) https://jelly.jd.com/article/6006b1045b6c6a01506c87d5;
+~(^/notes/2017/01/16/base-shapes-to-path) https://jelly.jd.com/article/6006b1045b6c6a01506c87d6;
+~(^/notes/2017/01/17/elf) https://jelly.jd.com/article/6006b1045b6c6a01506c87d7;
+~(^/notes/2017/01/19/wxapp-event) https://jelly.jd.com/article/6006b1045b6c6a01506c87d8;
+~(^/notes/2017/01/19/sass-svg) https://jelly.jd.com/article/6006b1045b6c6a01506c87d9;
+~(^/notes/2017/01/22/snapsvg) https://jelly.jd.com/article/6006b1045b6c6a01506c87da;
+~(^/notes/2017/01/31/detect-orientation) https://jelly.jd.com/article/6006b1045b6c6a01506c87db;
+~(^/notes/2017/02/16/2d-collision-detection) https://jelly.jd.com/article/6006b1045b6c6a01506c87dc;
+~(^/notes/2017/02/24/Mobile-debug) https://jelly.jd.com/article/6006b1045b6c6a01506c87dd;
+~(^/notes/2017/03/03/liteo2-android) https://jelly.jd.com/article/6006b1045b6c6a01506c87de;
+~(^/notes/2017/03/24/webar) https://jelly.jd.com/article/6006b1045b6c6a01506c87df;
+~(^/notes/2017/04/10/githooks) https://jelly.jd.com/article/6006b1045b6c6a01506c87e1;
+~(^/notes/2017/04/10/fetch-API) https://jelly.jd.com/article/6006b1045b6c6a01506c87e0;
+~(^/notes/2017/04/11/GPU) https://jelly.jd.com/article/6006b1045b6c6a01506c87e2;
+~(^/notes/2017/04/17/Matter-js) https://jelly.jd.com/article/6006b1045b6c6a01506c87e4;
+~(^/notes/2017/04/22/an-update-on-es6-modules-in-node-js) https://jelly.jd.com/article/6030a305239b6e014a19fc0e;
+~(^/notes/2017/04/28/2017-4-28-CSS-viewport-units) https://jelly.jd.com/article/6006b1055b6c6a01506c8801;
+~(^/notes/2017/05/04/example-for-svg-animation) https://jelly.jd.com/article/6006b1045b6c6a01506c87e5;
+~(^/notes/2017/06/09/ps-tricks) https://jelly.jd.com/article/6006b1045b6c6a01506c87e7;
+~(^/notes/2017/06/15/The-mystery-of-URL-encoding) https://jelly.jd.com/article/6006b1045b6c6a01506c87e8;
+~(^/notes/2017/06/29/motion-detection) https://jelly.jd.com/article/6006b1045b6c6a01506c87ea;
+~(^/notes/2017/07/17/design-a-swiper) https://jelly.jd.com/article/6006b1045b6c6a01506c87ed;
+~(^/notes/2017/07/19/createjs) https://jelly.jd.com/article/6006b1045b6c6a01506c87ee;
+~(^/notes/2017/07/23/some-doubts-about-web-games) https://jelly.jd.com/article/6006b1045b6c6a01506c87ef;
+~(^/notes/2017/08/14/fix-sprite-anim) https://jelly.jd.com/article/6006b1045b6c6a01506c87f0;
+~(^/notes/2017/08/28/getting-started-with-threejs) https://jelly.jd.com/article/6006b1045b6c6a01506c87f2;
+~(^/notes/2017/08/29/an-introduction-to-whistle) https://jelly.jd.com/article/6006b1045b6c6a01506c87f3;
+~(^/notes/2017/09/25/h5game-snake) https://jelly.jd.com/article/6006b1045b6c6a01506c87f4;
+~(^/notes/2017/09/25/manage-setTimeout-an-setInterval) https://jelly.jd.com/article/6030a10563dc65014d6fb81d;
+~(^/notes/2017/09/28/wxapp-market) https://jelly.jd.com/article/6006b1045b6c6a01506c87f6;
+~(^/notes/2017/10/13/make-a-chain-class) https://jelly.jd.com/article/6006b1045b6c6a01506c87f7;
+~(^/notes/2017/10/18/landscape_mode_in_html5_game) https://jelly.jd.com/article/6006b1045b6c6a01506c87f8;
+~(^/notes/2017/11/02/onestroke) https://jelly.jd.com/article/6006b1045b6c6a01506c87f9;
+~(^/notes/2017/11/16/basketball) https://jelly.jd.com/article/6006b1055b6c6a01506c87fc;
+~(^/notes/2017/11/28/h5_game_jumping) https://jelly.jd.com/article/6006b1055b6c6a01506c87fe;
+~(^/notes/2017/12/15/graphql-use) https://jelly.jd.com/article/6006b1055b6c6a01506c87ff;
+~(^/notes/2017/12/27/h5-game-engine-recommend) https://jelly.jd.com/article/6006b1055b6c6a01506c8800;
+~(^/notes/2018/01/11/waveaverage) https://jelly.jd.com/article/6006b1055b6c6a01506c8803;
+~(^/notes/2018/01/17/popstar) https://jelly.jd.com/article/6006b1055b6c6a01506c8804;
+~(^/notes/2018/01/28/galaxian) https://jelly.jd.com/article/6006b1055b6c6a01506c8805;
+~(^/notes/2018/03/06/ae2web) https://jelly.jd.com/article/6006b1055b6c6a01506c8806;
+~(^/notes/2018/06/25/the-birth-of-taro) https://jelly.jd.com/article/6006b1055b6c6a01506c880b;
+~(^/notes/2018/09/18/taro-1-0-0) https://jelly.jd.com/article/6006b1055b6c6a01506c880e;
+~(^/notes/2018/11/05/taro-1-1) https://jelly.jd.com/article/6006b1055b6c6a01506c8811;
+~(^/notes/2019/02/25/taro-ui-2.0) https://jelly.jd.com/article/6030a3e363dc65014d6fb830;
+~(^/notes/2019/03/12/mini-program-framework-full-review) https://jelly.jd.com/article/6006b1055b6c6a01506c8818;
+~(^/notes/2019/07/01/taro-ext-action) https://jelly.jd.com/article/6006b1055b6c6a01506c881b;
+~(^/notes/2019/10/31/sketch-plugin) https://jelly.jd.com/article/5dbbe282b73b47015299a001;
+~(^/notes/2019/12/04/6-Rules-of-Thumb-for-MongoDB-Schema-Design) https://jelly.jd.com/article/6006b1055b6c6a01506c8826;
+~(^/notes/2020/05/18/koa-demo) https://jelly.jd.com/article/6006b1055b6c6a01506c8835;
+~(^/notes/2020/08/18/design-tokens) https://jelly.jd.com/article/6006b1055b6c6a01506c8845;
+~(^/notes/2021/01/14/exa-server) https://jelly.jd.com/article/5fffb946d0ab640145e75e95;
\ No newline at end of file
diff --git a/config/nginx.conf b/config/nginx.conf
new file mode 100644
index 0000000000..ad8419572d
--- /dev/null
+++ b/config/nginx.conf
@@ -0,0 +1,37 @@
+# nginx -c `pwd`/config/nginx.conf -p `pwd`
+
+worker_processes 1;
+
+error_log ./config/error.log;
+pid ./config/nginx.pid;
+
+events {
+ worker_connections 1024;
+}
+
+
+http {
+ include /usr/local/etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ map_hash_max_size 1024;
+ map_hash_bucket_size 256;
+ map $uri $new {
+ include ./jelly.map;
+ }
+
+ server {
+ listen 8081;
+
+ root ./dist;
+ index index.html index.htm;
+
+ location /notes {
+ if ($new) {
+ return 301 $new;
+ }
+ }
+
+ try_files $uri $uri/ /index.html;
+ }
+}
diff --git a/craco.config.js b/craco.config.js
new file mode 100644
index 0000000000..0722d07501
--- /dev/null
+++ b/craco.config.js
@@ -0,0 +1,36 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
+const path = require('path');
+
+const appName = 'o2-website';
+if (process.env.REACT_APP_RELEASE_ENV === 'uat') {
+ process.env.PUBLIC_URL = `/${appName}/`;
+}
+
+module.exports = {
+ webpack: {
+ alias: {
+ '@': path.join(__dirname, './src'),
+ },
+ configure: (webpackConfig, { env, paths }) => {
+ if (process.env.REACT_APP_RELEASE_ENV === 'uat') {
+ webpackConfig.output.publicPath = `/${appName}/`;
+ }
+
+ const dist = path.resolve(__dirname, './dist');
+ webpackConfig.output.path = dist;
+ paths.appBuild = dist;
+
+ if (process.env.NODE_ENV === 'production') {
+ const sassModuleRule = webpackConfig.module.rules[1]?.oneOf?.find(i => /\.module\\\.\(scss\|sass\)/.test(i?.test?.toString()));
+ const cssLoaderInSassModuleRule = sassModuleRule?.use?.find(i => /\/css-loader\//.test(i?.loader));
+ if (cssLoaderInSassModuleRule && cssLoaderInSassModuleRule.options && cssLoaderInSassModuleRule.options.modules) {
+ cssLoaderInSassModuleRule.options.modules = {
+ localIdentName: '[local]-[hash:base64:5]',
+ };
+ }
+ }
+
+ return webpackConfig;
+ },
+ },
+};
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 45e9604a04..0000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,9679 +0,0 @@
-{
- "name": "aotu.io",
- "version": "2.6.3",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.5.5",
- "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.5.5.tgz",
- "integrity": "sha1-vAeC9tafe31JUxIZaZuYj2aaj50=",
- "requires": {
- "@babel/highlight": "^7.0.0"
- }
- },
- "@babel/generator": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.7.4.tgz",
- "integrity": "sha1-22UeKEDKmqZvMn3OwdxfX6lhE2k=",
- "requires": {
- "@babel/types": "^7.7.4",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.7.4.tgz?cache=0&sync_timestamp=1574465630791&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.7.4.tgz",
- "integrity": "sha1-q24EHnE11DbY8KPsoV3ltno0Gi4=",
- "requires": {
- "@babel/helper-get-function-arity": "^7.7.4",
- "@babel/template": "^7.7.4",
- "@babel/types": "^7.7.4"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.7.4.tgz",
- "integrity": "sha1-y0Y0jS+ICOYy8KsEgXITDmNgBfA=",
- "requires": {
- "@babel/types": "^7.7.4"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.7.4.tgz",
- "integrity": "sha1-Vykq9gRDxKNiLPdAQN3Cjmgzb9g=",
- "requires": {
- "@babel/types": "^7.7.4"
- }
- },
- "@babel/highlight": {
- "version": "7.5.0",
- "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.5.0.tgz?cache=0&sync_timestamp=1562245140883&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.5.0.tgz",
- "integrity": "sha1-VtETEr2SSPphlZHQJHK+boyzJUA=",
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.7.4.tgz",
- "integrity": "sha1-dastcRDCzy+pSZWa+wX6NG0iMbs="
- },
- "@babel/runtime": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz",
- "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/template": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.7.4.tgz?cache=0&sync_timestamp=1574465630781&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.7.4.tgz",
- "integrity": "sha1-Qop9nuz/4n3qwKmOI7+ONnXSp3s=",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.7.4",
- "@babel/types": "^7.7.4"
- }
- },
- "@babel/traverse": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.7.4.tgz?cache=0&sync_timestamp=1574465640801&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.7.4.tgz",
- "integrity": "sha1-nB58YPtnn+T8+qQlAIMzM8IFhVg=",
- "requires": {
- "@babel/code-frame": "^7.5.5",
- "@babel/generator": "^7.7.4",
- "@babel/helper-function-name": "^7.7.4",
- "@babel/helper-split-export-declaration": "^7.7.4",
- "@babel/parser": "^7.7.4",
- "@babel/types": "^7.7.4",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
- "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
- "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
- }
- }
- },
- "@babel/types": {
- "version": "7.7.4",
- "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.7.4.tgz?cache=0&sync_timestamp=1574465636802&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.7.4.tgz",
- "integrity": "sha1-UWVw1TnkTd8wjAdWnCWP+U/ekZM=",
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@jimp/bmp": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.9.5.tgz",
- "integrity": "sha512-2cYdgXaNykuPe9sjm11Jihp5VomyWTWziIuDDB7xnxQtEz2HUR0bjXm2MJJOfU0TL52H+LS2JIKtAxcLPzp28w==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "bmp-js": "^0.1.0",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/core": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.9.5.tgz",
- "integrity": "sha512-P1mlB9UOeI3IAQ4lGTmRBGw+F/mHWXd3tSyBskjL4E3YJ1eNK7WRrErUj/vUOvSBIryotu7nGo8vv8Q8JZ7/8w==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "any-base": "^1.1.0",
- "buffer": "^5.2.0",
- "core-js": "^3.4.1",
- "exif-parser": "^0.1.12",
- "file-type": "^9.0.0",
- "load-bmfont": "^1.3.1",
- "mkdirp": "0.5.1",
- "phin": "^2.9.1",
- "pixelmatch": "^4.0.2",
- "tinycolor2": "^1.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/custom": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.9.5.tgz",
- "integrity": "sha512-FaR7M0oxqbd7ujBL5ryyllS+mEuMKbKaDsdb8Cpu9SAo80DBiasUrYFFD/45/aRa95aM5o8t4C4Pna2bx8t3Tg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/core": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/gif": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.9.5.tgz",
- "integrity": "sha512-QxjLl15nIz/QTeNgLFUJIOMLIceMO2B/xLUWF1/WqaP7Su6SGasRS6JY8OZ9QnqJLMWkodoEJmL6DxwtoOtqdg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1",
- "omggif": "^1.0.9"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/jpeg": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.9.5.tgz",
- "integrity": "sha512-cBpXqmeegsLzf/mYk1WpYov2RH1W944re5P61/ag6AMWEMQ51BoBdgBy5JABZIELg2GQxpoG+g/KxUshRzeIAg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1",
- "jpeg-js": "^0.3.4"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-blit": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.9.5.tgz",
- "integrity": "sha512-VmV99HeCPOyliY/uEGOaKO9EcqDxSBzKDGC7emNCLFzlbK4uty4/cYMKGKTBiZR9AS1rEd63LxrDtbHKR8CsqQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-blur": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.9.5.tgz",
- "integrity": "sha512-FnAEhMW9ZK8D6qCLDeMAloi4h7TCch9ZWFdonj49gwllpvLksBpnL9PTft4dFXCwZgOAq2apYwW7cwTAIfAw4A==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-color": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.9.5.tgz",
- "integrity": "sha512-2aFE0tRdhAKCCgh+tFLsLPOSgrk3ttl2TtTP5FAXeKmzlLj7FZ/JKj0waaGWZKdJ+uDxsVpX3EhuK3CfukIyrg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1",
- "tinycolor2": "^1.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-contain": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.9.5.tgz",
- "integrity": "sha512-zhaCJnUqd8hhD8IXxbRALU6ZzCWWbQDulc8Tn8Hxnub0si7dlq/DxBQT7og6kCxswBj2zPBtRAHONEwLdt7Nfw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-cover": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.9.5.tgz",
- "integrity": "sha512-rG7vtx7vV9mHCFR4YP9GzGEsaop0IkMidP3UFPULbDcBdEEkehEG7a0h2X4w/Nt07J3k8wVoXYTjrb/CXpWkaw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-crop": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.9.5.tgz",
- "integrity": "sha512-yoScC43YhYlswTKyL4fmawGwF73HyuIRpp1R3mXa6qbMA9mjX9QiqNdAIMB3UMHeBcIgkOD/Zy1f90/skBMpxg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-displace": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.9.5.tgz",
- "integrity": "sha512-nwfB72qNP8kNyBnlaY0vgJys7RUjvI61Qp3AMMbKKaRSsthCx7aeKU9Cyv+AHMfcVkkt3NdTmh7ScE+hkNFUhA==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-dither": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.9.5.tgz",
- "integrity": "sha512-Pp1ehm5Hon6LcttRG+d+x1UN1ww00P4cyBnMVRR3NMhIfgc0IjQgojik9ZXax3nVj7XkqXJJh8f5uxC1cvYUnA==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-flip": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.9.5.tgz",
- "integrity": "sha512-rKbg8c9ePst3w2t1kxQt2H05/rUR5/pjjafhZ97s01pxH/SOJudy5d76nJGzRBYoaRnxpvDzpN+2+iA08wDY5Q==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-gaussian": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.9.5.tgz",
- "integrity": "sha512-8HloHpVPgSsoWekslJ5uUPK2ddoLrGXQAVOyo3BT2pVgwbL317+r96NxPGKTxrY20fqex9SQrjx3kHeSWbysEA==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-invert": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.9.5.tgz",
- "integrity": "sha512-tqfMqQqsU4ulaif0Kk/BydqmG5UbjT67dmMjwnDL7rke+ypJ8tzq7j9QeZ9SDFB+PxUQcy/kPEw/R2Ys7HHi8A==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-mask": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.9.5.tgz",
- "integrity": "sha512-lIOrKb/VT1laDIA1H1nPOdtOB4TVhMRlxanXoEP8uKdE6a2goqZHXbKLn9itkm0MxtsTlT9KIXwzGxjCV38B3w==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-normalize": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.9.5.tgz",
- "integrity": "sha512-gayxgPLDp2gynu2IacvdCtqw0bdcC2feUqYOBjTtCpAwIz1KP2Qd6qKjV1dAVGiLO9ESW5maMa0vIBiBkYOovg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-print": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.9.5.tgz",
- "integrity": "sha512-/BUSyCfvVhuFdf+rBdH1wbuY8r9J0qhn4Icy7HqO58By7I+V7q7jayoeiLk+zEBsAXpCUbWiZG3KWNtZhLWeQg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1",
- "load-bmfont": "^1.4.0"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-resize": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.9.5.tgz",
- "integrity": "sha512-vIMleLPbEv0qTE1Mnc7mg5HSFc4l4FxlbDniVUvpi8ZMFa8IkigcTeAgXUKacevNL7uZ66MrnpQ49J3tNE28dQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-rotate": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.9.5.tgz",
- "integrity": "sha512-BHlhwUruHNQkOpsfzTE2uuSfmkj5eiIDRSAC8whupUGGXNgS67tZJB6u0qDRIeSP/gWV5tGGwXQNMn3AahwR1Q==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugin-scale": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.9.5.tgz",
- "integrity": "sha512-PDU8F77EPFTcLBVDcJtGUvPXA2acG4KqJMZauHwZLZxuiDEvt9qsDQm4aTKcN/ku8oWZjfGBSOamhx/QNUqV5Q==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/plugins": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.9.5.tgz",
- "integrity": "sha512-3hvuXeRLj36ifpwE7I7g5Da9bKl/0y62t90ZN0hdQwhLBjRRF4u1e1JZpyu6EK98Bp+W/c8fJ2iuOsHadJOusg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/plugin-blit": "^0.9.5",
- "@jimp/plugin-blur": "^0.9.5",
- "@jimp/plugin-color": "^0.9.5",
- "@jimp/plugin-contain": "^0.9.5",
- "@jimp/plugin-cover": "^0.9.5",
- "@jimp/plugin-crop": "^0.9.5",
- "@jimp/plugin-displace": "^0.9.5",
- "@jimp/plugin-dither": "^0.9.5",
- "@jimp/plugin-flip": "^0.9.5",
- "@jimp/plugin-gaussian": "^0.9.5",
- "@jimp/plugin-invert": "^0.9.5",
- "@jimp/plugin-mask": "^0.9.5",
- "@jimp/plugin-normalize": "^0.9.5",
- "@jimp/plugin-print": "^0.9.5",
- "@jimp/plugin-resize": "^0.9.5",
- "@jimp/plugin-rotate": "^0.9.5",
- "@jimp/plugin-scale": "^0.9.5",
- "core-js": "^3.4.1",
- "timm": "^1.6.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/png": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.9.5.tgz",
- "integrity": "sha512-0GPq/XixXcuWIA3gpMCUUj6rhxT78Hu9oDC9reaHUCcC/5cRTd5Eh7wLafZL8EfOZWV3mh2FZtWiY1xaNHHlBQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.9.5",
- "core-js": "^3.4.1",
- "pngjs": "^3.3.3"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/tiff": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.9.5.tgz",
- "integrity": "sha512-EcRtiHsAQ9aygRRMWhGTVfitfHwllgt93GE1L8d/iwSlu3e3IIV38MDINdluQUQMU5jcFBcX6eyVVvsgCleGiQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "core-js": "^3.4.1",
- "utif": "^2.0.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/types": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.9.5.tgz",
- "integrity": "sha512-62inaxx8zy24WMP+bsg6ZmgsL49oyoGUIGcjDKzvyAY/O6opD+UMNlArhl0xvCCdzriQxbljtSv/8uyHxz4Xbw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/bmp": "^0.9.5",
- "@jimp/gif": "^0.9.5",
- "@jimp/jpeg": "^0.9.5",
- "@jimp/png": "^0.9.5",
- "@jimp/tiff": "^0.9.5",
- "core-js": "^3.4.1",
- "timm": "^1.6.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@jimp/utils": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.9.5.tgz",
- "integrity": "sha512-W9vse4/1AYmOjtIVACoBMdc/2te1zcPURhMYNEyiezCU7hWMdj/Z1mwiWFq3AYCgOG8GPVx0ZQzrgqUfUxfTHQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "core-js": "^3.4.1"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "@mrmlnc/readdir-enhanced": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
- "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
- "requires": {
- "call-me-maybe": "^1.0.1",
- "glob-to-regexp": "^0.3.0"
- }
- },
- "@nodelib/fs.stat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
- },
- "@sindresorhus/is": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
- "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow=="
- },
- "@types/q": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
- "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw=="
- },
- "JSONStream": {
- "version": "1.3.5",
- "resolved": "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz",
- "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=",
- "requires": {
- "jsonparse": "^1.2.0",
- "through": ">=2.2.7 <3"
- }
- },
- "a-sync-waterfall": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/a-sync-waterfall/download/a-sync-waterfall-1.0.1.tgz",
- "integrity": "sha1-dba2qnJZi0l6El56J3DxT0yKH6c="
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz",
- "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg="
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz",
- "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "acorn": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
- "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA=="
- },
- "acorn-jsx": {
- "version": "5.1.0",
- "resolved": "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.1.0.tgz?cache=0&sync_timestamp=1570991888898&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn-jsx%2Fdownload%2Facorn-jsx-5.1.0.tgz",
- "integrity": "sha1-KUrbcbVzmLBoABXwo4xWPuHbU4Q=",
- "dev": true
- },
- "after": {
- "version": "0.8.2",
- "resolved": "https://registry.npm.taobao.org/after/download/after-0.8.2.tgz",
- "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
- "optional": true
- },
- "ajv": {
- "version": "6.10.2",
- "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.10.2.tgz?cache=0&sync_timestamp=1563141444360&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.10.2.tgz",
- "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=",
- "requires": {
- "fast-deep-equal": "^2.0.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "requires": {
- "kind-of": "^3.0.2",
- "longest": "^1.0.1",
- "repeat-string": "^1.5.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
- },
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz",
- "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=",
- "dev": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1570188663907&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1573557628456&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz",
- "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "any-base": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
- "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="
- },
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz",
- "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- },
- "dependencies": {
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- }
- }
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "arch": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
- "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg=="
- },
- "archive-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
- "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
- "requires": {
- "file-type": "^4.2.0"
- },
- "dependencies": {
- "file-type": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
- "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU="
- }
- }
- },
- "archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farchy%2Fdownload%2Farchy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz",
- "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
- "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE="
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
- },
- "array-find-index": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
- },
- "arraybuffer.slice": {
- "version": "0.0.7",
- "resolved": "https://registry.npm.taobao.org/arraybuffer.slice/download/arraybuffer.slice-0.0.7.tgz",
- "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU=",
- "optional": true
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz",
- "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=",
- "dev": true
- },
- "async": {
- "version": "0.2.10",
- "resolved": "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz",
- "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
- },
- "async-each": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz",
- "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8="
- },
- "async-each-series": {
- "version": "0.1.1",
- "resolved": "https://registry.npm.taobao.org/async-each-series/download/async-each-series-0.1.1.tgz",
- "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=",
- "optional": true
- },
- "async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-limiter%2Fdownload%2Fasync-limiter-1.0.1.tgz",
- "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=",
- "optional": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz",
- "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k="
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
- },
- "aws4": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
- "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
- },
- "axios": {
- "version": "0.19.0",
- "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.19.0.tgz",
- "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=",
- "optional": true,
- "requires": {
- "follow-redirects": "1.5.10",
- "is-buffer": "^2.0.2"
- },
- "dependencies": {
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.4.tgz",
- "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=",
- "optional": true
- }
- }
- },
- "babel-eslint": {
- "version": "10.0.3",
- "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.0.3.tgz?cache=0&sync_timestamp=1574508319180&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-eslint%2Fdownload%2Fbabel-eslint-10.0.3.tgz",
- "integrity": "sha1-gaLGab4PIF4ZRi/tJILTPkaHqIo=",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.0.0",
- "@babel/traverse": "^7.0.0",
- "@babel/types": "^7.0.0",
- "eslint-visitor-keys": "^1.0.0",
- "resolve": "^1.12.0"
- }
- },
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/backo2/download/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
- "optional": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz",
- "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
- "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "base64-arraybuffer": {
- "version": "0.1.5",
- "resolved": "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz",
- "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
- "optional": true
- },
- "base64-js": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
- "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
- },
- "base64id": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/base64id/download/base64id-1.0.0.tgz",
- "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
- "optional": true
- },
- "basic-auth": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/basic-auth/download/basic-auth-2.0.1.tgz",
- "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=",
- "requires": {
- "safe-buffer": "5.1.2"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
- "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
- }
- }
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "optional": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "better-assert": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/better-assert/download/better-assert-1.0.2.tgz",
- "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
- "optional": true,
- "requires": {
- "callsite": "1.0.0"
- }
- },
- "bignumber.js": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz",
- "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg="
- },
- "bin-build": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz",
- "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==",
- "requires": {
- "decompress": "^4.0.0",
- "download": "^6.2.2",
- "execa": "^0.7.0",
- "p-map-series": "^1.0.0",
- "tempfile": "^2.0.0"
- }
- },
- "bin-check": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz",
- "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==",
- "requires": {
- "execa": "^0.7.0",
- "executable": "^4.1.0"
- }
- },
- "bin-version": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz",
- "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==",
- "requires": {
- "execa": "^1.0.0",
- "find-versions": "^3.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "requires": {
- "pump": "^3.0.0"
- }
- }
- }
- },
- "bin-version-check": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz",
- "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==",
- "requires": {
- "bin-version": "^3.0.0",
- "semver": "^5.6.0",
- "semver-truncate": "^1.1.2"
- }
- },
- "bin-wrapper": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz",
- "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==",
- "requires": {
- "bin-check": "^4.1.0",
- "bin-version-check": "^4.0.0",
- "download": "^7.1.0",
- "import-lazy": "^3.1.0",
- "os-filter-obj": "^2.0.0",
- "pify": "^4.0.1"
- },
- "dependencies": {
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "download": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz",
- "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==",
- "requires": {
- "archive-type": "^4.0.0",
- "caw": "^2.0.1",
- "content-disposition": "^0.5.2",
- "decompress": "^4.2.0",
- "ext-name": "^5.0.0",
- "file-type": "^8.1.0",
- "filenamify": "^2.0.0",
- "get-stream": "^3.0.0",
- "got": "^8.3.1",
- "make-dir": "^1.2.0",
- "p-event": "^2.1.0",
- "pify": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "file-type": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz",
- "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ=="
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "got": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
- "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
- "requires": {
- "@sindresorhus/is": "^0.7.0",
- "cacheable-request": "^2.1.1",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "into-stream": "^3.1.0",
- "is-retry-allowed": "^1.1.0",
- "isurl": "^1.0.0-alpha5",
- "lowercase-keys": "^1.0.0",
- "mimic-response": "^1.0.0",
- "p-cancelable": "^0.4.0",
- "p-timeout": "^2.0.1",
- "pify": "^3.0.0",
- "safe-buffer": "^5.1.1",
- "timed-out": "^4.0.1",
- "url-parse-lax": "^3.0.0",
- "url-to-options": "^1.0.1"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- },
- "p-cancelable": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
- "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ=="
- },
- "p-event": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
- "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
- "requires": {
- "p-timeout": "^2.0.1"
- }
- },
- "p-timeout": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
- "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
- "requires": {
- "p-finally": "^1.0.0"
- }
- },
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
- },
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
- },
- "url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "requires": {
- "prepend-http": "^2.0.0"
- }
- }
- }
- },
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz",
- "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U="
- },
- "bl": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.1.tgz",
- "integrity": "sha512-FL/TdvchukRCuWVxT0YMO/7+L5TNeNrVFvRU2IY63aUyv9mpt8splf2NEr6qXtPo5fya5a66YohQKvGNmLrWNA==",
- "requires": {
- "readable-stream": "^3.4.0"
- }
- },
- "blob": {
- "version": "0.0.5",
- "resolved": "https://registry.npm.taobao.org/blob/download/blob-0.0.5.tgz",
- "integrity": "sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM=",
- "optional": true
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz",
- "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28="
- },
- "bmp-js": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
- "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM="
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz",
- "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz",
- "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "browser-fingerprint": {
- "version": "0.0.1",
- "resolved": "https://registry.npm.taobao.org/browser-fingerprint/download/browser-fingerprint-0.0.1.tgz",
- "integrity": "sha1-jfPNyiW/fVs1QtYVRdcwBT/OYEo="
- },
- "browser-sync": {
- "version": "2.26.7",
- "resolved": "https://registry.npm.taobao.org/browser-sync/download/browser-sync-2.26.7.tgz",
- "integrity": "sha1-EgKHcW60BWUadsx0/oUcMTUFV/k=",
- "optional": true,
- "requires": {
- "browser-sync-client": "^2.26.6",
- "browser-sync-ui": "^2.26.4",
- "bs-recipes": "1.3.4",
- "bs-snippet-injector": "^2.0.1",
- "chokidar": "^2.0.4",
- "connect": "3.6.6",
- "connect-history-api-fallback": "^1",
- "dev-ip": "^1.0.1",
- "easy-extender": "^2.3.4",
- "eazy-logger": "^3",
- "etag": "^1.8.1",
- "fresh": "^0.5.2",
- "fs-extra": "3.0.1",
- "http-proxy": "1.15.2",
- "immutable": "^3",
- "localtunnel": "1.9.2",
- "micromatch": "^3.1.10",
- "opn": "5.3.0",
- "portscanner": "2.1.1",
- "qs": "6.2.3",
- "raw-body": "^2.3.2",
- "resp-modifier": "6.0.2",
- "rx": "4.1.0",
- "send": "0.16.2",
- "serve-index": "1.9.1",
- "serve-static": "1.13.2",
- "server-destroy": "1.0.1",
- "socket.io": "2.1.1",
- "ua-parser-js": "0.7.17",
- "yargs": "6.4.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "optional": true
- },
- "fs-extra": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-3.0.1.tgz",
- "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
- "optional": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^3.0.0",
- "universalify": "^0.1.0"
- }
- },
- "jsonfile": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-3.0.1.tgz",
- "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
- "optional": true,
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "window-size": {
- "version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.2.0.tgz",
- "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=",
- "optional": true
- },
- "yargs": {
- "version": "6.4.0",
- "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-6.4.0.tgz",
- "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=",
- "optional": true,
- "requires": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "window-size": "^0.2.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^4.1.0"
- }
- }
- }
- },
- "browser-sync-client": {
- "version": "2.26.6",
- "resolved": "https://registry.npm.taobao.org/browser-sync-client/download/browser-sync-client-2.26.6.tgz",
- "integrity": "sha1-5SAdOs6K7oivF2VrewwGILb45Ks=",
- "optional": true,
- "requires": {
- "etag": "1.8.1",
- "fresh": "0.5.2",
- "mitt": "^1.1.3",
- "rxjs": "^5.5.6"
- }
- },
- "browser-sync-ui": {
- "version": "2.26.4",
- "resolved": "https://registry.npm.taobao.org/browser-sync-ui/download/browser-sync-ui-2.26.4.tgz",
- "integrity": "sha1-N3LxPGuT8tfTM/S+DKHsAqrpfbo=",
- "optional": true,
- "requires": {
- "async-each-series": "0.1.1",
- "connect-history-api-fallback": "^1",
- "immutable": "^3",
- "server-destroy": "1.0.1",
- "socket.io-client": "^2.0.4",
- "stream-throttle": "^0.1.3"
- }
- },
- "bs-recipes": {
- "version": "1.3.4",
- "resolved": "https://registry.npm.taobao.org/bs-recipes/download/bs-recipes-1.3.4.tgz",
- "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=",
- "optional": true
- },
- "bs-snippet-injector": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/bs-snippet-injector/download/bs-snippet-injector-2.0.1.tgz",
- "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=",
- "optional": true
- },
- "buffer": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz",
- "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==",
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- },
- "buffer-alloc": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
- "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
- "requires": {
- "buffer-alloc-unsafe": "^1.1.0",
- "buffer-fill": "^1.0.0"
- }
- },
- "buffer-alloc-unsafe": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
- "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
- },
- "buffer-equal": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
- "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs="
- },
- "buffer-fill": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
- "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
- },
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz",
- "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=",
- "optional": true
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz",
- "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
- "requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- }
- },
- "cacheable-request": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
- "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
- "requires": {
- "clone-response": "1.0.2",
- "get-stream": "3.0.0",
- "http-cache-semantics": "3.8.1",
- "keyv": "3.0.0",
- "lowercase-keys": "1.0.0",
- "normalize-url": "2.0.1",
- "responselike": "1.0.2"
- },
- "dependencies": {
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "lowercase-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
- "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
- }
- }
- },
- "call-me-maybe": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
- "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
- },
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/callsite/download/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
- "optional": true
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz",
- "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=",
- "dev": true
- },
- "camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz?cache=0&sync_timestamp=1575378908063&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-3.0.0.tgz",
- "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
- "requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
- }
- },
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
- },
- "camelcase-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
- "requires": {
- "camelcase": "^2.0.0",
- "map-obj": "^1.0.0"
- }
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "caw": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
- "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
- "requires": {
- "get-proxy": "^2.0.0",
- "isurl": "^1.0.0-alpha5",
- "tunnel-agent": "^0.6.0",
- "url-to-options": "^1.0.1"
- }
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "requires": {
- "align-text": "^0.1.3",
- "lazy-cache": "^1.0.3"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1573282918610&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
- "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz",
- "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=",
- "dev": true
- },
- "cheerio": {
- "version": "0.22.0",
- "resolved": "https://registry.npm.taobao.org/cheerio/download/cheerio-0.22.0.tgz",
- "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
- "requires": {
- "css-select": "~1.2.0",
- "dom-serializer": "~0.1.0",
- "entities": "~1.1.1",
- "htmlparser2": "^3.9.1",
- "lodash.assignin": "^4.0.9",
- "lodash.bind": "^4.1.4",
- "lodash.defaults": "^4.0.1",
- "lodash.filter": "^4.4.0",
- "lodash.flatten": "^4.2.0",
- "lodash.foreach": "^4.3.0",
- "lodash.map": "^4.4.0",
- "lodash.merge": "^4.4.0",
- "lodash.pick": "^4.2.1",
- "lodash.reduce": "^4.4.0",
- "lodash.reject": "^4.4.0",
- "lodash.some": "^4.4.0"
- }
- },
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz",
- "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=",
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz",
- "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "clean-css": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
- "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
- "requires": {
- "source-map": "~0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "dev": true,
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
- "dev": true
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz?cache=0&sync_timestamp=1573943292170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
- },
- "clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
- },
- "clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "requires": {
- "mimic-response": "^1.0.0"
- },
- "dependencies": {
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- }
- }
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
- },
- "cloneable-readable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
- "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
- "requires": {
- "inherits": "^2.0.1",
- "process-nextick-args": "^2.0.0",
- "readable-stream": "^2.3.5"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "requires": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
- "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
- "requires": {
- "color-convert": "^1.9.1",
- "color-string": "^1.5.2"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz?cache=0&sync_timestamp=1566248870121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolor-convert%2Fdownload%2Fcolor-convert-1.9.3.tgz",
- "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "color-string": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
- "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
- "requires": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "command-exists": {
- "version": "1.2.8",
- "resolved": "https://registry.npm.taobao.org/command-exists/download/command-exists-1.2.8.tgz",
- "integrity": "sha1-cVrO/dEiO5ybNxEKFJxjksKFIpE="
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1573464028535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz",
- "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM="
- },
- "component-bind": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz",
- "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
- "optional": true
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz",
- "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A="
- },
- "component-inherit": {
- "version": "0.0.3",
- "resolved": "https://registry.npm.taobao.org/component-inherit/download/component-inherit-0.0.3.tgz",
- "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
- "optional": true
- },
- "compressible": {
- "version": "2.0.17",
- "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.17.tgz",
- "integrity": "sha1-bowQihatWDhKl386SCyiC/8vOME=",
- "requires": {
- "mime-db": ">= 1.40.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz",
- "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=",
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
- "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "config-chain": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
- "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
- "requires": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
- },
- "connect": {
- "version": "3.6.6",
- "resolved": "https://registry.npm.taobao.org/connect/download/connect-3.6.6.tgz",
- "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
- "requires": {
- "debug": "2.6.9",
- "finalhandler": "1.1.0",
- "parseurl": "~1.3.2",
- "utils-merge": "1.0.1"
- }
- },
- "connect-history-api-fallback": {
- "version": "1.6.0",
- "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=",
- "optional": true
- },
- "connect-injector": {
- "version": "0.4.4",
- "resolved": "https://registry.npm.taobao.org/connect-injector/download/connect-injector-0.4.4.tgz",
- "integrity": "sha1-qBlZwx7PXKoPPcwyXCjtkLgwqpA=",
- "optional": true,
- "requires": {
- "debug": "^2.0.0",
- "q": "^1.0.1",
- "stream-buffers": "^0.2.3",
- "uberproto": "^1.1.0"
- }
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
- },
- "console-stream": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz",
- "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ="
- },
- "content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
- "requires": {
- "safe-buffer": "5.1.2"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- }
- }
- },
- "cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
- "optional": true
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
- },
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-1.2.7.tgz?cache=0&sync_timestamp=1575309477270&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "cross-spawn": {
- "version": "4.0.2",
- "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-4.0.2.tgz",
- "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
- "requires": {
- "lru-cache": "^4.0.1",
- "which": "^1.2.9"
- }
- },
- "css": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
- "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
- "requires": {
- "inherits": "^2.0.3",
- "source-map": "^0.6.1",
- "source-map-resolve": "^0.5.2",
- "urix": "^0.1.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "css-parse": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
- "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs="
- },
- "css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz?cache=0&sync_timestamp=1573341911322&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-select%2Fdownload%2Fcss-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
- "requires": {
- "boolbase": "~1.0.0",
- "css-what": "2.1",
- "domutils": "1.5.1",
- "nth-check": "~1.0.1"
- }
- },
- "css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
- },
- "css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "requires": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "css-what": {
- "version": "2.1.3",
- "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz",
- "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI="
- },
- "csso": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz",
- "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==",
- "requires": {
- "css-tree": "1.0.0-alpha.37"
- }
- },
- "cuid": {
- "version": "1.3.8",
- "resolved": "https://registry.npm.taobao.org/cuid/download/cuid-1.3.8.tgz",
- "integrity": "sha1-S4deCWm612T37AcGz0T1+wgx9rc=",
- "requires": {
- "browser-fingerprint": "0.0.1",
- "core-js": "^1.1.1",
- "node-fingerprint": "0.0.2"
- }
- },
- "currently-unhandled": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
- "requires": {
- "array-find-index": "^1.0.1"
- }
- },
- "cwebp-bin": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cwebp-bin/-/cwebp-bin-5.1.0.tgz",
- "integrity": "sha512-BsPKStaNr98zfxwejWWLIGELbPERULJoD2v5ijvpeutSAGsegX7gmABgnkRK7MUucCPROXXfaPqkLAwI509JzA==",
- "requires": {
- "bin-build": "^3.0.0",
- "bin-wrapper": "^4.0.1",
- "logalot": "^2.1.0"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz",
- "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
- },
- "decompress": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz",
- "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=",
- "requires": {
- "decompress-tar": "^4.0.0",
- "decompress-tarbz2": "^4.0.0",
- "decompress-targz": "^4.0.0",
- "decompress-unzip": "^4.0.1",
- "graceful-fs": "^4.1.10",
- "make-dir": "^1.0.0",
- "pify": "^2.3.0",
- "strip-dirs": "^2.0.0"
- }
- },
- "decompress-response": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
- "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
- "requires": {
- "mimic-response": "^2.0.0"
- }
- },
- "decompress-tar": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
- "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
- "requires": {
- "file-type": "^5.2.0",
- "is-stream": "^1.1.0",
- "tar-stream": "^1.5.2"
- },
- "dependencies": {
- "bl": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
- "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
- "requires": {
- "readable-stream": "^2.3.5",
- "safe-buffer": "^5.1.1"
- }
- },
- "file-type": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
- "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- }
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- }
- }
- },
- "tar-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
- "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
- "requires": {
- "bl": "^1.0.0",
- "buffer-alloc": "^1.2.0",
- "end-of-stream": "^1.0.0",
- "fs-constants": "^1.0.0",
- "readable-stream": "^2.3.0",
- "to-buffer": "^1.1.1",
- "xtend": "^4.0.0"
- }
- }
- }
- },
- "decompress-tarbz2": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
- "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
- "requires": {
- "decompress-tar": "^4.1.0",
- "file-type": "^6.1.0",
- "is-stream": "^1.1.0",
- "seek-bzip": "^1.0.5",
- "unbzip2-stream": "^1.0.9"
- },
- "dependencies": {
- "file-type": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
- "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg=="
- }
- }
- },
- "decompress-targz": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
- "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
- "requires": {
- "decompress-tar": "^4.1.1",
- "file-type": "^5.2.0",
- "is-stream": "^1.1.0"
- },
- "dependencies": {
- "file-type": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
- "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
- }
- }
- },
- "decompress-unzip": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
- "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
- "requires": {
- "file-type": "^3.8.0",
- "get-stream": "^2.2.0",
- "pify": "^2.3.0",
- "yauzl": "^2.4.2"
- },
- "dependencies": {
- "file-type": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
- "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
- }
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz",
- "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
- "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
- },
- "dev-ip": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/dev-ip/download/dev-ip-1.0.1.tgz",
- "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=",
- "optional": true
- },
- "dir-glob": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
- "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
- "requires": {
- "arrify": "^1.0.1",
- "path-type": "^3.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz",
- "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dom-serializer": {
- "version": "0.1.1",
- "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.1.tgz?cache=0&sync_timestamp=1573447907918&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.1.1.tgz",
- "integrity": "sha1-HsQFnihLq+027sKUHUqXChic58A=",
- "requires": {
- "domelementtype": "^1.3.0",
- "entities": "^1.1.1"
- }
- },
- "dom-walk": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz",
- "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg="
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz",
- "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8="
- },
- "domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz",
- "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=",
- "requires": {
- "domelementtype": "1"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "download": {
- "version": "6.2.5",
- "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz",
- "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==",
- "requires": {
- "caw": "^2.0.0",
- "content-disposition": "^0.5.2",
- "decompress": "^4.0.0",
- "ext-name": "^5.0.0",
- "file-type": "5.2.0",
- "filenamify": "^2.0.0",
- "get-stream": "^3.0.0",
- "got": "^7.0.0",
- "make-dir": "^1.0.0",
- "p-event": "^1.0.0",
- "pify": "^3.0.0"
- },
- "dependencies": {
- "file-type": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
- "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
- },
- "easy-extender": {
- "version": "2.3.4",
- "resolved": "https://registry.npm.taobao.org/easy-extender/download/easy-extender-2.3.4.tgz",
- "integrity": "sha1-KYeJtk+aq6Yhacd6KztktMlYm48=",
- "optional": true,
- "requires": {
- "lodash": "^4.17.10"
- }
- },
- "eazy-logger": {
- "version": "3.0.2",
- "resolved": "https://registry.npm.taobao.org/eazy-logger/download/eazy-logger-3.0.2.tgz",
- "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=",
- "optional": true,
- "requires": {
- "tfunk": "^3.0.1"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "ejs": {
- "version": "2.7.4",
- "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz",
- "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo="
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz",
- "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "requires": {
- "once": "^1.4.0"
- }
- },
- "engine.io": {
- "version": "3.2.1",
- "resolved": "https://registry.npm.taobao.org/engine.io/download/engine.io-3.2.1.tgz?cache=0&sync_timestamp=1568376471382&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fengine.io%2Fdownload%2Fengine.io-3.2.1.tgz",
- "integrity": "sha1-tgKBw1SEpw7gNR6g6/+D7IyVIqI=",
- "optional": true,
- "requires": {
- "accepts": "~1.3.4",
- "base64id": "1.0.0",
- "cookie": "0.3.1",
- "debug": "~3.1.0",
- "engine.io-parser": "~2.1.0",
- "ws": "~3.3.1"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "engine.io-parser": {
- "version": "2.1.3",
- "resolved": "https://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-2.1.3.tgz?cache=0&sync_timestamp=1568365944963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fengine.io-parser%2Fdownload%2Fengine.io-parser-2.1.3.tgz",
- "integrity": "sha1-dXq5cPvy37Mse3SwMyFtVznveaY=",
- "optional": true,
- "requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "~0.0.7",
- "base64-arraybuffer": "0.1.5",
- "blob": "0.0.5",
- "has-binary2": "~1.0.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
- "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
- "optional": true
- },
- "ws": {
- "version": "3.3.3",
- "resolved": "https://registry.npm.taobao.org/ws/download/ws-3.3.3.tgz?cache=0&sync_timestamp=1571495321314&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-3.3.3.tgz",
- "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=",
- "optional": true,
- "requires": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
- }
- }
- },
- "engine.io-client": {
- "version": "3.4.0",
- "resolved": "https://registry.npm.taobao.org/engine.io-client/download/engine.io-client-3.4.0.tgz",
- "integrity": "sha1-gqZCtChiqbP3oYj0F3ay3qtkNwA=",
- "optional": true,
- "requires": {
- "component-emitter": "1.2.1",
- "component-inherit": "0.0.3",
- "debug": "~4.1.0",
- "engine.io-parser": "~2.2.0",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "ws": "~6.1.0",
- "xmlhttprequest-ssl": "~1.5.4",
- "yeast": "0.1.2"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "optional": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
- "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
- "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
- "optional": true
- }
- }
- },
- "engine.io-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-2.2.0.tgz?cache=0&sync_timestamp=1568365944963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fengine.io-parser%2Fdownload%2Fengine.io-parser-2.2.0.tgz",
- "integrity": "sha1-MSxIlPV9UqArQgho2ntcHISvgO0=",
- "optional": true,
- "requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "~0.0.7",
- "base64-arraybuffer": "0.1.5",
- "blob": "0.0.5",
- "has-binary2": "~1.0.2"
- }
- },
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1563403318326&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-1.1.2.tgz",
- "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY="
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz",
- "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es-abstract": {
- "version": "1.17.4",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
- "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "es6-promise": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
- "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "eslint": {
- "version": "5.16.0",
- "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-5.16.0.tgz",
- "integrity": "sha1-oeOsGq5KP72Clvz496tzFMu2q+o=",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "ajv": "^6.9.1",
- "chalk": "^2.1.0",
- "cross-spawn": "^6.0.5",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "eslint-scope": "^4.0.3",
- "eslint-utils": "^1.3.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^5.0.1",
- "esquery": "^1.0.1",
- "esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob": "^7.1.2",
- "globals": "^11.7.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "inquirer": "^6.2.2",
- "js-yaml": "^3.13.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.11",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
- "path-is-inside": "^1.0.2",
- "progress": "^2.0.0",
- "regexpp": "^2.0.1",
- "semver": "^5.5.1",
- "strip-ansi": "^4.0.0",
- "strip-json-comments": "^2.0.1",
- "table": "^5.2.3",
- "text-table": "^0.2.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz?cache=0&sync_timestamp=1570188663907&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz",
- "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=",
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
- "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz",
- "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz",
- "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
- "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
- "dev": true
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "eslint-config-defaults": {
- "version": "9.0.0",
- "resolved": "https://registry.npm.taobao.org/eslint-config-defaults/download/eslint-config-defaults-9.0.0.tgz",
- "integrity": "sha1-oJCtwTspNeP0OzzQSKknAWVOWtU=",
- "dev": true
- },
- "eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1563679289211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz",
- "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.4.3.tgz?cache=0&sync_timestamp=1571580716410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-utils%2Fdownload%2Feslint-utils-1.4.3.tgz",
- "integrity": "sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8=",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.1.0.tgz?cache=0&sync_timestamp=1565705511122&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.1.0.tgz",
- "integrity": "sha1-4qgs6oT/JGrW+1f5veW0ZiFFnsI="
- },
- "espree": {
- "version": "5.0.1",
- "resolved": "https://registry.npm.taobao.org/espree/download/espree-5.0.1.tgz",
- "integrity": "sha1-XWUm+k/H8HiKXPdbFfMDI+L4H3o=",
- "dev": true,
- "requires": {
- "acorn": "^6.0.7",
- "acorn-jsx": "^5.0.0",
- "eslint-visitor-keys": "^1.0.0"
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz",
- "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
- },
- "esquery": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz",
- "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=",
- "dev": true,
- "requires": {
- "estraverse": "^4.0.0"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz",
- "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
- "dev": true,
- "requires": {
- "estraverse": "^4.1.0"
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz",
- "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz",
- "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "eventemitter3": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-1.2.0.tgz",
- "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
- "optional": true
- },
- "exec-buffer": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz",
- "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==",
- "requires": {
- "execa": "^0.7.0",
- "p-finally": "^1.0.0",
- "pify": "^3.0.0",
- "rimraf": "^2.5.4",
- "tempfile": "^2.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "requires": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- }
- }
- },
- "executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "requires": {
- "pify": "^2.2.0"
- }
- },
- "exif-parser": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
- "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI="
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "requires": {
- "fill-range": "^2.1.0"
- },
- "dependencies": {
- "fill-range": {
- "version": "2.2.4",
- "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz",
- "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=",
- "requires": {
- "is-number": "^2.1.0",
- "isobject": "^2.0.0",
- "randomatic": "^3.0.0",
- "repeat-element": "^1.1.2",
- "repeat-string": "^1.5.2"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "expand-template": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
- "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="
- },
- "ext-list": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
- "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
- "requires": {
- "mime-db": "^1.28.0"
- }
- },
- "ext-name": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
- "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
- "requires": {
- "ext-list": "^2.0.0",
- "sort-keys-length": "^1.0.0"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
- "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexternal-editor%2Fdownload%2Fexternal-editor-3.1.0.tgz",
- "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=",
- "dev": true,
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz",
- "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
- "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
- },
- "fast-glob": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
- "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
- "requires": {
- "@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.1.2",
- "glob-parent": "^3.1.0",
- "is-glob": "^4.0.0",
- "merge2": "^1.2.3",
- "micromatch": "^3.1.10"
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "favicons": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/favicons/-/favicons-5.5.0.tgz",
- "integrity": "sha512-xZ4B+fZDuq2y999iorrYq4KuBT3OIZHU+CVfjOWQbjOC1OiU0xbf6pp4Ju/yAfJn7W74RVrC3Cv0oqR5CLvviw==",
- "requires": {
- "clone": "^2.1.2",
- "colors": "^1.4.0",
- "core-js": "^3.4.5",
- "image-size": "^0.8.3",
- "jimp": "^0.9.3",
- "jsontoxml": "^1.0.1",
- "lodash.defaultsdeep": "^4.6.1",
- "require-directory": "^2.1.1",
- "sharp": "^0.23.3",
- "through2": "^3.0.1",
- "tinycolor2": "^1.4.1",
- "to-ico": "^1.1.5",
- "vinyl": "^2.2.0",
- "xml2js": "^0.4.22"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
- "requires": {
- "pend": "~1.2.0"
- }
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "requires": {
- "escape-string-regexp": "^1.0.5",
- "object-assign": "^4.1.0"
- }
- },
- "file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz",
- "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=",
- "dev": true,
- "requires": {
- "flat-cache": "^2.0.1"
- }
- },
- "file-type": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
- "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw=="
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
- },
- "filename-reserved-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
- "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik="
- },
- "filenamify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz",
- "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==",
- "requires": {
- "filename-reserved-regex": "^2.0.0",
- "strip-outer": "^1.0.0",
- "trim-repeated": "^1.0.0"
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "finalhandler": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.0.tgz",
- "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.1",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.2",
- "statuses": "~1.3.1",
- "unpipe": "~1.0.0"
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "find-versions": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
- "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
- "requires": {
- "semver-regex": "^2.0.0"
- }
- },
- "flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz",
- "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=",
- "dev": true,
- "requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz",
- "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz",
- "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "flatted": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.1.tgz?cache=0&sync_timestamp=1561466276595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflatted%2Fdownload%2Fflatted-2.0.1.tgz",
- "integrity": "sha1-aeV8qo8OrLwoHS4stFjUb9tEngg=",
- "dev": true
- },
- "follow-redirects": {
- "version": "1.5.10",
- "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.5.10.tgz",
- "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=",
- "optional": true,
- "requires": {
- "debug": "=3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "from2": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
- },
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz",
- "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "1.2.9",
- "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.9.tgz?cache=0&sync_timestamp=1573319428418&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.9.tgz",
- "integrity": "sha1-P17WZYPM1vQAtaANtvfoYTY+OI8=",
- "optional": true,
- "requires": {
- "nan": "^2.12.1",
- "node-pre-gyp": "^0.12.0"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "optional": true
- },
- "aproba": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- "optional": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chownr": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "optional": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "debug": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.3",
- "bundled": true,
- "optional": true
- },
- "fs-minipass": {
- "version": "1.2.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "glob": {
- "version": "7.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "bundled": true,
- "optional": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-walk": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true,
- "optional": true
- },
- "ini": {
- "version": "1.3.5",
- "bundled": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "optional": true
- },
- "minipass": {
- "version": "2.3.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.2.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.1.1",
- "bundled": true,
- "optional": true
- },
- "needle": {
- "version": "2.3.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "debug": "^4.1.0",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- }
- },
- "node-pre-gyp": {
- "version": "0.12.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "npm-bundled": {
- "version": "1.0.6",
- "bundled": true,
- "optional": true
- },
- "npm-packlist": {
- "version": "1.4.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "rimraf": {
- "version": "2.6.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "bundled": true,
- "optional": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "bundled": true,
- "optional": true
- },
- "sax": {
- "version": "1.2.4",
- "bundled": true,
- "optional": true
- },
- "semver": {
- "version": "5.7.0",
- "bundled": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "optional": true
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "tar": {
- "version": "4.4.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.3.4",
- "minizlib": "^1.1.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.2"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "wide-align": {
- "version": "1.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "yallist": {
- "version": "3.0.3",
- "bundled": true,
- "optional": true
- }
- }
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz",
- "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=",
- "optional": true
- },
- "get-proxy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
- "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
- "requires": {
- "npm-conf": "^1.1.0"
- }
- },
- "get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
- },
- "get-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
- "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
- "requires": {
- "object-assign": "^4.0.1",
- "pinkie-promise": "^2.0.0"
- }
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "gifsicle": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-4.0.1.tgz",
- "integrity": "sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg==",
- "requires": {
- "bin-build": "^3.0.0",
- "bin-wrapper": "^4.0.0",
- "execa": "^1.0.0",
- "logalot": "^2.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "requires": {
- "pump": "^3.0.0"
- }
- }
- }
- },
- "github-from-package": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
- "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4="
- },
- "glob": {
- "version": "6.0.4",
- "resolved": "https://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-6.0.4.tgz",
- "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
- "optional": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "requires": {
- "glob-parent": "^2.0.0",
- "is-glob": "^2.0.0"
- },
- "dependencies": {
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz?cache=0&sync_timestamp=1569108917227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "requires": {
- "is-glob": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "requires": {
- "is-extglob": "^1.0.0"
- }
- }
- }
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1569108917227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- },
- "dependencies": {
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "requires": {
- "is-extglob": "^2.1.0"
- }
- }
- }
- },
- "glob-to-regexp": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
- "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
- },
- "global": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
- "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
- "requires": {
- "min-document": "^2.19.0",
- "process": "~0.5.1"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz",
- "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4="
- },
- "globby": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
- "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
- "requires": {
- "array-union": "^1.0.1",
- "dir-glob": "2.0.0",
- "fast-glob": "^2.0.2",
- "glob": "^7.1.2",
- "ignore": "^3.3.5",
- "pify": "^3.0.0",
- "slash": "^1.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "got": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
- "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
- "requires": {
- "decompress-response": "^3.2.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "is-retry-allowed": "^1.0.0",
- "is-stream": "^1.0.0",
- "isurl": "^1.0.0-alpha5",
- "lowercase-keys": "^1.0.0",
- "p-cancelable": "^0.3.0",
- "p-timeout": "^1.1.1",
- "safe-buffer": "^5.0.1",
- "timed-out": "^4.0.0",
- "url-parse-lax": "^1.0.0",
- "url-to-options": "^1.0.1"
- },
- "dependencies": {
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- }
- }
- },
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.3.tgz",
- "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM="
- },
- "graceful-readlink": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1568144533484&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "has-binary2": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/has-binary2/download/has-binary2-1.0.3.tgz",
- "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=",
- "optional": true,
- "requires": {
- "isarray": "2.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-2.0.1.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
- "optional": true
- }
- }
- },
- "has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/has-cors/download/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
- "optional": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-symbol-support-x": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
- "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
- },
- "has-to-string-tag-x": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
- "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
- "requires": {
- "has-symbol-support-x": "^1.4.1"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
- },
- "hexo": {
- "version": "3.9.0",
- "resolved": "https://registry.npm.taobao.org/hexo/download/hexo-3.9.0.tgz",
- "integrity": "sha1-e1r+O33ogpRpY1rMlSdX+sPshjw=",
- "requires": {
- "abbrev": "^1.1.1",
- "archy": "^1.0.0",
- "bluebird": "^3.5.2",
- "chalk": "^2.4.1",
- "cheerio": "0.22.0",
- "hexo-cli": "^2.0.0",
- "hexo-front-matter": "^0.2.3",
- "hexo-fs": "^1.0.0",
- "hexo-i18n": "^0.2.1",
- "hexo-log": "^0.2.0",
- "hexo-util": "^0.6.3",
- "js-yaml": "^3.12.0",
- "lodash": "^4.17.11",
- "minimatch": "^3.0.4",
- "moment": "^2.22.2",
- "moment-timezone": "^0.5.21",
- "nunjucks": "^3.1.3",
- "pretty-hrtime": "^1.0.3",
- "resolve": "^1.8.1",
- "strip-ansi": "^5.0.0",
- "strip-indent": "^2.0.0",
- "swig-extras": "0.0.1",
- "swig-templates": "^2.0.3",
- "text-table": "^0.2.0",
- "tildify": "^1.2.0",
- "titlecase": "^1.1.2",
- "warehouse": "^2.2.0"
- },
- "dependencies": {
- "hexo-cli": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/hexo-cli/download/hexo-cli-2.0.0.tgz",
- "integrity": "sha1-SFuHaCmVGIbL/AvSD5K3RdZbwAs=",
- "requires": {
- "abbrev": "^1.1.1",
- "acorn": "^6.1.1",
- "bluebird": "^3.5.3",
- "chalk": "^2.4.2",
- "command-exists": "^1.2.8",
- "hexo-fs": "^1.0.2",
- "hexo-log": "^0.2.0",
- "hexo-util": "^0.6.3",
- "minimist": "^1.2.0",
- "resolve": "^1.10.0",
- "tildify": "^1.2.0"
- }
- }
- }
- },
- "hexo-browsersync": {
- "version": "0.3.0",
- "resolved": "https://registry.npm.taobao.org/hexo-browsersync/download/hexo-browsersync-0.3.0.tgz",
- "integrity": "sha1-PUNDU3SSFEKJHtGAuhflGU7Q05Q=",
- "optional": true,
- "requires": {
- "browser-sync": "^2.18.13",
- "connect-injector": "^0.4.4"
- }
- },
- "hexo-bunyan": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/hexo-bunyan/download/hexo-bunyan-1.0.0.tgz",
- "integrity": "sha1-shBrJlR7Iy8BlduGPLXV/4Un/TY=",
- "requires": {
- "moment": "^2.10.6",
- "mv": "~2",
- "safe-json-stringify": "~1"
- }
- },
- "hexo-deployer-git": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/hexo-deployer-git/download/hexo-deployer-git-1.0.0.tgz?cache=0&sync_timestamp=1573983785561&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhexo-deployer-git%2Fdownload%2Fhexo-deployer-git-1.0.0.tgz",
- "integrity": "sha1-Bs3gzuKx1a9eBLWaqlFhMLvQPRY=",
- "requires": {
- "babel-eslint": "^10.0.1",
- "bluebird": "^3.5.0",
- "chalk": "^2.4.1",
- "hexo-fs": "^1.0.0",
- "hexo-util": "^0.6.0",
- "moment": "^2.18.0",
- "swig-templates": "^2.0.2"
- }
- },
- "hexo-filter-cleanup": {
- "version": "github:mamboer/hexo-filter-cleanup#2c5b063465d7776fccf43c34a4650a73a7d2b729",
- "from": "github:mamboer/hexo-filter-cleanup",
- "requires": {
- "bluebird": "^3.5.4",
- "clean-css": "^4.2.1",
- "favicons": "^5.3.0",
- "fs-extra": "^7.0.1",
- "html-minifier": "^4.0.0",
- "imagemin": "^6.1.0",
- "imagemin-gifsicle": "^6.0.1",
- "imagemin-jpeg-recompress": "^6.0.0",
- "imagemin-jpegtran": "^6.0.0",
- "imagemin-optipng": "^6.0.0",
- "imagemin-pngquant": "^7.0.0",
- "imagemin-svgo": "^7.0.0",
- "imagemin-webp": "^5.0.0",
- "md5-file": "^4.0.0",
- "minimatch": "^3.0.4",
- "object-assign": "^4.1.1",
- "stream-to-array": "^2.3.0",
- "uglify-js": "~3.5.11",
- "useref": "^1.4.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- },
- "uglify-js": {
- "version": "3.5.15",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz",
- "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==",
- "requires": {
- "commander": "~2.20.0",
- "source-map": "~0.6.1"
- }
- }
- }
- },
- "hexo-front-matter": {
- "version": "0.2.3",
- "resolved": "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-0.2.3.tgz",
- "integrity": "sha1-x8qO9CDqNr2F6ECKLoyb9J76YF4=",
- "requires": {
- "js-yaml": "^3.6.1"
- }
- },
- "hexo-fs": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-1.0.2.tgz",
- "integrity": "sha1-XqvjRKeato4vppN8xdRoEpMIZZ8=",
- "requires": {
- "bluebird": "^3.5.1",
- "chokidar": "^2.0.4",
- "escape-string-regexp": "^1.0.5",
- "graceful-fs": "^4.1.11"
- }
- },
- "hexo-generator-archive": {
- "version": "0.1.5",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-archive/download/hexo-generator-archive-0.1.5.tgz",
- "integrity": "sha1-qXkhTN3e4mk+BVGAnClL7a27abM=",
- "requires": {
- "hexo-pagination": "0.0.2",
- "object-assign": "^2.0.0"
- },
- "dependencies": {
- "object-assign": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-2.1.1.tgz",
- "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo="
- }
- }
- },
- "hexo-generator-baidu-sitemap": {
- "version": "github:mamboer/hexo-generator-baidu-sitemap#f0f66256a08c131c4d77923952bafeb4f8ae7198",
- "from": "github:mamboer/hexo-generator-baidu-sitemap",
- "requires": {
- "ejs": "^2.5.7",
- "hexo": "^3.6.0",
- "utils-merge": "^1.0.1"
- }
- },
- "hexo-generator-category": {
- "version": "0.1.3",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-category/download/hexo-generator-category-0.1.3.tgz",
- "integrity": "sha1-uealhiUwqDvdfaTIGcG58+TMtLI=",
- "requires": {
- "hexo-pagination": "0.0.2",
- "object-assign": "^2.0.0"
- },
- "dependencies": {
- "object-assign": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-2.1.1.tgz",
- "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo="
- }
- }
- },
- "hexo-generator-fragments": {
- "version": "github:mamboer/hexo-generator-fragments#b683c380a89981660ced40ec98989964adf85025",
- "from": "github:mamboer/hexo-generator-fragments",
- "requires": {
- "hexo-pagination": "0.1.0",
- "object-assign": "^4.1.0"
- },
- "dependencies": {
- "hexo-pagination": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.1.0.tgz",
- "integrity": "sha1-VPC+EuauUdHApvACNnS6d6xRTOM=",
- "requires": {
- "object-assign": "^4.1.0"
- }
- }
- }
- },
- "hexo-generator-index": {
- "version": "0.2.1",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-index/download/hexo-generator-index-0.2.1.tgz",
- "integrity": "sha1-kEIin8rHmq9wBXXaGTMr8/fuXF0=",
- "requires": {
- "hexo-pagination": "0.0.2",
- "object-assign": "^4.0.1"
- }
- },
- "hexo-generator-json-feed": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-json-feed/download/hexo-generator-json-feed-1.0.0.tgz",
- "integrity": "sha1-HqkxWxFPagKnkQqkunD9hF61wSg=",
- "requires": {
- "hexo-util": "^1.6.1"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "7.0.1",
- "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.1.tgz",
- "integrity": "sha1-CrVihuD3wk4VPQTMKqAn5DqaXRQ=",
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "hexo-util": {
- "version": "1.6.1",
- "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-1.6.1.tgz?cache=0&sync_timestamp=1574988243780&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhexo-util%2Fdownload%2Fhexo-util-1.6.1.tgz",
- "integrity": "sha1-eFe2WwxVq6d7P1ej3bMnzN9y92I=",
- "requires": {
- "bluebird": "^3.5.2",
- "camel-case": "^3.0.0",
- "cross-spawn": "^7.0.0",
- "highlight.js": "^9.13.1",
- "striptags": "^3.1.1"
- }
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz",
- "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U="
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz",
- "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz",
- "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI="
- },
- "striptags": {
- "version": "3.1.1",
- "resolved": "https://registry.npm.taobao.org/striptags/download/striptags-3.1.1.tgz",
- "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0="
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116720213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz",
- "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
- "hexo-generator-lunr": {
- "version": "1.0.5",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-lunr/download/hexo-generator-lunr-1.0.5.tgz",
- "integrity": "sha1-gEj2+k7fnQly1NvSi5SU5x/kPhs=",
- "requires": {
- "lunr": "github:mamboer/lunr.js",
- "moment": "^2.14.1",
- "object-assign": "^4.1.0"
- },
- "dependencies": {
- "lunr": {
- "version": "github:mamboer/lunr.js#37680a339bfec3785e507bb3c07e362cae66ac26",
- "from": "github:mamboer/lunr.js",
- "requires": {
- "nodejieba": "^2.0.0"
- }
- }
- }
- },
- "hexo-generator-sitemap": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-sitemap/download/hexo-generator-sitemap-1.2.0.tgz",
- "integrity": "sha1-MBj419Hi5Cs/caZacxb/z1g7w/M=",
- "requires": {
- "minimatch": "^3.0.0",
- "nunjucks": "^2.3.0",
- "object-assign": "^4.0.1"
- },
- "dependencies": {
- "anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz",
- "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
- "requires": {
- "micromatch": "^2.1.5",
- "normalize-path": "^2.0.0"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "requires": {
- "arr-flatten": "^1.0.1"
- }
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "requires": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
- }
- },
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
- "requires": {
- "anymatch": "^1.3.0",
- "async-each": "^1.0.0",
- "fsevents": "^1.0.0",
- "glob-parent": "^2.0.0",
- "inherits": "^2.0.1",
- "is-binary-path": "^1.0.0",
- "is-glob": "^2.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.0.0"
- }
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "requires": {
- "is-posix-bracket": "^0.1.0"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz?cache=0&sync_timestamp=1569108917227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "requires": {
- "is-glob": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "requires": {
- "arr-diff": "^2.0.0",
- "array-unique": "^0.2.1",
- "braces": "^1.8.2",
- "expand-brackets": "^0.1.4",
- "extglob": "^0.3.1",
- "filename-regex": "^2.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.1",
- "kind-of": "^3.0.2",
- "normalize-path": "^2.0.1",
- "object.omit": "^2.0.0",
- "parse-glob": "^3.0.4",
- "regex-cache": "^0.4.2"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "nunjucks": {
- "version": "2.5.2",
- "resolved": "https://registry.npm.taobao.org/nunjucks/download/nunjucks-2.5.2.tgz",
- "integrity": "sha1-6n00bnhbikh0Zmw8yp4YxXf7oiw=",
- "requires": {
- "asap": "^2.0.3",
- "chokidar": "^1.6.0",
- "yargs": "^3.32.0"
- }
- }
- }
- },
- "hexo-generator-tag": {
- "version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-tag/download/hexo-generator-tag-0.2.0.tgz",
- "integrity": "sha1-xXFYRrtB5X2cIMHWbX2yGhq/emI=",
- "requires": {
- "hexo-pagination": "0.0.2",
- "object-assign": "^4.0.1"
- }
- },
- "hexo-generator-xfeed": {
- "version": "1.2.4",
- "resolved": "https://registry.npm.taobao.org/hexo-generator-xfeed/download/hexo-generator-xfeed-1.2.4.tgz",
- "integrity": "sha1-VAip01AUWDZN5CQDhBlhfQImQyY=",
- "requires": {
- "nunjucks": "^3.0.0",
- "object-assign": "^4.1.1"
- }
- },
- "hexo-i18n": {
- "version": "0.2.1",
- "resolved": "https://registry.npm.taobao.org/hexo-i18n/download/hexo-i18n-0.2.1.tgz",
- "integrity": "sha1-hPFBQyvwnYtVjth4xygWS20c1t4=",
- "requires": {
- "sprintf-js": "^1.0.2"
- }
- },
- "hexo-log": {
- "version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/hexo-log/download/hexo-log-0.2.0.tgz",
- "integrity": "sha1-0w/UXhoSqDyIAzWGZASF78XfWm8=",
- "requires": {
- "chalk": "^1.1.1",
- "hexo-bunyan": "^1.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&sync_timestamp=1573557628456&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1573282918610&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "hexo-pagination": {
- "version": "0.0.2",
- "resolved": "https://registry.npm.taobao.org/hexo-pagination/download/hexo-pagination-0.0.2.tgz",
- "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=",
- "requires": {
- "utils-merge": "^1.0.0"
- }
- },
- "hexo-renderer-ejs": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/hexo-renderer-ejs/download/hexo-renderer-ejs-1.0.0.tgz",
- "integrity": "sha1-Q8TeSe6uIkA2pFffhg6xwUxotLQ=",
- "requires": {
- "ejs": "^2.6.1"
- }
- },
- "hexo-renderer-marked": {
- "version": "0.3.2",
- "resolved": "https://registry.npm.taobao.org/hexo-renderer-marked/download/hexo-renderer-marked-0.3.2.tgz",
- "integrity": "sha1-1qN6+f8ZXjD5727eGgbqH+QyKWY=",
- "requires": {
- "hexo-util": "^0.6.2",
- "marked": "^0.3.9",
- "object-assign": "^4.1.1",
- "strip-indent": "^2.0.0"
- }
- },
- "hexo-renderer-stylus": {
- "version": "github:mamboer/hexo-renderer-stylus#3eb3c68b8e97130c69828ef0e29057c7c736b714",
- "from": "github:mamboer/hexo-renderer-stylus",
- "requires": {
- "nib": "^1.1.2",
- "stylus": "^0.54.5"
- }
- },
- "hexo-server": {
- "version": "0.3.3",
- "resolved": "https://registry.npm.taobao.org/hexo-server/download/hexo-server-0.3.3.tgz",
- "integrity": "sha1-uGcSl0kgv8wwV9672zXdG+bDAIA=",
- "requires": {
- "bluebird": "^3.5.1",
- "chalk": "^1.1.3",
- "compression": "^1.7.3",
- "connect": "^3.6.6",
- "mime": "^1.6.0",
- "morgan": "^1.9.0",
- "object-assign": "^4.1.1",
- "opn": "^5.3.0",
- "serve-static": "^1.13.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&sync_timestamp=1573557628456&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1573282918610&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz",
- "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE="
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "hexo-util": {
- "version": "0.6.3",
- "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-0.6.3.tgz?cache=0&sync_timestamp=1574988243780&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhexo-util%2Fdownload%2Fhexo-util-0.6.3.tgz",
- "integrity": "sha1-FqKt5Fe++VWvDf0io/5vCkmpE3w=",
- "requires": {
- "bluebird": "^3.4.0",
- "camel-case": "^3.0.0",
- "cross-spawn": "^4.0.0",
- "highlight.js": "^9.4.0",
- "html-entities": "^1.2.0",
- "striptags": "^2.1.1"
- }
- },
- "hexo-wordcount": {
- "version": "6.0.1",
- "resolved": "https://registry.npm.taobao.org/hexo-wordcount/download/hexo-wordcount-6.0.1.tgz",
- "integrity": "sha1-WmDvydPI5CGVby/WaDypSop5UmQ="
- },
- "highlight.js": {
- "version": "9.16.2",
- "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.16.2.tgz",
- "integrity": "sha1-aDaNA5/+HGIRvMB+SD2vld4+QD4="
- },
- "hosted-git-info": {
- "version": "2.8.5",
- "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.5.tgz?cache=0&sync_timestamp=1570493686863&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.5.tgz",
- "integrity": "sha1-dZz88sTRVq3lmwst+r3cQqa5xww="
- },
- "html-comment-regex": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
- "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ=="
- },
- "html-entities": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz",
- "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8="
- },
- "html-minifier": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
- "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
- "requires": {
- "camel-case": "^3.0.0",
- "clean-css": "^4.2.1",
- "commander": "^2.19.0",
- "he": "^1.2.0",
- "param-case": "^2.1.1",
- "relateurl": "^0.2.7",
- "uglify-js": "^3.5.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- },
- "uglify-js": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz",
- "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==",
- "requires": {
- "commander": "~2.20.3",
- "source-map": "~0.6.1"
- }
- }
- }
- },
- "htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz",
- "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=",
- "requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
- }
- },
- "http-cache-semantics": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
- "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
- },
- "http-errors": {
- "version": "1.7.3",
- "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz",
- "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=",
- "optional": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- },
- "dependencies": {
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "optional": true
- }
- }
- },
- "http-proxy": {
- "version": "1.15.2",
- "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.15.2.tgz",
- "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=",
- "optional": true,
- "requires": {
- "eventemitter3": "1.x.x",
- "requires-port": "1.x.x"
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz",
- "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
- },
- "ignore": {
- "version": "3.3.10",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
- "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
- },
- "image-size": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz",
- "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==",
- "requires": {
- "queue": "6.0.1"
- }
- },
- "imagemin": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz",
- "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==",
- "requires": {
- "file-type": "^10.7.0",
- "globby": "^8.0.1",
- "make-dir": "^1.0.0",
- "p-pipe": "^1.1.0",
- "pify": "^4.0.1",
- "replace-ext": "^1.0.0"
- },
- "dependencies": {
- "file-type": {
- "version": "10.11.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
- "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw=="
- },
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
- }
- }
- },
- "imagemin-gifsicle": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz",
- "integrity": "sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng==",
- "requires": {
- "exec-buffer": "^3.0.0",
- "gifsicle": "^4.0.0",
- "is-gif": "^3.0.0"
- }
- },
- "imagemin-jpeg-recompress": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/imagemin-jpeg-recompress/-/imagemin-jpeg-recompress-6.0.0.tgz",
- "integrity": "sha512-JCqJcvuWx2F1sl0Q6LUQq8o/EcjCnAagpELjiBvvc+PErSxR2jFUFhWcjSjUKFDa2oDMXC2Bn8mRjLWUQskQGQ==",
- "requires": {
- "exec-buffer": "^3.0.0",
- "is-jpg": "^2.0.0",
- "jpeg-recompress-bin": "^4.0.0"
- }
- },
- "imagemin-jpegtran": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-6.0.0.tgz",
- "integrity": "sha512-Ih+NgThzqYfEWv9t58EItncaaXIHR0u9RuhKa8CtVBlMBvY0dCIxgQJQCfwImA4AV1PMfmUKlkyIHJjb7V4z1g==",
- "requires": {
- "exec-buffer": "^3.0.0",
- "is-jpg": "^2.0.0",
- "jpegtran-bin": "^4.0.0"
- }
- },
- "imagemin-optipng": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz",
- "integrity": "sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A==",
- "requires": {
- "exec-buffer": "^3.0.0",
- "is-png": "^1.0.0",
- "optipng-bin": "^5.0.0"
- }
- },
- "imagemin-pngquant": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-7.0.0.tgz",
- "integrity": "sha512-FXBz8lfvI+noraZbNCE0AUDUng/2+Cv5W0F/nUGGjKdzb8AnN1f0JzVxH2aYj7SQxOdYYatvfNbITIZpaFATZg==",
- "requires": {
- "execa": "^1.0.0",
- "is-png": "^1.0.0",
- "is-stream": "^1.1.0",
- "ow": "^0.8.0",
- "pngquant-bin": "^5.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "requires": {
- "pump": "^3.0.0"
- }
- }
- }
- },
- "imagemin-svgo": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz",
- "integrity": "sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==",
- "requires": {
- "is-svg": "^4.2.1",
- "svgo": "^1.3.2"
- }
- },
- "imagemin-webp": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/imagemin-webp/-/imagemin-webp-5.1.0.tgz",
- "integrity": "sha512-BsPTpobgbDPFBBsI3UflnU/cpIVa15qInEDBcYBw16qI/6XiB4vDF/dGp9l4aM3pfFDDYqR0mANMcKpBD7wbCw==",
- "requires": {
- "cwebp-bin": "^5.0.0",
- "exec-buffer": "^3.0.0",
- "is-cwebp-readable": "^2.0.1"
- }
- },
- "immutable": {
- "version": "3.8.2",
- "resolved": "https://registry.npm.taobao.org/immutable/download/immutable-3.8.2.tgz",
- "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=",
- "optional": true
- },
- "import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.2.1.tgz",
- "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "import-lazy": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz",
- "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ=="
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "requires": {
- "repeating": "^2.0.0"
- }
- },
- "indexof": {
- "version": "0.0.1",
- "resolved": "https://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz",
- "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
- "optional": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.4.tgz",
- "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "inquirer": {
- "version": "6.5.2",
- "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-6.5.2.tgz",
- "integrity": "sha1-rVCUI3XQNtMn/1KMCL1fqwiZKMo=",
- "dev": true,
- "requires": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.12",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz?cache=0&sync_timestamp=1570188663907&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffigures%2Fdownload%2Ffigures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "rxjs": {
- "version": "6.5.3",
- "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.5.3.tgz?cache=0&sync_timestamp=1568815796923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.5.3.tgz",
- "integrity": "sha1-UQ4mMX9NuRp+sd532d2boKSJmjo=",
- "dev": true,
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-2.1.1.tgz",
- "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- }
- }
- },
- "into-stream": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
- "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
- "requires": {
- "from2": "^2.1.1",
- "p-is-promise": "^1.1.0"
- }
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
- },
- "ip-regex": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz",
- "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0="
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "requires": {
- "binary-extensions": "^1.0.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz",
- "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4="
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
- },
- "is-cwebp-readable": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-cwebp-readable/-/is-cwebp-readable-2.0.1.tgz",
- "integrity": "sha1-r7k7DAq9CiUQEBauM66ort+SbSY=",
- "requires": {
- "file-type": "^4.3.0"
- },
- "dependencies": {
- "file-type": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
- "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU="
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-date-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
- "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
- "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
- }
- }
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "requires": {
- "is-primitive": "^2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
- },
- "is-finite": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
- "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-function": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz",
- "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU="
- },
- "is-gif": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz",
- "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==",
- "requires": {
- "file-type": "^10.4.0"
- },
- "dependencies": {
- "file-type": {
- "version": "10.11.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
- "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw=="
- }
- }
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
- "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-jpg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz",
- "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc="
- },
- "is-natural-number": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
- "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg="
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-number-like": {
- "version": "1.0.8",
- "resolved": "https://registry.npm.taobao.org/is-number-like/download/is-number-like-1.0.8.tgz",
- "integrity": "sha1-LhKWILUIkQQuROm7uzBZPnXPu+M=",
- "optional": true,
- "requires": {
- "lodash.isfinite": "^3.3.2"
- }
- },
- "is-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
- "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz",
- "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-png": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz",
- "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84="
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
- "dev": true
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-retry-allowed": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
- "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-svg": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.2.1.tgz",
- "integrity": "sha512-PHx3ANecKsKNl5y5+Jvt53Y4J7MfMpbNZkv384QNiswMKAWIbvcqbPz+sYbFKJI8Xv3be01GSFniPmoaP+Ai5A==",
- "requires": {
- "html-comment-regex": "^1.1.2"
- }
- },
- "is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz",
- "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0="
- },
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-wsl%2Fdownload%2Fis-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "isurl": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
- "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
- "requires": {
- "has-to-string-tag-x": "^1.2.0",
- "is-object": "^1.0.1"
- }
- },
- "jimp": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.9.5.tgz",
- "integrity": "sha512-gjrzz+lT4In7shmP4LV1o/dfL0btnh4W9F5jPCXA6Qw4uEAF8+8GDwAR69hbUQCZH7R5KoCtq81tpfzydoJtSQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/custom": "^0.9.5",
- "@jimp/plugins": "^0.9.5",
- "@jimp/types": "^0.9.5",
- "core-js": "^3.4.1",
- "regenerator-runtime": "^0.13.3"
- },
- "dependencies": {
- "core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- }
- }
- },
- "jpeg-js": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz",
- "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ=="
- },
- "jpeg-recompress-bin": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jpeg-recompress-bin/-/jpeg-recompress-bin-4.0.0.tgz",
- "integrity": "sha512-hm55De89eEzz4DeL8SXWN8kXxARlNhTs8NShUbBqvg5cxUHHKYLsLwEDAukJ/q2Gr571wHunaU2+2Ivnac7L+w==",
- "requires": {
- "bin-wrapper": "^4.1.0",
- "logalot": "^2.0.0"
- }
- },
- "jpegtran-bin": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz",
- "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==",
- "requires": {
- "bin-build": "^3.0.0",
- "bin-wrapper": "^4.0.0",
- "logalot": "^2.0.0"
- }
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz",
- "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk="
- },
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz",
- "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=",
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz",
- "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q="
- },
- "json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
- },
- "jsontoxml": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz",
- "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ=="
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "keyv": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
- "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz",
- "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE="
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "requires": {
- "invert-kv": "^1.0.0"
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "limiter": {
- "version": "1.1.4",
- "resolved": "https://registry.npm.taobao.org/limiter/download/limiter-1.1.4.tgz",
- "integrity": "sha1-h8nDly04n9sLpnpFqtvF0vhBO8E=",
- "optional": true
- },
- "load-bmfont": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz",
- "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==",
- "requires": {
- "buffer-equal": "0.0.1",
- "mime": "^1.3.4",
- "parse-bmfont-ascii": "^1.0.3",
- "parse-bmfont-binary": "^1.0.5",
- "parse-bmfont-xml": "^1.1.4",
- "phin": "^2.9.1",
- "xhr": "^2.0.1",
- "xtend": "^4.0.0"
- }
- },
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "localtunnel": {
- "version": "1.9.2",
- "resolved": "https://registry.npm.taobao.org/localtunnel/download/localtunnel-1.9.2.tgz",
- "integrity": "sha1-ABL8q8Kc+WTBMKAYWHaKortlta8=",
- "optional": true,
- "requires": {
- "axios": "0.19.0",
- "debug": "4.1.1",
- "openurl": "1.1.1",
- "yargs": "6.6.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "optional": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
- "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
- "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
- "optional": true
- },
- "yargs": {
- "version": "6.6.0",
- "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-6.6.0.tgz",
- "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
- "optional": true,
- "requires": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^4.2.0"
- }
- }
- }
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.15.tgz?cache=0&sync_timestamp=1571657272199&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.15.tgz",
- "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg="
- },
- "lodash.assignin": {
- "version": "4.2.0",
- "resolved": "https://registry.npm.taobao.org/lodash.assignin/download/lodash.assignin-4.2.0.tgz",
- "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI="
- },
- "lodash.bind": {
- "version": "4.2.1",
- "resolved": "https://registry.npm.taobao.org/lodash.bind/download/lodash.bind-4.2.1.tgz",
- "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU="
- },
- "lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npm.taobao.org/lodash.defaults/download/lodash.defaults-4.2.0.tgz",
- "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
- },
- "lodash.defaultsdeep": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
- "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA=="
- },
- "lodash.filter": {
- "version": "4.6.0",
- "resolved": "https://registry.npm.taobao.org/lodash.filter/download/lodash.filter-4.6.0.tgz",
- "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4="
- },
- "lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npm.taobao.org/lodash.flatten/download/lodash.flatten-4.4.0.tgz",
- "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
- },
- "lodash.foreach": {
- "version": "4.5.0",
- "resolved": "https://registry.npm.taobao.org/lodash.foreach/download/lodash.foreach-4.5.0.tgz",
- "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM="
- },
- "lodash.isfinite": {
- "version": "3.3.2",
- "resolved": "https://registry.npm.taobao.org/lodash.isfinite/download/lodash.isfinite-3.3.2.tgz",
- "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=",
- "optional": true
- },
- "lodash.map": {
- "version": "4.6.0",
- "resolved": "https://registry.npm.taobao.org/lodash.map/download/lodash.map-4.6.0.tgz",
- "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM="
- },
- "lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz",
- "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo="
- },
- "lodash.pick": {
- "version": "4.4.0",
- "resolved": "https://registry.npm.taobao.org/lodash.pick/download/lodash.pick-4.4.0.tgz",
- "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
- },
- "lodash.reduce": {
- "version": "4.6.0",
- "resolved": "https://registry.npm.taobao.org/lodash.reduce/download/lodash.reduce-4.6.0.tgz",
- "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs="
- },
- "lodash.reject": {
- "version": "4.6.0",
- "resolved": "https://registry.npm.taobao.org/lodash.reject/download/lodash.reject-4.6.0.tgz",
- "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU="
- },
- "lodash.some": {
- "version": "4.6.0",
- "resolved": "https://registry.npm.taobao.org/lodash.some/download/lodash.some-4.6.0.tgz",
- "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0="
- },
- "logalot": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz",
- "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=",
- "requires": {
- "figures": "^1.3.5",
- "squeak": "^1.0.0"
- }
- },
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
- },
- "loud-rejection": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
- "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
- "requires": {
- "currently-unhandled": "^0.4.1",
- "signal-exit": "^3.0.0"
- }
- },
- "lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz",
- "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
- },
- "lpad-align": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz",
- "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=",
- "requires": {
- "get-stdin": "^4.0.1",
- "indent-string": "^2.1.0",
- "longest": "^1.0.0",
- "meow": "^3.3.0"
- }
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz",
- "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "lunr": {
- "version": "github:codepiano/lunr.js#1539f562e0432110c53298e1ded070f8c8e2ed9f",
- "from": "github:codepiano/lunr.js",
- "requires": {
- "nodejieba": "^2.0.0"
- }
- },
- "make-dir": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
- "requires": {
- "pify": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
- },
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "markdown": {
- "version": "0.5.0",
- "resolved": "https://registry.npm.taobao.org/markdown/download/markdown-0.5.0.tgz",
- "integrity": "sha1-KCBbVlqK51kt4gdGPWY33BgnIrI=",
- "requires": {
- "nopt": "~2.1.1"
- }
- },
- "marked": {
- "version": "0.3.19",
- "resolved": "https://registry.npm.taobao.org/marked/download/marked-0.3.19.tgz",
- "integrity": "sha1-XUf3CcTJ/Dwha21GEnKA9As515A="
- },
- "math-random": {
- "version": "1.0.4",
- "resolved": "https://registry.npm.taobao.org/math-random/download/math-random-1.0.4.tgz",
- "integrity": "sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw="
- },
- "md5-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-4.0.0.tgz",
- "integrity": "sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg=="
- },
- "mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
- },
- "meow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
- "requires": {
- "camelcase-keys": "^2.0.0",
- "decamelize": "^1.1.2",
- "loud-rejection": "^1.0.0",
- "map-obj": "^1.0.1",
- "minimist": "^1.1.3",
- "normalize-package-data": "^2.3.4",
- "object-assign": "^4.0.1",
- "read-pkg-up": "^1.0.1",
- "redent": "^1.0.0",
- "trim-newlines": "^1.0.0"
- }
- },
- "merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw=="
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz",
- "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "mime": {
- "version": "1.4.1",
- "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz",
- "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY="
- },
- "mime-db": {
- "version": "1.42.0",
- "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.42.0.tgz",
- "integrity": "sha1-PiUpB7THrbkGWXtLZWNics+ee6w="
- },
- "mime-types": {
- "version": "2.1.25",
- "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.25.tgz",
- "integrity": "sha1-OXctRmIfk+KoCoVsU7hqYhVqZDc=",
- "requires": {
- "mime-db": "1.42.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz",
- "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
- "dev": true
- },
- "mimic-response": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
- "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
- },
- "min-document": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
- "requires": {
- "dom-walk": "^0.1.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz",
- "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "minipass": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz",
- "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==",
- "requires": {
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "minizlib": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
- "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
- "requires": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "mitt": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/mitt/download/mitt-1.2.0.tgz?cache=0&sync_timestamp=1571677896484&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmitt%2Fdownload%2Fmitt-1.2.0.tgz",
- "integrity": "sha1-yyTmVpyAbjG9TjmVeH/jigT9+Q0=",
- "optional": true
- },
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz",
- "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=",
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
- "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "moment": {
- "version": "2.24.0",
- "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.24.0.tgz",
- "integrity": "sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s="
- },
- "moment-timezone": {
- "version": "0.5.27",
- "resolved": "https://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.27.tgz?cache=0&sync_timestamp=1571207560477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment-timezone%2Fdownload%2Fmoment-timezone-0.5.27.tgz",
- "integrity": "sha1-c63sgTm2/jBFLnjyEPJ7HzRriHc=",
- "requires": {
- "moment": ">= 2.9.0"
- }
- },
- "morgan": {
- "version": "1.9.1",
- "resolved": "https://registry.npm.taobao.org/morgan/download/morgan-1.9.1.tgz",
- "integrity": "sha1-Co0Wc0odmvvIJLmd+H5zjlji2lk=",
- "requires": {
- "basic-auth": "~2.0.0",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "on-finished": "~2.3.0",
- "on-headers": "~1.0.1"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
- "dev": true
- },
- "mv": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/mv/download/mv-2.1.1.tgz",
- "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=",
- "optional": true,
- "requires": {
- "mkdirp": "~0.5.1",
- "ncp": "~2.0.0",
- "rimraf": "~2.4.0"
- }
- },
- "nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz",
- "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw="
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz",
- "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "napi-build-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
- "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "ncp": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz",
- "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
- "optional": true
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz",
- "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
- },
- "nib": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz",
- "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=",
- "requires": {
- "stylus": "0.54.5"
- },
- "dependencies": {
- "glob": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
- "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.2",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "sax": {
- "version": "0.5.8",
- "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
- "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
- },
- "source-map": {
- "version": "0.1.43",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
- "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
- "requires": {
- "amdefine": ">=0.0.4"
- }
- },
- "stylus": {
- "version": "0.54.5",
- "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
- "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
- "requires": {
- "css-parse": "1.7.x",
- "debug": "*",
- "glob": "7.0.x",
- "mkdirp": "0.5.x",
- "sax": "0.5.x",
- "source-map": "0.1.x"
- }
- }
- }
- },
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz",
- "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y="
- },
- "no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz",
- "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=",
- "requires": {
- "lower-case": "^1.1.1"
- }
- },
- "node-abi": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz",
- "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==",
- "requires": {
- "semver": "^5.4.1"
- }
- },
- "node-fingerprint": {
- "version": "0.0.2",
- "resolved": "https://registry.npm.taobao.org/node-fingerprint/download/node-fingerprint-0.0.2.tgz",
- "integrity": "sha1-Mcur63GmeufdWn3AQuUcPHWGhQE="
- },
- "nodejieba": {
- "version": "2.3.3",
- "resolved": "https://registry.npm.taobao.org/nodejieba/download/nodejieba-2.3.3.tgz",
- "integrity": "sha1-dD/Blodbh1gi4iopk1PKyODQR3c=",
- "requires": {
- "nan": "^2.14.0"
- }
- },
- "noop-logger": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
- "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI="
- },
- "nopt": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-2.1.2.tgz",
- "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=",
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz",
- "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=",
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz",
- "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU="
- },
- "normalize-url": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
- "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
- "requires": {
- "prepend-http": "^2.0.0",
- "query-string": "^5.0.1",
- "sort-keys": "^2.0.0"
- },
- "dependencies": {
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
- },
- "sort-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
- "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
- "requires": {
- "is-plain-obj": "^1.0.0"
- }
- }
- }
- },
- "npm-conf": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
- "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
- "requires": {
- "config-chain": "^1.1.11",
- "pify": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz",
- "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=",
- "requires": {
- "boolbase": "~1.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "nunjucks": {
- "version": "3.2.0",
- "resolved": "https://registry.npm.taobao.org/nunjucks/download/nunjucks-3.2.0.tgz",
- "integrity": "sha1-U+lfQ8lVXoIuiVAAiiAbEALUmTM=",
- "requires": {
- "a-sync-waterfall": "^1.0.0",
- "asap": "^2.0.3",
- "chokidar": "^2.0.0",
- "yargs": "^3.32.0"
- }
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-component": {
- "version": "0.0.3",
- "resolved": "https://registry.npm.taobao.org/object-component/download/object-component-0.0.3.tgz",
- "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
- "optional": true
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "object-inspect": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
- "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "object-path": {
- "version": "0.9.2",
- "resolved": "https://registry.npm.taobao.org/object-path/download/object-path-0.9.2.tgz",
- "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=",
- "optional": true
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
- "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "requires": {
- "for-own": "^0.1.4",
- "is-extendable": "^0.1.1"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "object.values": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
- "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "omggif": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
- "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz",
- "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "dev": true,
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "openurl": {
- "version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/openurl/download/openurl-1.1.1.tgz",
- "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=",
- "optional": true
- },
- "opn": {
- "version": "5.3.0",
- "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.3.0.tgz",
- "integrity": "sha1-ZIcVZchjh18FLP31PT48ta21Oxw=",
- "requires": {
- "is-wsl": "^1.1.0"
- }
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "requires": {
- "minimist": "~0.0.1",
- "wordwrap": "~0.0.2"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
- }
- }
- },
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz?cache=0&sync_timestamp=1573078174520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.8.3.tgz",
- "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=",
- "dev": true,
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- }
- },
- "optipng-bin": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz",
- "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==",
- "requires": {
- "bin-build": "^3.0.0",
- "bin-wrapper": "^4.0.0",
- "logalot": "^2.0.0"
- }
- },
- "os-filter-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz",
- "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==",
- "requires": {
- "arch": "^2.1.0"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "requires": {
- "lcid": "^1.0.0"
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
- },
- "ow": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/ow/-/ow-0.8.0.tgz",
- "integrity": "sha512-hYgYZNcRfIZ2JppSTqh6mxdU1zkUXsGlwy4eBsRG91R6CiZk7cB+AfHl+SVKBdynQvAnNHNfu0ZrtJN1jj7Mow=="
- },
- "p-cancelable": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
- "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw=="
- },
- "p-event": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz",
- "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=",
- "requires": {
- "p-timeout": "^1.1.1"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-is-promise": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
- "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4="
- },
- "p-map-series": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz",
- "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=",
- "requires": {
- "p-reduce": "^1.0.0"
- }
- },
- "p-pipe": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz",
- "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k="
- },
- "p-reduce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
- "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo="
- },
- "p-timeout": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
- "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
- "requires": {
- "p-finally": "^1.0.0"
- }
- },
- "pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
- },
- "param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
- "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
- "requires": {
- "no-case": "^2.2.0"
- }
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz",
- "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-bmfont-ascii": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
- "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU="
- },
- "parse-bmfont-binary": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
- "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY="
- },
- "parse-bmfont-xml": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
- "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
- "requires": {
- "xml-parse-from-string": "^1.0.0",
- "xml2js": "^0.4.5"
- }
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "requires": {
- "glob-base": "^0.3.0",
- "is-dotfile": "^1.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.0"
- },
- "dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "requires": {
- "is-extglob": "^1.0.0"
- }
- }
- }
- },
- "parse-headers": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz",
- "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA=="
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "parse-png": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz",
- "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=",
- "requires": {
- "pngjs": "^3.2.0"
- }
- },
- "parseqs": {
- "version": "0.0.5",
- "resolved": "https://registry.npm.taobao.org/parseqs/download/parseqs-0.0.5.tgz",
- "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
- "optional": true,
- "requires": {
- "better-assert": "~1.0.0"
- }
- },
- "parseuri": {
- "version": "0.0.5",
- "resolved": "https://registry.npm.taobao.org/parseuri/download/parseuri-0.0.5.tgz?cache=0&sync_timestamp=1568821002283&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparseuri%2Fdownload%2Fparseuri-0.0.5.tgz",
- "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
- "optional": true,
- "requires": {
- "better-assert": "~1.0.0"
- }
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz",
- "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ="
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
- },
- "path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
- "dev": true
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz",
- "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw="
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
- "phin": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
- "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA=="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pixelmatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
- "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=",
- "requires": {
- "pngjs": "^3.0.0"
- }
- },
- "pngjs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
- "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
- },
- "pngquant-bin": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.2.tgz",
- "integrity": "sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==",
- "requires": {
- "bin-build": "^3.0.0",
- "bin-wrapper": "^4.0.1",
- "execa": "^0.10.0",
- "logalot": "^2.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "execa": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
- "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- }
- }
- },
- "portscanner": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/portscanner/download/portscanner-2.1.1.tgz",
- "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=",
- "optional": true,
- "requires": {
- "async": "1.5.2",
- "is-number-like": "^1.0.3"
- },
- "dependencies": {
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npm.taobao.org/async/download/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "optional": true
- }
- }
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
- },
- "prebuild-install": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz",
- "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==",
- "requires": {
- "detect-libc": "^1.0.3",
- "expand-template": "^2.0.3",
- "github-from-package": "0.0.0",
- "minimist": "^1.2.0",
- "mkdirp": "^0.5.1",
- "napi-build-utils": "^1.0.1",
- "node-abi": "^2.7.0",
- "noop-logger": "^0.1.1",
- "npmlog": "^4.0.1",
- "pump": "^3.0.0",
- "rc": "^1.2.7",
- "simple-get": "^3.0.3",
- "tar-fs": "^2.0.0",
- "tunnel-agent": "^0.6.0",
- "which-pm-runs": "^1.0.0"
- }
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
- },
- "pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
- },
- "process": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
- "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8="
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz",
- "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz",
- "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=",
- "dev": true
- },
- "proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "psl": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
- "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ=="
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
- "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
- },
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
- },
- "qs": {
- "version": "6.2.3",
- "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.2.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.2.3.tgz",
- "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
- "optional": true
- },
- "query-string": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
- "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
- "requires": {
- "decode-uri-component": "^0.2.0",
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- }
- },
- "queue": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz",
- "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==",
- "requires": {
- "inherits": "~2.0.3"
- }
- },
- "randomatic": {
- "version": "3.1.1",
- "resolved": "https://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz",
- "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=",
- "requires": {
- "is-number": "^4.0.0",
- "kind-of": "^6.0.0",
- "math-random": "^1.0.1"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz",
- "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8="
- }
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz",
- "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE="
- },
- "raw-body": {
- "version": "2.4.1",
- "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.1.tgz",
- "integrity": "sha1-MKyC+Yu1rowVLmcUnayNVRU7Fow=",
- "optional": true,
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.3",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
- "rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- }
- },
- "read-chunk": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz",
- "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ="
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg%2Fdownload%2Fread-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- },
- "readable-stream": {
- "version": "3.4.0",
- "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.4.0.tgz",
- "integrity": "sha1-pRwmdUZY4KPCHb9ZFjvUW6b0R/w=",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz",
- "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
- "requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz",
- "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
- "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz?cache=0&sync_timestamp=1565170823020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring_decoder%2Fdownload%2Fstring_decoder-1.1.1.tgz",
- "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "redent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
- "requires": {
- "indent-string": "^2.1.0",
- "strip-indent": "^1.0.1"
- },
- "dependencies": {
- "strip-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
- "requires": {
- "get-stdin": "^4.0.1"
- }
- }
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz",
- "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
- "requires": {
- "is-equal-shallow": "^0.1.3"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz",
- "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpp%2Fdownload%2Fregexpp-2.0.1.tgz",
- "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=",
- "dev": true
- },
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz",
- "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4="
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "requires": {
- "is-finite": "^1.0.0"
- }
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
- }
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
- "optional": true
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "optional": true
- },
- "resize-img": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz",
- "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=",
- "requires": {
- "bmp-js": "0.0.1",
- "file-type": "^3.8.0",
- "get-stream": "^2.0.0",
- "jimp": "^0.2.21",
- "jpeg-js": "^0.1.1",
- "parse-png": "^1.1.1"
- },
- "dependencies": {
- "bmp-js": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz",
- "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038="
- },
- "file-type": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
- "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
- },
- "jimp": {
- "version": "0.2.28",
- "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz",
- "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=",
- "requires": {
- "bignumber.js": "^2.1.0",
- "bmp-js": "0.0.3",
- "es6-promise": "^3.0.2",
- "exif-parser": "^0.1.9",
- "file-type": "^3.1.0",
- "jpeg-js": "^0.2.0",
- "load-bmfont": "^1.2.3",
- "mime": "^1.3.4",
- "mkdirp": "0.5.1",
- "pixelmatch": "^4.0.0",
- "pngjs": "^3.0.0",
- "read-chunk": "^1.0.1",
- "request": "^2.65.0",
- "stream-to-buffer": "^0.1.0",
- "tinycolor2": "^1.1.2",
- "url-regex": "^3.0.0"
- },
- "dependencies": {
- "bmp-js": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz",
- "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo="
- },
- "jpeg-js": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz",
- "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII="
- }
- }
- },
- "jpeg-js": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz",
- "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4="
- }
- }
- },
- "resolve": {
- "version": "1.13.1",
- "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.13.1.tgz",
- "integrity": "sha1-vgqkwGrNUwg1BauzX01mkyqzXRY=",
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz",
- "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
- "dev": true
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
- },
- "resp-modifier": {
- "version": "6.0.2",
- "resolved": "https://registry.npm.taobao.org/resp-modifier/download/resp-modifier-6.0.2.tgz",
- "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=",
- "optional": true,
- "requires": {
- "debug": "^2.2.0",
- "minimatch": "^3.0.2"
- }
- },
- "responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "requires": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "dev": true,
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz",
- "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w="
- },
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "requires": {
- "align-text": "^0.1.1"
- }
- },
- "rimraf": {
- "version": "2.4.5",
- "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.4.5.tgz",
- "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
- "optional": true,
- "requires": {
- "glob": "^6.0.1"
- }
- },
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "dev": true,
- "requires": {
- "is-promise": "^2.1.0"
- }
- },
- "rx": {
- "version": "4.1.0",
- "resolved": "https://registry.npm.taobao.org/rx/download/rx-4.1.0.tgz",
- "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=",
- "optional": true
- },
- "rxjs": {
- "version": "5.5.12",
- "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-5.5.12.tgz?cache=0&sync_timestamp=1568815796923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-5.5.12.tgz",
- "integrity": "sha1-b6YbinfD15PbrycL7i9D9lLXQcw=",
- "optional": true,
- "requires": {
- "symbol-observable": "1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.0.tgz",
- "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk="
- },
- "safe-json-stringify": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/safe-json-stringify/download/safe-json-stringify-1.2.0.tgz",
- "integrity": "sha1-NW5EvJjx+TzkXfFLzXwBzahuCv0=",
- "optional": true
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
- "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "seek-bzip": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
- "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
- "requires": {
- "commander": "~2.8.1"
- },
- "dependencies": {
- "commander": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
- "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
- "requires": {
- "graceful-readlink": ">= 1.0.0"
- }
- }
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz",
- "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc="
- },
- "semver-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
- "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
- },
- "semver-truncate": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz",
- "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=",
- "requires": {
- "semver": "^5.3.0"
- }
- },
- "send": {
- "version": "0.16.2",
- "resolved": "https://registry.npm.taobao.org/send/download/send-0.16.2.tgz",
- "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=",
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "~1.6.2",
- "mime": "1.4.1",
- "ms": "2.0.0",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.0",
- "statuses": "~1.4.0"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz",
- "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY="
- },
- "statuses": {
- "version": "1.4.0",
- "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz",
- "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic="
- }
- }
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "optional": true,
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "optional": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "optional": true
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz",
- "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=",
- "optional": true
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "optional": true
- }
- }
- },
- "serve-static": {
- "version": "1.13.2",
- "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.13.2.tgz",
- "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=",
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.2",
- "send": "0.16.2"
- }
- },
- "server-destroy": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/server-destroy/download/server-destroy-1.0.1.tgz",
- "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz",
- "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=",
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz",
- "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=",
- "optional": true
- },
- "sharp": {
- "version": "0.23.4",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz",
- "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==",
- "requires": {
- "color": "^3.1.2",
- "detect-libc": "^1.0.3",
- "nan": "^2.14.0",
- "npmlog": "^4.1.2",
- "prebuild-install": "^5.3.3",
- "semver": "^6.3.0",
- "simple-get": "^3.1.0",
- "tar": "^5.0.5",
- "tunnel-agent": "^0.6.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "simple-concat": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
- "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
- },
- "simple-get": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
- "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
- "requires": {
- "decompress-response": "^4.2.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- }
- },
- "simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
- "requires": {
- "is-arrayish": "^0.3.1"
- },
- "dependencies": {
- "is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
- }
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz?cache=0&sync_timestamp=1568743500638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslice-ansi%2Fdownload%2Fslice-ansi-2.1.0.tgz",
- "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- }
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz",
- "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz",
- "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
- "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz",
- "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
- "requires": {
- "kind-of": "^3.2.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "socket.io": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/socket.io/download/socket.io-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocket.io%2Fdownload%2Fsocket.io-2.1.1.tgz",
- "integrity": "sha1-oGnF/qvuPmshSnW0DOBlLhz7mYA=",
- "optional": true,
- "requires": {
- "debug": "~3.1.0",
- "engine.io": "~3.2.0",
- "has-binary2": "~1.0.2",
- "socket.io-adapter": "~1.1.0",
- "socket.io-client": "2.1.1",
- "socket.io-parser": "~3.2.0"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "optional": true
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "engine.io-client": {
- "version": "3.2.1",
- "resolved": "https://registry.npm.taobao.org/engine.io-client/download/engine.io-client-3.2.1.tgz",
- "integrity": "sha1-b1TAR13khxWKGnx30QF4cItq3TY=",
- "optional": true,
- "requires": {
- "component-emitter": "1.2.1",
- "component-inherit": "0.0.3",
- "debug": "~3.1.0",
- "engine.io-parser": "~2.1.1",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "ws": "~3.3.1",
- "xmlhttprequest-ssl": "~1.5.4",
- "yeast": "0.1.2"
- }
- },
- "engine.io-parser": {
- "version": "2.1.3",
- "resolved": "https://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-2.1.3.tgz?cache=0&sync_timestamp=1568365944963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fengine.io-parser%2Fdownload%2Fengine.io-parser-2.1.3.tgz",
- "integrity": "sha1-dXq5cPvy37Mse3SwMyFtVznveaY=",
- "optional": true,
- "requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "~0.0.7",
- "base64-arraybuffer": "0.1.5",
- "blob": "0.0.5",
- "has-binary2": "~1.0.2"
- }
- },
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-2.0.1.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
- "optional": true
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
- "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
- "optional": true
- },
- "socket.io-client": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocket.io-client%2Fdownload%2Fsocket.io-client-2.1.1.tgz",
- "integrity": "sha1-3LOBA0NqtFeN2wJmOK4vIbYjZx8=",
- "optional": true,
- "requires": {
- "backo2": "1.0.2",
- "base64-arraybuffer": "0.1.5",
- "component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "~3.1.0",
- "engine.io-client": "~3.2.0",
- "has-binary2": "~1.0.2",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "socket.io-parser": "~3.2.0",
- "to-array": "0.1.4"
- }
- },
- "socket.io-parser": {
- "version": "3.2.0",
- "resolved": "https://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-3.2.0.tgz",
- "integrity": "sha1-58Yii2qh+BTmFIrqMltRqpSZ4Hc=",
- "optional": true,
- "requires": {
- "component-emitter": "1.2.1",
- "debug": "~3.1.0",
- "isarray": "2.0.1"
- }
- },
- "ws": {
- "version": "3.3.3",
- "resolved": "https://registry.npm.taobao.org/ws/download/ws-3.3.3.tgz?cache=0&sync_timestamp=1571495321314&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-3.3.3.tgz",
- "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=",
- "optional": true,
- "requires": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
- }
- }
- },
- "socket.io-adapter": {
- "version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/socket.io-adapter/download/socket.io-adapter-1.1.2.tgz",
- "integrity": "sha1-qz8Nb2a4/H/KOVmrWZH4IiF4m+k=",
- "optional": true
- },
- "socket.io-client": {
- "version": "2.3.0",
- "resolved": "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocket.io-client%2Fdownload%2Fsocket.io-client-2.3.0.tgz",
- "integrity": "sha1-FNW6LgC5vNFFrkQ6uWs/hsvMG7Q=",
- "optional": true,
- "requires": {
- "backo2": "1.0.2",
- "base64-arraybuffer": "0.1.5",
- "component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "~4.1.0",
- "engine.io-client": "~3.4.0",
- "has-binary2": "~1.0.2",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "socket.io-parser": "~3.3.0",
- "to-array": "0.1.4"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "optional": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
- "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
- "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
- "optional": true
- }
- }
- },
- "socket.io-parser": {
- "version": "3.3.0",
- "resolved": "https://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-3.3.0.tgz",
- "integrity": "sha1-K1KpalCf3zFEC6QP7WCUx9TxJi8=",
- "optional": true,
- "requires": {
- "component-emitter": "1.2.1",
- "debug": "~3.1.0",
- "isarray": "2.0.1"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "optional": true
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-2.0.1.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
- "optional": true
- }
- }
- },
- "sort-keys": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
- "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
- "requires": {
- "is-plain-obj": "^1.0.0"
- }
- },
- "sort-keys-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
- "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
- "requires": {
- "sort-keys": "^1.0.0"
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- },
- "source-map-resolve": {
- "version": "0.5.2",
- "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz",
- "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=",
- "requires": {
- "atob": "^2.1.1",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
- },
- "spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz",
- "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=",
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc="
- },
- "spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz?cache=0&sync_timestamp=1562834220236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.5.tgz",
- "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ="
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz",
- "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "squeak": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz",
- "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=",
- "requires": {
- "chalk": "^1.0.0",
- "console-stream": "^0.1.1",
- "lpad-align": "^1.0.1"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "statuses": {
- "version": "1.3.1",
- "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz",
- "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
- },
- "stream-buffers": {
- "version": "0.2.6",
- "resolved": "https://registry.npm.taobao.org/stream-buffers/download/stream-buffers-0.2.6.tgz",
- "integrity": "sha1-GBwI1bs2kARfaUAbmuanoM8zE/w=",
- "optional": true
- },
- "stream-throttle": {
- "version": "0.1.3",
- "resolved": "https://registry.npm.taobao.org/stream-throttle/download/stream-throttle-0.1.3.tgz",
- "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=",
- "optional": true,
- "requires": {
- "commander": "^2.2.0",
- "limiter": "^1.0.5"
- }
- },
- "stream-to": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz",
- "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0="
- },
- "stream-to-array": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz",
- "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=",
- "requires": {
- "any-promise": "^1.1.0"
- }
- },
- "stream-to-buffer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz",
- "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=",
- "requires": {
- "stream-to": "~0.2.0"
- }
- },
- "strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "string.prototype.trimleft": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
- "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string.prototype.trimright": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
- "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.3.0.tgz?cache=0&sync_timestamp=1565170823020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring_decoder%2Fdownload%2Fstring_decoder-1.3.0.tgz",
- "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=",
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
- "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
- "requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1570188663907&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz",
- "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc="
- }
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "requires": {
- "is-utf8": "^0.2.0"
- }
- },
- "strip-dirs": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
- "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
- "requires": {
- "is-natural-number": "^4.0.1"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g="
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "strip-outer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
- "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
- "requires": {
- "escape-string-regexp": "^1.0.2"
- }
- },
- "striptags": {
- "version": "2.2.1",
- "resolved": "https://registry.npm.taobao.org/striptags/download/striptags-2.2.1.tgz",
- "integrity": "sha1-TEULcI1BuL85zyTEn/I0/Gqr/TI="
- },
- "stylus": {
- "version": "0.54.7",
- "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz",
- "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==",
- "requires": {
- "css-parse": "~2.0.0",
- "debug": "~3.1.0",
- "glob": "^7.1.3",
- "mkdirp": "~0.5.x",
- "safer-buffer": "^2.1.2",
- "sax": "~1.2.4",
- "semver": "^6.0.0",
- "source-map": "^0.7.3"
- },
- "dependencies": {
- "css-parse": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz",
- "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=",
- "requires": {
- "css": "^2.0.0"
- }
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- },
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
- }
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
- "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "requires": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "dependencies": {
- "css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "css-what": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz",
- "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw=="
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- }
- }
- },
- "swig-extras": {
- "version": "0.0.1",
- "resolved": "https://registry.npm.taobao.org/swig-extras/download/swig-extras-0.0.1.tgz",
- "integrity": "sha1-tQP+3jcqucJMasaMr2VrzvGHIyg=",
- "requires": {
- "markdown": "~0.5.0"
- }
- },
- "swig-templates": {
- "version": "2.0.3",
- "resolved": "https://registry.npm.taobao.org/swig-templates/download/swig-templates-2.0.3.tgz",
- "integrity": "sha1-a0xDtGIXXfKo2oV6IEM3nsbqb9A=",
- "requires": {
- "optimist": "~0.6",
- "uglify-js": "2.6.0"
- }
- },
- "symbol-observable": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.0.1.tgz",
- "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
- "optional": true
- },
- "table": {
- "version": "5.4.6",
- "resolved": "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz",
- "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=",
- "dev": true,
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz",
- "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- }
- }
- },
- "tar": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz",
- "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==",
- "requires": {
- "chownr": "^1.1.3",
- "fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
- "minizlib": "^2.1.0",
- "mkdirp": "^0.5.0",
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "tar-fs": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz",
- "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==",
- "requires": {
- "chownr": "^1.1.1",
- "mkdirp": "^0.5.1",
- "pump": "^3.0.0",
- "tar-stream": "^2.0.0"
- }
- },
- "tar-stream": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz",
- "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==",
- "requires": {
- "bl": "^4.0.1",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- }
- },
- "temp-dir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
- "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0="
- },
- "tempfile": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz",
- "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=",
- "requires": {
- "temp-dir": "^1.0.0",
- "uuid": "^3.0.1"
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "tfunk": {
- "version": "3.1.0",
- "resolved": "https://registry.npm.taobao.org/tfunk/download/tfunk-3.1.0.tgz",
- "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=",
- "optional": true,
- "requires": {
- "chalk": "^1.1.1",
- "object-path": "^0.9.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&sync_timestamp=1573557628456&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "optional": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1573282918610&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "optional": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "optional": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "optional": true
- }
- }
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
- "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
- "requires": {
- "readable-stream": "2 || 3"
- }
- },
- "tildify": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz",
- "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
- "requires": {
- "os-homedir": "^1.0.0"
- }
- },
- "timed-out": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
- "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
- },
- "timm": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.2.tgz",
- "integrity": "sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw=="
- },
- "tinycolor2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
- "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g="
- },
- "titlecase": {
- "version": "1.1.3",
- "resolved": "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.3.tgz",
- "integrity": "sha1-/G1l/1grBgJBB2jvGgm3BQYxPcM="
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz",
- "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
- "dev": true,
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "to-array": {
- "version": "0.1.4",
- "resolved": "https://registry.npm.taobao.org/to-array/download/to-array-0.1.4.tgz",
- "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
- "optional": true
- },
- "to-buffer": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
- "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
- },
- "to-ico": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz",
- "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==",
- "requires": {
- "arrify": "^1.0.1",
- "buffer-alloc": "^1.1.0",
- "image-size": "^0.5.0",
- "parse-png": "^1.0.0",
- "resize-img": "^1.1.0"
- },
- "dependencies": {
- "image-size": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
- "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w="
- }
- }
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz",
- "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
- "requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz",
- "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=",
- "optional": true
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
- },
- "trim-repeated": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
- "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
- "requires": {
- "escape-string-regexp": "^1.0.2"
- }
- },
- "tslib": {
- "version": "1.10.0",
- "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.10.0.tgz",
- "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
- "ua-parser-js": {
- "version": "0.7.17",
- "resolved": "https://registry.npm.taobao.org/ua-parser-js/download/ua-parser-js-0.7.17.tgz",
- "integrity": "sha1-6exflJi57JEOeuOsYmqAXE0J7Kw=",
- "optional": true
- },
- "uberproto": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/uberproto/download/uberproto-1.2.0.tgz",
- "integrity": "sha1-YdTqsCT5CcTm6lK+hnxIlKS+63Y=",
- "optional": true
- },
- "uglify-js": {
- "version": "2.6.0",
- "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.6.0.tgz",
- "integrity": "sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE=",
- "requires": {
- "async": "~0.2.6",
- "source-map": "~0.5.1",
- "uglify-to-browserify": "~1.0.0",
- "yargs": "~3.10.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
- },
- "cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz?cache=0&sync_timestamp=1573943292170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "requires": {
- "center-align": "^0.1.1",
- "right-align": "^0.1.1",
- "wordwrap": "0.0.2"
- }
- },
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
- },
- "wordwrap": {
- "version": "0.0.2",
- "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
- },
- "yargs": {
- "version": "3.10.0",
- "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "requires": {
- "camelcase": "^1.0.2",
- "cliui": "^2.1.0",
- "decamelize": "^1.0.0",
- "window-size": "0.1.0"
- }
- }
- }
- },
- "uglify-to-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc="
- },
- "ultron": {
- "version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/ultron/download/ultron-1.1.1.tgz",
- "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=",
- "optional": true
- },
- "unbzip2-stream": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
- "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
- "requires": {
- "buffer": "^5.2.1",
- "through": "^2.3.8"
- }
- },
- "union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funion-value%2Fdownload%2Funion-value-1.0.1.tgz",
- "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=",
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- }
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz",
- "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
- }
- }
- },
- "upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&sync_timestamp=1567457281208&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz",
- "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ="
- },
- "upper-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz",
- "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz",
- "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
- },
- "url-parse-lax": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
- "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
- "requires": {
- "prepend-http": "^1.0.1"
- }
- },
- "url-regex": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz",
- "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=",
- "requires": {
- "ip-regex": "^1.0.1"
- }
- },
- "url-to-options": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
- "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz",
- "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8="
- },
- "useref": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/useref/-/useref-1.4.3.tgz",
- "integrity": "sha512-hX0qTEaDdzO3WfFl2KHQnSdaPSk8KqRaQ/nXXjBPrXzanew+12U/gm/Jt7zR978wtKMryOMXGoF0+qhYL2oseQ=="
- },
- "utif": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
- "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
- "requires": {
- "pako": "^1.0.5"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
- }
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "requires": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- }
- },
- "warehouse": {
- "version": "2.2.0",
- "resolved": "https://registry.npm.taobao.org/warehouse/download/warehouse-2.2.0.tgz",
- "integrity": "sha1-XQnWSUKZK+Zn2PfIagnCuK6gQGI=",
- "requires": {
- "JSONStream": "^1.0.7",
- "bluebird": "^3.2.2",
- "cuid": "~1.3.8",
- "graceful-fs": "^4.1.3",
- "is-plain-object": "^2.0.1",
- "lodash": "^4.2.1"
- }
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1574116720213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz",
- "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
- "optional": true
- },
- "which-pm-runs": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
- "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "window-size": {
- "version": "0.1.4",
- "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.4.tgz",
- "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY="
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
- "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=",
- "dev": true
- },
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz",
- "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
- "ws": {
- "version": "6.1.4",
- "resolved": "https://registry.npm.taobao.org/ws/download/ws-6.1.4.tgz?cache=0&sync_timestamp=1571495321314&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-6.1.4.tgz",
- "integrity": "sha1-W1yIAK+rkl6UzLKdFTyNAsF3bvk=",
- "optional": true,
- "requires": {
- "async-limiter": "~1.0.0"
- }
- },
- "xhr": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz",
- "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==",
- "requires": {
- "global": "~4.3.0",
- "is-function": "^1.0.1",
- "parse-headers": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
- "xml-parse-from-string": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
- "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig="
- },
- "xml2js": {
- "version": "0.4.23",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
- "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- }
- },
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
- },
- "xmlhttprequest-ssl": {
- "version": "1.5.5",
- "resolved": "https://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.5.tgz?cache=0&sync_timestamp=1564594177335&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxmlhttprequest-ssl%2Fdownload%2Fxmlhttprequest-ssl-1.5.5.tgz",
- "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
- "optional": true
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "yargs": {
- "version": "3.32.0",
- "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.32.0.tgz",
- "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
- "requires": {
- "camelcase": "^2.0.1",
- "cliui": "^3.0.3",
- "decamelize": "^1.1.1",
- "os-locale": "^1.4.0",
- "string-width": "^1.0.1",
- "window-size": "^0.1.4",
- "y18n": "^3.2.0"
- }
- },
- "yargs-parser": {
- "version": "4.2.1",
- "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-4.2.1.tgz",
- "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
- "optional": true,
- "requires": {
- "camelcase": "^3.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "optional": true
- }
- }
- },
- "yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
- "requires": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
- "yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
- "optional": true
- }
- }
-}
diff --git a/package.json b/package.json
index a1d3cff90f..75fb969245 100644
--- a/package.json
+++ b/package.json
@@ -1,48 +1,92 @@
{
"name": "aotu.io",
- "version": "2.6.3",
+ "version": "3.0.0",
"private": true,
+ "dependencies": {
+ "antd": "^4.11.2",
+ "classnames": "^2.2.6",
+ "core-js": "^3.9.0",
+ "cross-env": "^7.0.3",
+ "dayjs": "^1.10.4",
+ "detect-browser": "^5.2.0",
+ "isomorphic-fetch": "^3.0.0",
+ "lodash-es": "^4.17.21",
+ "normalize.css": "^8.0.1",
+ "query-string": "^5.1.1",
+ "react": "^17.0.1",
+ "react-dom": "^17.0.1",
+ "react-markdown": "^5.0.3",
+ "react-router-dom": "^5.2.0",
+ "react-scripts": "^4.0.1",
+ "remark-breaks": "^2.0.1",
+ "remark-gfm": "^1.0.0",
+ "resize-observer-polyfill": "^1.5.1",
+ "three": "^0.125.1",
+ "typo.css": "^2.1.2"
+ },
+ "devDependencies": {
+ "@commitlint/config-conventional": "^11.0.0",
+ "@craco/craco": "^6.1.1",
+ "@types/classnames": "^2.2.11",
+ "@types/isomorphic-fetch": "^0.0.35",
+ "@types/query-string": "^5.1.0",
+ "@types/react": "^17.0.0",
+ "@types/react-dom": "^17.0.0",
+ "@types/react-modal": "^3.10.6",
+ "@types/react-router-dom": "^5.1.7",
+ "@typescript-eslint/eslint-plugin": "^4.13.0",
+ "@typescript-eslint/parser": "^4.13.0",
+ "commitlint": "^11.0.0",
+ "eslint": "^7.17.0",
+ "eslint-config-prettier": "^7.1.0",
+ "eslint-plugin-react": "^7.22.0",
+ "eslint-plugin-react-hooks": "^4.2.0",
+ "husky": "^4.3.7",
+ "lint-staged": "^10.5.3",
+ "node-sass": "^4.14.1",
+ "prettier": "^2.2.1",
+ "stylelint": "^13.8.0",
+ "stylelint-config-prettier": "^8.0.2",
+ "stylelint-config-recess-order": "^2.3.0",
+ "stylelint-config-standard": "^20.0.0",
+ "stylelint-order": "^4.1.0",
+ "stylelint-prettier": "^1.1.2",
+ "stylelint-scss": "^3.18.0",
+ "typescript": "^4.1.3"
+ },
"scripts": {
- "serve": "hexo s --watch",
- "build": "hexo g",
+ "start": "craco start",
+ "build": "craco build",
+ "test": "craco test",
"deploy": "sh ./.travis/deploy.sh",
- "start": "hexo",
- "clean": "rm -rf public/js/libs && rm -rf public/js/mods"
+ "build:pre-release": "cross-env REACT_APP_RELEASE_ENV=uat craco build",
+ "build:release": "cross-env REACT_APP_RELEASE_ENV=prod GENERATE_SOURCEMAP=false craco build",
+ "prettier": "prettier --write 'src/**/*.{ts,tsx,css,scss}'",
+ "eslint-fix": "eslint src/**/*.ts[x] --fix",
+ "stylelint-fix": "stylelint src/**/*.scss src/**/*.css --fix"
},
- "hexo": {
- "version": "3.9.0"
+ "commitlint": {
+ "extends": [
+ "@commitlint/config-conventional"
+ ]
},
- "dependencies": {
- "cheerio": "^0.22.0",
- "fs-extra": "^7.0.1",
- "hexo": "^3.8.0",
- "hexo-deployer-git": "1.0.0",
- "hexo-filter-cleanup": "mamboer/hexo-filter-cleanup",
- "hexo-generator-archive": "^0.1.5",
- "hexo-generator-baidu-sitemap": "mamboer/hexo-generator-baidu-sitemap",
- "hexo-generator-category": "^0.1.3",
- "hexo-generator-fragments": "github:mamboer/hexo-generator-fragments",
- "hexo-generator-index": "^0.2.1",
- "hexo-generator-json-feed": "^1.0.0",
- "hexo-generator-lunr": "^1.0.5",
- "hexo-generator-sitemap": "^1.2.0",
- "hexo-generator-tag": "^0.2.0",
- "hexo-generator-xfeed": "^1.2.4",
- "hexo-renderer-ejs": "*",
- "hexo-renderer-marked": "^0.3.2",
- "hexo-renderer-stylus": "mamboer/hexo-renderer-stylus",
- "hexo-server": "^0.3.3",
- "hexo-util": "^0.6.3",
- "hexo-wordcount": "6.0.1",
- "lodash": "^4.17.11",
- "lunr": "github:codepiano/lunr.js.git"
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged",
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
+ }
},
- "devDependencies": {
- "eslint": "^5.16.0",
- "eslint-config-defaults": "^9.0.0",
- "js-yaml": "^3.13.1"
+ "lint-staged": {
+ "src/**/*.ts[x]": [
+ "prettier --parser=babel-ts --write",
+ "eslint",
+ "git add"
+ ],
+ "src/**/*.scss": [
+ "prettier --parser=css --write",
+ "stylelint --syntax scss --fix",
+ "git add"
+ ]
},
- "optionalDependencies": {
- "hexo-browsersync": "^0.3.0"
- }
+ "license": "MIT"
}
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
new file mode 100644
index 0000000000..e89a2f80d1
Binary files /dev/null and b/public/android-chrome-192x192.png differ
diff --git a/public/android-chrome-256x256.png b/public/android-chrome-256x256.png
new file mode 100644
index 0000000000..27359d39f6
Binary files /dev/null and b/public/android-chrome-256x256.png differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 0000000000..14dd28e0c7
Binary files /dev/null and b/public/apple-touch-icon.png differ
diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png
new file mode 100644
index 0000000000..60ae87edaa
Binary files /dev/null and b/public/favicon-16x16.png differ
diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png
new file mode 100644
index 0000000000..872df2a4b5
Binary files /dev/null and b/public/favicon-32x32.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000..b69facb0e9
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000000..2112f2ce46
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Aotu.io「凹凸实验室」
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/scaffolds/draft.md b/scaffolds/draft.md
deleted file mode 100644
index 45b1bb754f..0000000000
--- a/scaffolds/draft.md
+++ /dev/null
@@ -1,3 +0,0 @@
-title: {{ title }}
-tags:
----
diff --git a/scaffolds/page.md b/scaffolds/page.md
deleted file mode 100644
index c96f1a2451..0000000000
--- a/scaffolds/page.md
+++ /dev/null
@@ -1,14 +0,0 @@
-title: {{ title }}
-subtitle: "用来一句话描述文章"
-cover: git-flow.jpg
-date: {{ date }}
-tags:
- - Git
- - Fork
-author:
- nick: 凹凸实验室
- github_name: o2team
-
----
-
-
diff --git a/scaffolds/post.md b/scaffolds/post.md
deleted file mode 100644
index cd58e3a717..0000000000
--- a/scaffolds/post.md
+++ /dev/null
@@ -1,15 +0,0 @@
-title: {{ title }}
-subtitle: "用来一句话描述文章"
-cover: git-flow.jpg
-date: {{ date }}
-categories: Web开发
-tags:
- - Git
- - Fork
-author:
- nick: 凹凸实验室
- github_name: o2team
-
----
-
-
diff --git a/source/MP_verify_WodMfpikxIaPhNpp.txt b/source/MP_verify_WodMfpikxIaPhNpp.txt
deleted file mode 100644
index c9726714fa..0000000000
--- a/source/MP_verify_WodMfpikxIaPhNpp.txt
+++ /dev/null
@@ -1 +0,0 @@
-WodMfpikxIaPhNpp
\ No newline at end of file
diff --git a/source/_data/cases.yml b/source/_data/cases.yml
deleted file mode 100644
index 8b984c61c9..0000000000
--- a/source/_data/cases.yml
+++ /dev/null
@@ -1,97 +0,0 @@
-- type: case
- name: Taro
- desc: 多端统一开发框架,支持用 React 的开发方式编写一次代码,生成能运行在微信/百度/支付宝/字节跳动小程序、H5、React Native 等的应用。
- link: https://taro.jd.com
- preview: //taro.jd.com
- tags:
- - Taro
-- type: case
- name: Taro-UI
- desc: 一款基于 Taro 框架开发的多端 UI 组件库
- link: https://taro-ui.jd.com
- preview: //taro-ui.jd.com
- tags:
- - Taro
-- type: case
- name: Taro 物料市场
- desc: Taro 物料市场,让每一个 Taro 轮子产生价值
- link: https://taro-ext.jd.com
- preview: //taro-ext.jd.com
- tags:
- - Taro
-- type: case
- name: Taro 官方论坛
- desc: Taro 官方社区让每一次交流被沉淀
- link: https://taro-club.jd.com
- preview: //taro-club.jd.com
- tags:
- - Taro
-- type: case
- name: 拇指期刊
- desc: 由凹凸实验室3个美少女精心整理的HTML5案例期刊,每个案例附带创意、技术分析,开阔你的专业视界。
- link: https://github.com/o2team/cases
- preview: //cases.aotu.io/mobi/maga.html
- tags:
- - 期刊
- - HTML5
-- type: case
- name: Athena
- desc: 不仅仅是前端自动化流程构建工具,Athena还可以将构建流程数据化、可视化。
- link: https://github.com/o2team/athena
- preview: //athena.aotu.io/
- tags:
- - ATHENA
- - 前端自动化
-- name: 前端代码规范
- desc: 凹凸实验室整理的前端开发规范,与最新前端技术同步修正。
- link: https://github.com/o2team/guide
- preview: //guide.aotu.io/
- tags:
- - guide
- - frontend
- - specification
- - 前端规范
- - JS编码规范
- - CSS编码规范
-- name: HaloJS
- desc: 一个敏捷易用的移动端组件库。
- link: https://github.com/o2team/halojs
- preview: //halojs.aotu.io/
- tags:
- - 移动端组件库
-- name: 邮件签名工具
- desc: 一个简单易用的邮件签名制作工具,高度定制化。
- link: https://github.com/o2team/sign
- preview: //sign.aotu.io/
- tags:
- - 邮件签名
-- name: MAC全栈环境
- desc: MAC全栈开发环境搭建指引可以让你快速将你的MAC搭建成强悍的全栈开发利器.
- link: https://github.com/o2team/mac
- preview: //mac.aotu.io/
- logo: /img/home/mac-guide.png
- bgc: 23232e
- tags:
- - mac
- - guide
-- name: Excel Filter
- desc: Excel数据可视化过滤工具
- link: https://github.com/o2team/xcel
- preview: //xcel.aotu.io
- tags:
- - xcel
- - excel
-- name: 凹凸公开课
- desc: 凹凸实验室对外公开的分享或系列课程
- link: https://github.com/o2team/JDHot
- preview: //aotu.jd.com/share/
- tags:
- - share
-- name: AT-UI
- desc: 一款轻量级、模块化的前端UI组件库
- link: https://github.com/AT-UI/at-ui
- preview: //at.aotu.io
- tags:
- - 前端组件
- - UI
- - Vue
\ No newline at end of file
diff --git a/source/_data/cates.yml b/source/_data/cates.yml
deleted file mode 100644
index bab5cc18de..0000000000
--- a/source/_data/cates.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-- text: 全部文章
- value: 全部文章
- url: index.html
-- text: Web开发
- value: Web开发
- url: cates/Web开发/index.html
-- text: 移动开发
- value: 移动开发
- url: cates/移动开发/index.html
-- text: H5游戏开发
- value: H5游戏开发
- url: cates/H5游戏开发/index.html
-- text: 人工智能
- value: 人工智能
- url: cates/人工智能/index.html
-- text: NodeJS
- value: NodeJS
- url: cates/NodeJS/index.html
-- text: 性能优化
- value: 性能优化
- url: cates/性能优化/index.html
-- text: 项目总结
- value: 项目总结
- url: cates/项目总结/index.html
-- text: 体验报告
- value: 体验报告
- url: cates/体验报告/index.html
-- text: 资源合集
- value: 资源合集
- url: cates/资源合集/index.html
-- text: 生活玩乐
- value: 生活玩乐
- url: cates/生活玩乐/index.html
diff --git a/source/_data/favicons.json b/source/_data/favicons.json
deleted file mode 100644
index b6cb21453e..0000000000
--- a/source/_data/favicons.json
+++ /dev/null
@@ -1 +0,0 @@
-["","","","","","","","","","","","","","","","","","","","","","","","",""]
diff --git a/source/_data/languages.yml b/source/_data/languages.yml
deleted file mode 100644
index 484237517b..0000000000
--- a/source/_data/languages.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-zh-cn:
- name: 简体中文
- disqus_lang: zh
-en: English
diff --git a/source/_data/links.yml b/source/_data/links.yml
deleted file mode 100644
index f737850068..0000000000
--- a/source/_data/links.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-- name:
小程序·云开发
- desc: 小程序·云开发
- link: https://www.cloudbase.net
-- name: 羚珑智能设计
- desc: 京东羚珑智能设计
- link: https://ling.jd.com
-- name: 京东零售设计服务平台
- desc: 京东零售设计服务平台
- link: https://jdrd.jd.com
-- name: JDC京东设计中心
- desc: 京东设计中心
- link: https://jdc.jd.com
-- name: Deep Ocean
- desc: 腾讯 Deep Ocean
- link: http://dopro.io/
-- name: 百度FEX
- desc: 百度Web前端研发部
- link: http://fex.baidu.com
-- name: 淘宝FED
- desc: 淘宝前端团队
- link: http://taobaofed.org
-- name: TGIdeas
- desc: 腾讯互娱设计中心
- link: http://tgideas.qq.com
-- name: ISUX
- desc: 腾讯SNG设计中心
- link: http://isux.tencent.com
-- name: CDC
- desc: 腾讯用户研究与体验设计中心
- link: http://cdc.tencent.com
-- name: 携程UED
- desc: 携程设计委员会
- link: http://ued.ctrip.com
-- name: 优优教程网
- desc: 优优教程网
- link: https://uiiiuiii.com/
-- name: Designup
- desc: Designup
- link: https://www.designup.cn/
-- name: 百度EUX
- desc: 百度EUX
- link: http://eux.baidu.com/
diff --git a/source/_data/menu.yml b/source/_data/menu.yml
deleted file mode 100644
index 92f3b9543c..0000000000
--- a/source/_data/menu.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-home: index.html
-geek: https://geeks.aotu.io
-html5: https://cases.aotu.io
-about: about/
-join: join/
\ No newline at end of file
diff --git a/source/_data/words.json b/source/_data/words.json
deleted file mode 100644
index 118a40214c..0000000000
--- a/source/_data/words.json
+++ /dev/null
@@ -1,94 +0,0 @@
-[
- {
- "en":"A friend in need is a friend indeed.",
- "zh-cn": "患难见真交."
- },
- {
- "en":"A good medicine tastes bitter.",
- "zh-cn": "良药苦口."
- },
- {
- "en":"After a storm comes a calm.",
- "zh-cn": "雨过天晴."
- },
- {
- "en":"All roads lead to rome.",
- "zh-cn": "条条大道通罗马."
- },
- {
- "en":"Art is long, but life is short.",
- "zh-cn": "人生有限,学海无涯."
- },
- {
- "en":"Better late than never.",
- "zh-cn": "只要开始,虽晚不迟。"
- },
- {
- "en":"Early to bed and early to rise makes a man healthy, wealthy, and wise.",
- "zh-cn": "早睡早起,富裕聪明身体好。"
- },
- {
- "en":"East, west, home is best.",
- "zh-cn": "金窝银窝,不如自己的草窝。"
- },
- {
- "en":"Everyday and in every way i’m getting better.",
- "zh-cn": "每天每个方面我的生活都正在好转。"
- },
- {
- "en":"Just do it!",
- "zh-cn": "做了再说!"
- },
- {
- "en":"Great hopes make great man.",
- "zh-cn": "远大的希望,造就伟大的人物。"
- },
- {
- "en":"It is good to learn at another man’s cost.",
- "zh-cn": "前车之鉴。"
- },
- {
- "en":"It is never too late to mend. ",
- "zh-cn": "亡羊补牢,犹为未晚。"
- },
- {
- "en":"Knowledge is power.",
- "zh-cn": "知识就是力量。"
- },
- {
- "en":"Look before you leap. first think, then act.",
- "zh-cn": "三思而后行。"
- },
- {
- "en":"More haste, less speed. ",
- "zh-cn": "欲速则不达。"
- },
- {
- "en":"Never too old to learn.",
- "zh-cn": "活到老,学到老。"
- },
- {
- "en":"No pain, no gain.",
- "zh-cn": "天下事没有不劳而获的东西。"
- },
- {
- "en":"Nothing is difficult to the man who will try. ",
- "zh-cn": "世上无难事,只要肯登攀。"
- },
- {
- "en":"Practice makes perfect.",
- "zh-cn": "熟能生巧。"
- },
- {
- "en":"Well begun is half done. ",
- "zh-cn": "好的开端是成功的一半。"
- },
- {
- "en":"Where there is a will, there is a way.",
- "zh-cn": "有志者,事竟成。"
- },
- {
- "en":"A journey of a thousand miles begins with single step.",
- "zh-cn":"千里之行,始于足下。"
- }
-]
diff --git a/source/_posts/2015-10-08-aotu-blog-v1.md b/source/_posts/2015-10-08-aotu-blog-v1.md
deleted file mode 100644
index aff11326ba..0000000000
--- a/source/_posts/2015-10-08-aotu-blog-v1.md
+++ /dev/null
@@ -1,128 +0,0 @@
-title: 凹凸实验室博客V1.0.0发布
-subtitle: "凹凸实验室博客是一个托管于Github的静态博客,基于HEXO搭建,主题的定做参考自future-imperfect的扁平简约,暂且命名为`o2`。"
-cover: //img13.360buyimg.com/ling/jfs/t1/45433/23/2569/97180/5d070321E45a2e35e/193b43b5bc410695.jpg
-date: 2015-10-08 10:24:35
-categories: 项目总结
-tags:
- - Hexo
- - 项目总结
-author:
- nick: LV主唱大人
- github_name: mamboer
----
-
-
-筹备了两周多,凹凸实验室博客 V1.0.0 正式发布啦,欢迎同学们体验并提供建议。
-它是一个托管于Github的静态博客,基于HEXO搭建,主题的定做参考自[future-imperfect](http://html5up.net/future-imperfect)的扁平简约,暂且命名为`o2`。主题单独开源于 [hexo-theme-o2](https://github.com/o2team/hexo-theme-o2),有兴趣的朋友可以自由下载使用。
-
-> 2016年12月更新:当前主题为全新设计,不再使用`hexo-theme-o2`,喜欢的童鞋可以直接fork [o2team/o2team.github.io](https://github.com/o2team/o2team.github.io)的源码。
-
-
-
-## 博客的一些特性
-
-1. 使用github头像
-
- 记得将你们在github的头像更新到最帅,将你github的用户名在文章内头部填好即可!
-
-2. [hexo-wordcount](https://npmjs.org/package/hexo-wordcount) 显示博文字数
-3. [不蒜子](http://ibruce.info/2015/04/04/busuanzi/) 统计博文的pv
-4. 每日一句英文警句
-5. [多说](http://duoshuo.com)评论
-
-## 使用指引
-
-1. 安装hexo
-
- ```
- npm i hexo-cli -g
- ```
-
-2. 将o2team.github.io的源码拉到本地
-
- ```
- git clone git@github.com:o2team/o2team.github.io.git o2team
- ```
-
-3. 初始化子模块(submodules)
-
- ```
- cd o2team
- git submodule init
- git submodule update
-
- # 切换至themes/o2目录,签出master分支
- cd ../themes/o2
- git checkout master
- ```
-
-4. 安装nodejs包
-
- ```
- # 切换回根目录下
- cd ../../
- npm install
- ```
-
-5. 运行`hexo s --watch`
-
- 运行上述命令后,浏览器打开 [http://localhost:4000](http://localhost:4000) 即可本地访问我们的网站
-
-## 创建文章
-
-有两种方法创建文章,可任选其一:
-
-> 注意:文件名不要出现中文!!!
-
-1. 使用`hexo new` 命令
-
- ``` bash
- $ hexo new "My New Post"
- ```
-
-2. 拷贝现有的文章进行修改
-
- hexo使用markdown来编辑文章,在source目录下,拷贝任意md文件进行创建新的文章。具体可参考下hexo的官方说明
-
-## 文章规范
-
-1. 使用markdown写博文
-2. 博文图片统一位置:`source/img/post/`
- 在博客内容中可以使用 `pimg` 自定义标签来引用图片。注意别覆盖了别人的图片!!!
- 其语法格式为:
- `{% raw %}{% pimg imageName [alt text] [JSONImageAttibutes] %}{% endraw %}`
- 例如:
- `{% raw %}{% pimg post-aotu.jpg "空格请用%20来区分" '{"title":"hello","class":"test_img"}' %}{% endraw %}`
- 需要注意的是:`pimg` 利用空格来划分字段属性,如果一个属性的值需要空格,请将空格用`%20`代替!!!
-
-3. 为了保证博客整体美观,每个文章需要一张配图(大小:840x340)
-4. 指明文章的副标题、作者信息、封面图片地址
-
- ```
- subtitle: "凹凸实验室博客是一个托管于Github的静态博客,基于HEXO搭建..."
- date: 2015-11-20 00:24:35
- cover: "封面图片地址"
- tags:
- - Hexo
- author:
- nick: LV主唱大人
- github_name: mamboer
-
- ```
-5. 利用` `设置文章的摘要
-
- 示例:
- ```
- title: 文章标题
- ---
- 这部分是文章摘要,这部分是文章摘要。在hexo模版里可通过 {% raw %}{{ post.excerpt }}{% endraw %} 来引用。
-
- 这里是文章的剩余部分。在hexo模版里可通过{% raw %}{{ post.more }}{% endraw %} 来引用。
- ```
-
- 实际使用请参考[本文]({{ raw_link('_post/2015-11-20-aotu-blog-v1.md') }})。
-
-## 关于博客的发布
-
-为了便于统一维护,博客的发布由`LV`负责。同学们写好博文并在本地预览OK后直接提交Github即可。
-
diff --git a/source/_posts/2015-10-13-start-postcss.md b/source/_posts/2015-10-13-start-postcss.md
deleted file mode 100644
index 662931c826..0000000000
--- a/source/_posts/2015-10-13-start-postcss.md
+++ /dev/null
@@ -1,368 +0,0 @@
-title: PostCSS快速入门使用
-subtitle: "PostCSS 是一套利用JS插件实现的用来改变CSS的工具.这些插件能够支持变量和混合语法,转换未来CSS语法,内联图片,还有更多"
-date: 2015-10-13 09:34:25
-cover: //img14.360buyimg.com/ling/jfs/t1/48017/11/2528/73775/5d07034dE7165a710/2f3b0fa0b5db7a9c.jpg
-categories: Web开发
-tags: Web开发
-author:
- nick: Sky
- github_name: cnt1992
----
-
-## 初识PostCSS
-
-如果你第一次听说`PostCSS`这个东西,那么请看下面摘自官方`Github`的介绍:
-
-> PostCSS is a tool for transforming CSS with JS Plugins. These plugins can support variables and mixins, transpile future CSS syntax, inline images, and more
-
-翻译成中文的意思如下:
-
-> PostCSS 是一套利用JS插件实现的用来改变CSS的工具.这些插件能够支持变量和混合语法,转换未来CSS语法,内联图片,还有更多
-
-我们用过`Less`、`SASS`等工具来对CSS做`预处理`操作,按照它们约定的语法来书写并且最终转换成可用的样式,这付出的代价是**必须先熟悉这个工具的书写语法**。
-
-随着近几年 [Grunt](http://gruntjs.cn/)、[Gulp](http://gulpjs.com/)、[Webpack](http://webpack.github.io/docs/) 等自动化工具的兴起,`组合式应用`变得非常的热门,那`PostCSS`存在的意义是什么呢?答案是:**CSS生态系统**
-
-`PostCSS`拥有非常多的插件,诸如自动为CSS添加浏览器前缀的插件`autoprefixer`、当前移动端最常用的`px`转`rem`插件`px2rem`,还有支持尚未成为CSS标准但特定可用的插件`cssnext`,还有很多很多。就连著名的`Bootstrap`在下一个版本`Bootstrap 5`也将使用`PostCSS`作为样式的基础。
-
-一句话来概括PostCSS:**CSS编译器能够做到的事情,它也可以做到,而且能够做得更好**
-
-## 快速使用PostCSS
-
-上面大致介绍了`PostCSS`,也许我们并没有在头脑里形成对它的认知,那下面我们就通过一个简单地实例来看看如何使用`PostCSS`。
-
-`PostCSS`得益于插件,支持Grunt,Gulp,webpack,Broccoli,Brunch还有ENB,这里我们将以`Gulp`作为实例来讲。
-
-
-### 环境准备
-
-创建并进入我们的实例目录
-
-``` bash
-mkdir postcss-demo && cd postcss-demo
-```
-
-然后快速生成`package.json`文件
-
-``` bash
-# --yes 参数能够帮助我们快速生成默认的package.json
-npm init --yes
-```
-
-将上面创建的`package.json`文件的`main`参数改为`gulpfile.js`,然后安装我们所需的依赖
-
-```bash
-# gulp跟gulp-postcss是必须的,后面两个插件为了演示用途
-npm i gulp gulp-postcss autoprefixer autoprefixer-core cssnext --save-dev -d
-```
-
-创建`gulpfile.js`
-
-```bash
-# 这里用命令行进行创建,你也可以手动新建
-touch gulpfile.js
-```
-
-### 修改gulpfile.js
-
-将下面代码贴进`gulpfile.js`
-
-```javascript
-var gulp = require('gulp');
-var postcss = require('gulp-postcss');
-var autoprefixer = require('autoprefixer');
-var cssnext = require('cssnext');
-
-//定义css任务
-gulp.task('css', function(){
- //定义postcss任务流数组
- var processors = [
- autoprefixer({
- browsers:['last 3 version'],
- cascade: false,
- remove: false
- }),
- cssnext()
- ];
- return gulp.src('./src/css/*.css')
- .pipe(postcss(processors))
- .pipe(gulp.dest('./dist'));
-});
-```
-
-### 创建示例样式
-
-在项目根目录下创建src目录,再在src目录下面创建css目录,然后创建style.css文件
-
-``` bash
-# 这里用命令创建,你也可以手动创建
-mkdir -p src/css && touch style.css
-```
-
-编辑样式如下:
-
-```css
-h1{
- display:flex;
-}
-
-:root {
---fontSize: 1rem;
---mainColor: #12345678;
---highlightColor: hwb(190, 35%, 20%);
-}
-
-body {
-color: var(--mainColor);
-
-font-size: var(--fontSize);
-line-height: calc(var(--fontSize) * 1.5);
-padding: calc((var(--fontSize) / 2) + 1px);
-}
-
-```
-
-
-### 运行实例
-
-一切准备就绪之后可以在项目根目录下执行刚才我们定义的任务
-
-```bash
-gulp css
-```
-
-如果不出什么意外的话就会在根目录下面生成一个`dist`文件夹,里面有一个样式文件,内容如下:
-
-```css
-body{
- display:-webkit-flex;
- display:-ms-flexbox;
- display:-webkit-box;
- display:flex;
-}
-
-body {
-color:#123456;
-color:rgba(18, 52, 86, 0.47059);
-
-font-size:16px;
-font-size:1rem;
-line-height:24px;
-line-height:1.5rem;
-padding:calc(0.5rem + 1px);
-}
-```
-
-我们可以看到我们写的样式自动添加了浏览器前缀,并且一些未来CSS语法也被转换了。
-
-## 了解PostCSS
-
-通过上面的实例我们应该知道`PostCSS`的使用方法,此时让我们先回想一下`CSS预处理器`的使用历程:
-
-1. 学习该CSS预处理器的语法特性,诸如:变量定义、嵌套、继承
-2. 在特定后缀名(.less/.scss等)的文件按照上面的语法进行编写
-3. 通过Gulp/Grunt/Webpack等自动化工具或者手动编译成CSS样式
-
-而`PostCSS`的使用历程:
-
-1. 直接按照CSS标准语法来书写CSS样式文件
-2. 通过Gulp/Grunt/Webpack等自动化工具加载PostCSS插件转换输出
-
-通过对比我们类比一个结论:*CSS预处理器好比给你一个工具箱,工具箱里面有什么东西该怎么拿已经跟你约定好,你必须按照这个规则来拿;而PostCSS好比给你一个盒子,你可以从旁边选择自己需要的工具放进盒子打包拿走,如果还不够用你可以自己造一个工具*
-
-## 深入PostCSS
-
-`PostCSS`自身只包括了`CSS分析器`,`CSS节点树API`,`source map生成器`,`CSS节点拼接器`,而基于`PostCSS`的插件都是使用了`CSS节点树API`来实现的。
-
-我们都知道CSS的组成如下:
-
-```css
-element {
- prop1 : rule1 rule2 ...;
- prop2 : rule1 rule2 ...;
- prop2 : rule1 rule2 ...;
- ...
-}
-```
-
-也就是一条一条的样式规则组成,每一条样式规则包含一个或多个属性跟值。所以`PostCSS`的执行过程大致如下:
-
-1. Parser
- 利用`CSS分析器`读取CSS字符内容,得到一个完整的`节点树`
-
-2. Plugin
- 对上面拿到的`节点树`利用`CSS节点树API`进行一系列的转换操作
-
-3. Plugin
- 利用`CSS节点拼接器`将上面转换之后的节点树重新组成CSS字符
-
-4. Stringifier
- 在上面转换期间可利用`source map生成器`表明转换前后字符的对应关系
-
-
-### PostCSS性能
-
-在PostCSS官方推特上看到,由JavaScript编写的PostCSS比C++编写的libsass还要快3倍,下面来自官方推特的截图:
-
-
-
-
-如果你对上面的性能截图有疑问,可以亲自来[这里](https://github.com/postcss/benchmark)测试看看。
-
-
-### 开始编写自己的PostCSS插件
-
-`PostCSS`在自己的[Github](https://github.com/postcss/postcss#plugins)上放了一些常用的插件,更多的插件可以在[postcss.parts](http://postcss.parts/)进行搜索。
-
-但有时候已有的插件不满足我们的需求,这个时候需要编写自己的PostCSS插件,下面我们将一步步创建一个简单的插件,这个插件功能非常简单,如下:
-
-```css
-/*
- 文件位置:src/css/style.css
- */
-h1 {
- font-family: "\5FAE\8F6F\96C5\9ED1",fontstack('Arial');
-}
-```
-
-当输入上面的样式时,会生成下面的样式:
-
-```css
-/*
- 文件位置:dist/style.css
- */
-h1 {
- font-family: "\5FAE\8F6F\96C5\9ED1",tahoma,arial;
-}
-```
-
-### 环境准备
-
-我们将以`Gulp`作为基础来实现我们的插件,首先创建项目文件夹
-
-```bash
-mkdir postcss-plugin && cd postcss-plugin
-```
-
-然后快速创建`package.json`文件:
-
-```bash
-npm init --yes
-```
-
-紧接着先安装必备的包
-
-```bash
-npm i gulp postcss gulp-postcss --save-dev -d
-```
-
-再创建`gulpfile.js`并且输入下面内容:
-
-```javascript
-var gulp = require('gulp');
-var postcss = require('gulp-postcss');
-
-gulp.task('css', function(){
- var processors = [
- ];
- return gulp.src('./src/css/*.css')
- .pipe(postcss(processors))
- .pipe(gulp.dest('./dist'));
-});
-```
-
-### 创建插件文件夹
-
-我们在执行`npm install`安装的包都放置在`node_modules`文件夹下面,这里我们创建PostCSS的插件文件夹,注意:**PostCSS的插件命名格式为:postcss-插件名字**
-
-```bash
-# 这里采用命令新建文件夹,你也可以手动创建
-mkdir node_modules/postcss-fontstack
-```
-
-### 创建插件入口文件
-
-现在我们可以在`postcss-fontstack`文件夹创建入口文件`index.js`,`PostCSS`创建插件的方式如下:
-
-```javascript
-var postcss = require('postcss');
-module.exports = postcss.plugin('插件名字', function 插件名字(选项){
- //这里写插件代码
-})
-```
-
-那我们可以在`index.js`里面贴入下面代码:
-
-```javascript
-var postcss = require('postcss');
-
-modules.exports = postcss.plugin('fontstack', function fontstack( options ){
- return function( css ){
- options = options || {};
-
- var fontstack_config = {
- 'Arial': 'tahoma,arial',
- 'Times New Roman': 'TimesNewRoman, "Times New Roman", Times, Baskerville, Georgia, serif'
- };
-
- function toTitleCase( str ){
- return str.replace(/\w\S*/g,function( txt ){
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
- });
- }
-
- // css.walkRules方法用来遍历每一条css规则
- css.walkRules( function( rule ){
- // walkDecls方法用来解析属性跟值
- rule.walkDecls( function( decl, i ){
- var value = decl.value;
- if( value.indexOf( 'fontstack(' ) !== -1 ){
- var fontstack_requested = value.match(/\(([^)]+)\)/)[1].replace(/["']/g,"");
- fontstack_requested = toTitleCase( fontstack_requested );
-
- var fontstack = fontstack_config[ fontstack_requested ];
-
- var firstFont = value.substr( 0, value.indexOf('fontstack(') );
-
- var newValue = firstFont + fontstack;
-
- decl.value = newValue;
- }
- });
-
- });
- }
-});
-```
-
-在`gulpfile.js`引入上面的插件,代码如下:
-
-```javascript
-var gulp = require('gulp');
-var postcss = require('gulp-postcss');
-
-gulp.task('css', function(){
- var processors = [
- ];
- return gulp.src('./src/css/*.css')
- .pipe(postcss(processors))
- .pipe(gulp.dest('./dist'));
-});
-```
-
-### 运行实例
-
-在项目根目录下运行实例,最终实现我们的效果
-
-```bash
-gulp css
-```
-
-## 再谈PostCSS
-
-基于`PostCSS`能够做到很多`CSS预处理器`做不到的事情,未来发展前景还是挺不错的,而且最新的`Atom`编辑器也可以下载插件来支持`PostCSS`这种语法。
-
-但这就意味着`CSS预处理器`过时了么?不会。`PostCSS`的出现并不是为了替换掉之前的技术,只是提供多一种思路让我们去考虑,就比如Sass编译后再加`autoprefixer`自动补齐浏览器前缀这种做法当前还是比较流行的。
-
-再回到文章最开始说的,`PostCSS`其实是在打造一个改变CSS开发方式的生态系统。也许暂时我们还是保持传统的开发方式,但未来对于`PostCSS`我还是保持关注,它是值得期待的。
-
diff --git a/source/_posts/2015-10-16-vim-list.md b/source/_posts/2015-10-16-vim-list.md
deleted file mode 100644
index 6472a13290..0000000000
--- a/source/_posts/2015-10-16-vim-list.md
+++ /dev/null
@@ -1,63 +0,0 @@
-title: 我的vim二三事
-subtitle: "用了几年Vim,我发现我越来越喜欢它了,和好多人一样喜欢它,也许喜欢的理由各不相同,但大抵有如下几个。"
-date: 2015-10-16 10:24:35
-cover: //img30.360buyimg.com/ling/jfs/t1/55254/34/2612/122532/5d070399E87268b74/a1bca545ac8b1293.jpg
-categories: Web开发
-tags: Web开发
-author:
- nick: honlyhuang
- github_name: huangliyn
----
-
-## 前言
-> 选择你所喜欢的,爱你所选择的--列夫·托尔斯泰
-
-### 不是理由的理由
-
-用了几年Vim,我发现我越来越喜欢它了,和好多人一样喜欢它,也许喜欢的理由各不相同,但大抵有如下几个:
-+ 即使你用了几年了,你还是会在某天惊呼原来还可以这么操作,**它总会给你带来惊喜**。
-+ 当你要操作的时候你根本不用去想那些快捷键(也许不能叫快捷键,它是谓语{operator}和宾语{text-objects},组合在一起形成不同指令,好像自然语言),它们就在你意识里。也许开始的时候你需要去记一些快捷键(别的编辑器不用吗?),但记住以后你熟练了,就像是骑自行车,你就忘记它的存在,你只用输出你的思想,**它让你更专注你要做的事情本身**。
-+ 虽然会有很多的快捷键以便让不同的人找到他们最佳的操作方式,但是**每个人常用的不外乎特定的十几个快捷键**,而这些快捷键都是有内在逻辑让你记住的,比如:d(elete)删除,D(elete)删除到行尾,d(elete)
-a w(ord) 删除一个词。
-+ 如果懒,那么你学Vim是没错的,它是**变化中的永恒**,那么多的编辑器更新迭代,它们都有vi模式或vi插件,你可以用你所学,一如既往。
-+ 它有**非常多的插件**,你可以定制一些自己喜欢的强大功能。(这其实也是个缺点的吧,毕竟自己配置多费时间呀,不过好些人一个配置用了十多年)。[到底有多强大呢,看看知乎上这篇文章。](http://www.zhihu.com/question/20151659)
-
-我知道上面这些说得太抽象了,也许我们应该来点具体的,你可以边看边对比一下你使用的编辑器的操作:
-
-| 编辑 | 用 Vim |
-| :----| :----- |
-| 如何向下移动7行 | 7j |
-| 如何删除一个词(word) | dw |
-| 如何删除一行 | dd |
-| 如何删除{}里的内容 | di{ |
-| 光标移动到第80行 | 80G |
-| 如何在当前文件里搜索光标所在位置的词| *(#) |
-| 如何在50行到100行之间查找并替换| :50,100/old/new/g |
-| 如果你想在同一文件中对比两个不同的块时怎么做| :sp (to 'split' the view) |
-| 如果你想要打开光标所在文件名的文件 | gf (which means 'g'o to this 'f'ile) |
-| 如果你想要得到每行前10个字母而它后面的数据不是你想要的 | ctrl-v (win 下是ctrl-q) |
-| 如果你想要转换别人给到你的混合大小的文件变成小写 | 1GVG u |
-| 录制一系列命令然后执行 | 用宏 |
-| 在width:16px的数字16上加20 | 20 ctrl+a |
-| 输入23+45+119的结果 | ctrl+r=23+45+119 |
-
-以上的这些操作都是直接在键盘上操作的,没有用鼠标。
-
-喜欢一个人的时候总能说出好多的理由,而不喜欢却只需要一个理由。此时我赞美我的女神你也在心里列举了你心中女神的诸多可爱美丽特点。所以可以想象各种关于编辑器文章下的各种互喷吐槽,即使是同一个编辑器的文章下也不免相互吐槽,毕竟不同人理念也是不一样的。
-
-
-### 有所为有所不为
-
-vim是个高效的文本编辑器,在文本编辑这一领域可谓是独步天下,高手[使用vim处理SRT字幕内容](http://zhuanlan.zhihu.com/vim-non-programming/19918627),痴迷者除了使用vim写代码、[发邮件](http://www.vimer.cn?p=1222)、[看股票](http://bluegene8210.is-programmer.com/posts/67910.html)、写博客、写markdown(这篇文章就是vim写的markdown)还[使用vim浏览网页](http://www.iplaysoft.com/vimium-and-vimperator.html),普通人可以把它作为[普通人的编辑利器](http://blog.sina.com.cn/s/blog_45dac66f010005kw.html)。在文本编辑领域,后来者只有模仿而无法超越vim。小李飞刀独步天下却也砍不了骨头,在代码编程领域,公认的最适合的场景是做Unix/Linux服务器编程,不用下载服务器端的文件而直接修改;其次是编写html/css/javascript/shell/python/c等;最后在mac、linux下要改文件用系统带的vim随手改改。而编写Java
-EE、Objective-C等还是用Eclipse、XCode等IDE的比较好。
-
-### 君子性非异也,善假于物也
-vim只是一个工具而已,它并不能让你码代码的能力提升,只能帮你更快速地输出你的思维。每一个工具都有它特定的场景,聪明的人总会在适当的场景做出合适的选择。好多人都说学习起来好难的呀,投入的成本换来的收益是不是成正比的呢?我觉得还是值得的,上面也说过,它是万变中的不变,同时它真的是个高效的工具,另外也许最后出来的高效的编辑外还带给你一些东西,比如好奇发现带来的惊喜,又如你发现你用了几年还有好多不会的谦虚,还有用宏解决了一个棘手问题的喜悦。最后它只是一个工具,是雕刻林诗音松木人像的小刀,或是冠绝武林的小李飞刀,关键在人。
-
-### 不积跬步无以至千里
-佛渡有缘人,细想这个‘有缘人’还挺有意思的,其实就是信的人,不信的说再多也是没有用的。如果想学,不必卸载你的是编辑器,做出破釜沉舟之势,万一用了两天觉得不方便或是有紧急的要修改的内容,要换回来用熟悉的编辑器。另外也不要觉得一时学不会就感觉挫折,毕竟很多东西都不可一蹴而就的,需要一点积累,所以慢慢来的。那些《7天XX》《21精通XX》真的害了好多人,慢慢来,实在不行认为自己笨了,不还有勤能补拙吗?好多的编辑器都有vi插件或模式,你可以找一找然后装上试试的,等熟悉了觉得不满足了再换成vim,要是觉得一直用vi插件也不错的就一直用着,能解决问题的顺手的才是最高效的。
-
-### 选择你所喜欢的,爱你所选择的
-我在小学的时候搞了个小霸王说要学习五笔,然后字根没有背完就忘记了,大学时候再一个想起这个事决定再学五笔,然后没有几天又放弃了,毕业两年后想起学五笔这个事,心里有个结,于是又学起来了,然后一直在用,虽然是五笔混合模式,偶尔也用纯五笔模式。vim就是在我可以用五笔的时候开始学的,当时拿同事的vimrc来直接就用了,现在也在用的,只是改了少许的地方,一直在够用就好的状态,然后在用的时候觉得有什么不自然的地方就找一下答案的,慢慢地越来越顺手了。细想我这个慢方法还是可取的,那么多我的命令我只会我常用的十几个,但那也是够用的了,并且是越来越喜欢,看着别人用的也还常发现还有很多不会的东西。
-
-再回首,一切是那样自然,一如vim的理念keep it simple,我也只装了平时常用的几个插件,还有一些比较强大的插件也没有用得着,所以没有装上。最近为了给同事们讲一下vim,才意识到虽然平时说vim有几个模式,但是用的时候自己也没有区分得很清楚,觉得就是一个整体,应该那样,有时候我们只是为了区分和认识一个东西才把它解构了,就像一首好的歌曲,我们只用觉得好听,那些乐评人说的为什么好感觉都很有道理。vim命令有多难记也还是有逻辑的;vim里可以快速精确的查找定位;vim真的好像一切文本皆对象,操作针对字符,词,行,块,文件这些对象;vim的设计哲学是如果你的工作只需要做一次,那没问题,怎么搞都行,如果你的工作是要重复地完成某些工作,则vim总可以帮你找到更少的按键方式来实现相同的目标。如[VimGolf](http://vimgolf.com/)所说Real Vim ninjas count every keystroke - do you?
diff --git a/source/_posts/2015-10-21-z-index-and-translate3d.md b/source/_posts/2015-10-21-z-index-and-translate3d.md
deleted file mode 100644
index 3097916283..0000000000
--- a/source/_posts/2015-10-21-z-index-and-translate3d.md
+++ /dev/null
@@ -1,55 +0,0 @@
-title: 探究transform动画元素的z-index
-subtitle: transform 变换的时候会让 z-index “临时失效”,其实并非 z-index 失效了,只是 z-index 被用在不同的 `stacking context` 上。
-date: 2015-10-21 10:24:35
-cover: //img20.360buyimg.com/ling/jfs/t1/84441/38/2530/39585/5d0703b9Eac796197/08404d066abc58cf.png
-categories: Web开发
-tags:
- - translate3d
- - zindex
-author:
- nick: 小振
- github_name: Manjiz
----
-
-## z-index 和 translate3d
-
-在一次需求中,需要做出三张卡牌走马灯式滚动的效果,由于在前面的一张卡牌需要挡住后面的卡牌,自然而然地就用 z-index 使前面的卡牌显示在最上面,配以 transform 动画让“走马灯”滚起来,在开发过程中,在 PC 侧 Chrome 中表现良好,在本人手机浏览器中也表现良好,最后测试时却发现,在微信客户端或 QQ 客户端中打开页面出现问题,“走马灯”滚动时,卡牌先通过 transform 就位后,才把 z-index 设置较大的卡牌置于上面,感觉上非常的不流畅。
-
-
-
-究其原因,发现这是某些浏览器的渲染规则,涉及到 `stacking context` 的概念,transform 的元素会创建新的 DOM,层级会在普通元素的上面,除了 transform ,还有哪些情况会创建新 `stacking context`呢?
-
-MDN 上有相关介绍:
-> * the root element (HTML),
-> * **positioned (absolutely or relatively) with a z-index value other than "auto",**
-> * **a flex item with a z-index value other than "auto",**
-> * **elements with an opacity value less than 1,**
-> * **elements with a transform value other than "none",**
-> * elements with a mix-blend-mode value other than "normal",
-> * elements with isolation set to "isolate", on mobile WebKit and Chrome 22+, position: fixed always creates a new stacking context, even when z-index is "auto",
-> * specifing any attribute above in will-change even you don't write themselves directly
-
-下图是对 transform 和 opacity 的测试结果:
-
-
-
-很明显,红色 div 都在绿色 div 上面了,说明真的有创建了个更高层级的 `stacking context`。再做进一步测试,我给两组的 div 都加了 `position:relative;z-index:1;`,结果绿色的都在上面了,手机微信上也一样,这能不能说明 z-index 对层级的影响大于 transform 和 opacity 呢。
-
-至于 transform 变换的时候会让 z-index “临时失效”,其实并非 z-index 失效了,只是 z-index 被用在不同的 `stacking context` 上,而非在默认的 context 上同等地比较层级了。所以 DOM 在 transform 的工程中,DOM 处于一个新的 `stacking context` 里,z-index 也是相对于这个 `stacking context` 的,所以表现出来的实际是 `stacking context` 的层次,动画一结束,DOM 又回到默认的 context 里,这时的 z-index 才是在同一个 context 上的比较。
-
-那该用什么方法来控制卡牌的层级,又能让动画流畅地表现呢,当然是 translate3d 中的 z-axis,很多时候我们并不知道它是用来做什么的,平常用得最多的只是它的 x-axis 和 y-axis,不妨先看个例子:
-
- .box1 {width:100px;height:100px;background:red;transform:perspective(100px) translate3d(0, 0, 100px);}
- .box2 {width:100px;height:100px;background:blue;transform:perspective(100px) translate3d(0, 0, 200px);}
-
-实际效果是,看不到它们,然后我们再设置 perspective 为 201px,这时可以很明显地看到,box2 占据了整个屏幕,而 box1 宽高约为 200px,唯有设置 translate3d(0,0,0) 时,宽高才为 100px。
-
-现在可以来理解下 perspective 和 translate3d 的关系,perspective 可以比作镜头和 DOM 的距离,实际上设置多少都没影响,因为它通过跟 z-axis 上的数值比例来影响样式,它更像是一个刻度,而 translate3d 的 z-axis 则表示了 DOM 和屏幕的距离。假定镜头跟屏幕的距离固定了,z-axis 越大,DOM 逐渐远离屏幕,靠近镜头,这时 DOM 看起来也就越大,当 z-axis 大于或等于 perspective 时,DOM元素已经在我们镜头的后面了,所以也就看不到它了。
-
-
-
-现在也就好理解为什么 perspective 和 translate3d 能够影响 DOM 的层级了,它们在屏幕和镜头之间的距离不同,所以就有了层次,移动端设备很好地表现了这个结论,但在 PC 的 Chrome 上测试则不然,我们仍需要 z-index 才会表现出我们需要的 层次关系。
-
-**参考**
-
-* http://segmentfault.com/q/1010000002480824
diff --git a/source/_posts/2015-10-26-zepto-cors.md b/source/_posts/2015-10-26-zepto-cors.md
deleted file mode 100644
index 99fcd6bf49..0000000000
--- a/source/_posts/2015-10-26-zepto-cors.md
+++ /dev/null
@@ -1,144 +0,0 @@
-title: 前方有坑,请绕道——Zepto 中使用 CORS
-subtitle: "一直以来,我们在移动端上面使用 zepto 并没有出现太大的问题。直至我们将 Ajax 跨域请求从 iframe 的方式切换成 CORS 之后。"
-date: 2015-10-26 12:24:22
-cover: //img12.360buyimg.com/ling/jfs/t1/51898/6/2545/140297/5d07043aE14d3c609/6cbb7838ddf76024.jpg
-categories: Web开发
-tags:
- - Zepto
- - CORS
-author:
- nick: koppt
- github_name: Koppthe
----
-
-众所周知,现在移动 Web 开发中,`Zepto.js` 是使用频率比较高的库之一。由于它的体积小,加载速度快,有着和 `jquery` 类似的 API,而备受开发者喜爱。可随着时间的推移,我们遇到了不少 `Zepto` 的坑,而且文件体积的大小跟代码的执行效率并没有什么关系,最后我们发现 `Zepto` 并没有太大的卵用。
-
-jsperf 上有个 `zepto` 和 `jquery` DOM 操作的对比测试,有兴趣可以看一下:[zepto vs jquery - selectors](http://jsperf.com/zepto-vs-jquery-2013/25)
-
->开源项目好坏的一个评判标准之一:是否有一个强大的社区和一批积极的贡献者
-
-
-我们简单的看一个对比:
-
-
-
-很明显,`Zepto` 的活跃度远远没有 `jquery` 高。不过言归正传,还是回到 `Zepto` 的话题上。
-
----
-
-一直以来,我们在移动端上面使用 `zepto`并没有出现太大的问题。直至我们将 Ajax 跨域请求从 iframe 的方式切换成 `CORS` 之后,一个比较隐蔽的 Bug 出现了。
-
-### 问题描述
-
-1. 页面在Webview中,点击按钮无效
-2. 页面在部分浏览器中,无法拉取到用户的信息
-
-### 问题定位
-
-我通过 `Fiddler` 或 `Charles` 抓包发现,在 webview 中,点击按钮之后的 Ajax 请求并未发出,但是页面在手机QQ浏览器和 PC 上表现都是正常的。因为是在切换 CORS 之后,页面才出现异常的,在此之前并没有版本迭代。所以 CORS 代码首当其冲要进行深层次的 code-review,于是我直接在 `CORS` 的代码块上进行 `try-catch`,结果捕获到异常:
-
-`INVALID_STATE_ERR: DOM Exception 11`
-
-
-### 问题深入剖析
-
-先来看看测试代码:
-
-```
-if (options.withCredentials) {
- options = $.extend(options, {
- xhr: function() {
- var xhr = new window.XMLHttpRequest()
- xhr.withCredentails = true
- return xhr
- }
-}}
-delete options.withCredentails
-
-$.ajax(options)
-```
-
-
-这段代码在大多数浏览器中都可以正常执行,但是在 Android 的 webview 和一些旧版本的手机浏览器中会抛出错误。
-
-以上代码和普通的 Ajax 请求不同的地方在于设置了 `CORS` 的 `withCredentials` 属性。(`CORS` 请求默认是不会带上 `cookies` 等身份信息的,如果需要在请求中带上 `cookies`,则需要设置 `XMLHttpRequest` 的 `withCredentials` 属性值为 true)
-
-下面通过两个例子来分析一下:
-
-例一:
-
-```
-var xhr = new XMLHttpRequest()
-xhr.withCrendentials = true
-xhr.open('POST', 'url', true)
-xhr.send()
-```
-
-这段代码在部分浏览器中依旧会抛出异常:`INVALID_STATE_ERR: DOM Exception 11`
-
-例二:
-
-```
-var xhr = new XMLHttpRequest()
-xhr.open('POST', 'url', true)
-xhr.withCredentials = true
-xhr.send()
-```
-
-这段代码可以正常执行,并不会抛出异常
-为什么 `xhr.withCredentials` 赋值在 `xhr.open()` 方法之前就会出错呢?
-
-秉着科(xian)学(de)严(dan)谨(teng)的态度,翻看了 W3C 在 2011 年和 2012 年关于 `XMLHttpRequest` 的规范文档,发现使用 `withCredentials` 属性的规范发生了改变。
-
-2011 年的规范:
-
-
-2012 年的规范:
-
-
-对比两份文档,我们重点看一下 step 1:
-2011 年的规范中规定当 `XMLHttpRequest` 的 `readyState` 状态不是 `OPENED` 时,会报错;
-2012 年的规范中规定当 `XMLHttpRequest` 的 `readyState` 状态不是 `UNSENT` 或 `OPENDED` 时,会报错;
-
-下面简单介绍一下 `XMLHttpRequest` 的 `readyState` 值:
-
-| Value | State | Description |
-| ------ | ----------- | -----------|
-| 0 | UNSENT | open() has not been called yet. |
-| 1 | OPENED | send() has not been called yet. |
-| 2 | HEADERS_RECEIVED | send() has been called,and headers and status are available. |
-| 3 | LOADING | Downloading;responseText holds partial data |
-| 4 | DONE | The operation is complete |
-
-由此可以看出,当一个 `XMLHttpRequest` 对象被创建时,默认的 `readyState` 状态为 `UNSENT`,只有执行了 open() 方法并且还没有执行 send() 方法时,`readyState` 的状态才为 `OPENED`。
-
-由于一些老版本的浏览器是按照 2012 年之前的规范来实现的,所以这一部分浏览器中,open() 方法要在设置 `withCredentials` 属性之前调用。因此为了兼容,正确的做法应该是在 open() 方法之后再设置 `withCredentials` 属性。
-
-下面来看看 zepto.js v1.1.3 的源码:
-```
-if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]
-
-var async = 'async' in settings ? settings.async : true
-
-xhr.open(settings.type, settings.url, async, settings.username, settings.password)
-```
-
-`zepto` 是在 open() 方法之前设置 `XMLHttpRequest` 的属性值的,所以这会导致在使用 `CORS` 并且设置 `withCredentials` 的时候,代码在部分浏览器中报错。Android webview 中重现的几率很大。
-
-----
-
-总结:在使用 `CORS` 时,如果要给 `withCredentials` 赋值,请务必要在 open() 方法之后,否则无法向后兼容。
-
-对于 zepto.js 的问题,已经有用户向作者提交了 PR,作者也表示会在下个版本中修复(可是直到今天,都更新到 v1.1.6 版本了,还是没有修复这个问题,更改一下代码顺序就那么难吗?!难怪阿里也嫌 zepto 更新速度太慢,问题多,所以自己 fork 代码进行了定制化)。
-
-所以目前如果要用 `zepto` 来进行 `CORS` 的话,还是需要自己更改 `zepto` 的 ajax 模块代码,然后手动构建。
-
-----
-
-### 参考资料:
-
-[XMLHttpRequest Level 2 2011](http://www.w3.org/TR/2011/WD-XMLHttpRequest2-20110816/#the-withcredentials-attribute)
-[XMLHttpRequest Level 1 2014](http://www.w3.org/TR/XMLHttpRequest/)
-[XMLHttpRequest Level 2 2014](http://www.w3.org/TR/XMLHttpRequest2/)
-[Zepto issues](https://github.com/madrobby/zepto/issues/921)
-
diff --git a/source/_posts/2015-11-02-flash-canvas.md b/source/_posts/2015-11-02-flash-canvas.md
deleted file mode 100644
index d553fc2e24..0000000000
--- a/source/_posts/2015-11-02-flash-canvas.md
+++ /dev/null
@@ -1,292 +0,0 @@
-title: 使用Adobe FLASH CC制作Canvas动画
-subtitle: "flash可以导出canvas动画,大大缩短制作动画所需要的时间。它是可视化IDE,可以让我们写少很多代码。做出来的动画,可以更加精确。"
-date: 2015-11-02 18:44:25
-cover: //img20.360buyimg.com/ling/jfs/t1/74339/1/2163/81630/5d070458Ec55b55bd/c827e30795f45b8c.png
-categories: Web开发
-tags:
- - Flash
- - Canvas
-author:
- nick: 圆姑娘她爹
- github_name: youing
-
----
-
-
-flash可以导出canvas动画,大大缩短制作动画所需要的时间。它是一个可视化IDE,可以让我们写少很多代码。做出来的动画,可以更加精确。同时,可以通用使用帧脚本中的 Javascript,为资源添加交互性。
-
-
-
-## 新建HTML5 Canvas项目
-
-
-
-### 舞台设置
-
-舞台大小修改为:600x600 (_这里可以根据设计稿调整所需要的舞台大小_)
-
-### 帧频
-
-是指每秒钟放映或显示的帧或图像的数量,这个数值设置越大,动画越快,但同时也是性能消耗大户。这里我们设置为36
-
-
-
-## 导入资源
-
-文件 > 导入 > 导入到库
-
-## 布局
-
-快捷键Ctrl + L或者窗口菜单下 > 库
-
-从资源库中把资源拖到舞台进去,通过移动拖拽的形式进行布局
-
-
-
-## 图形与影片剪辑
-
-我们可以将单独的动画,放到一个独立的影片剪辑里,这样可以更好的控制动画。几个独立的剪片剪辑,可以组成一个完整的动画。
-
-当我们把图片从资源库拖到舞台时,它这个时候,只是普通的位图,并不能做补帧动画,所以我们必须把它转换成元件。
-
-* **图形**由矢量图或者是位图组成。
-* **影片剪辑**包含在动画影片中的影片片段,有自己的时间轴和属性。具有交互性,是用途最广、功能最多的部分。
-
-下面制作以飘动的钱,做个例子说明
-
-选择位图,右键 > 转换为元件,这个时候,弹出一个对话窗口,我们首先选择“影片剪辑”,保存。双击进入刚才创始的影片剪辑,这个时候,由于刚才我们只是把位图转成了影片剪辑,但实际上,它里面,仍然是一个位图,所以并不能做动画操作。所以我们需要在影片剪辑里,把图片转换了“图形”。
-
-
-
-## 时间轴
-
-上面已经把图片转成图形元件,所以我们现在需要时间轴某个地方中插入关键帧。这里我们在30,60帧处插入关键帧。然后在30帧处,移动元件的位置,然后在每个关键帧的中间右键,选择“创建传统补间”。速度可以通过删除或者增加两个关键帧的补间动画时间长度来控制。
-
-
-
-
-
-## 动作播放控制
-
-如果我们希望动画可以连续从头再播放,可以在动画的最后一帧插入一个空白关键帧,打开动作面板,然后写上
-
-```
-this.gotoAndPlay(0)
-```
-
-
-
-
-即可回到第一帧重新播放,如果希望停止动画,则
-
-```
-this.stop();
-```
-
-如果希望跳到某帧去播放
-
-```
-this.gotoAndPlay(n)
-```
-
-如果希望跳到某帧并停止
-
-```
-this.gotoAndStop(n)
-```
-
-
-## 发布
-
-文件 > 发布设置
-
-### 文件输出
-
-* 循环时间轴(_表示是否循环整个动画_)
-* 覆盖HTML(_第一次发布时可以选上,如果对html有修改,记得把这个选项去掉,否则会对文件进行覆盖操作_)
-
-### 资源导出选项
-
-* 图像(_是否导出雪碧图_)
-* javascript命名空间(_基本上不需要修改_),这几个属于全局变量,可以在发布后的js文件中再修改。
-
-
-
-
-
-
-## 生成html
-
-最终会生成一个html文件和一个js文件
-
-### 生成的html文件
-
-* 框架自带的preloadjs,可以轻松管理资源预加载,它提供了相关api可以进行loading等操作。
-
-
-``` html
-
-
-
-
-people
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-### 生成的js文件
-
-* 生成的动画配置及脚本都在这个js文件里面,如果需要,可以手动修改相关数据。
-
-``` javascript
-(function (lib, img, cjs, ss) {
-
-var p; // shortcut to reference prototypes
-
-// library properties:
-lib.properties = {
- width: 600,
- height: 620,
- fps: 36,
- color: "#FFFFFF",
- manifest: [
- {src:"images/bigband.png", id:"bigband"},
- {src:"images/Bitmap1.png", id:"Bitmap1"},
- {src:"images/body.png", id:"body"},
- {src:"images/eye1.png", id:"eye1"},
- {src:"images/eye2.png", id:"eye2"},
- {src:"images/face1.png", id:"face1"},
- {src:"images/face2.png", id:"face2"},
- {src:"images/face3.png", id:"face3"},
- {src:"images/hair.png", id:"hair"},
- {src:"images/hand2.png", id:"hand2"},
- {src:"images/hand3.png", id:"hand3"},
- {src:"images/hand4.png", id:"hand4"},
- {src:"images/index30.png", id:"index30"},
- {src:"images/index302.png", id:"index302"},
- {src:"images/index40.png", id:"index40"},
- {src:"images/index5.png", id:"index5"},
- {src:"images/shadow.png", id:"shadow"}
- ]
-};
-
-
-
-// symbols:
-
-
-
-(lib.bigband = function() {
- this.initialize(img.bigband);
-}).prototype = p = new cjs.Bitmap();
-p.nominalBounds = new cjs.Rectangle(0,0,295,538);
-
-
-(lib.Bitmap1 = function() {
- this.initialize(img.Bitmap1);
-}).prototype = p = new cjs.Bitmap();
-p.nominalBounds = new cjs.Rectangle(0,0,543,577);
-
-
-(lib.body = function() {
- this.initialize(img.body);
-}).prototype = p = new cjs.Bitmap();
-p.nominalBounds = new cjs.Rectangle(0,0,521,242);
-
-
-(lib.eye1 = function() {
- this.initialize(img.eye1);
-}).prototype = p = new cjs.Bitmap();
-p.nominalBounds = new cjs.Rectangle(0,0,73,58);
-
-
-(lib.eye2 = function() {
- this.initialize(img.eye2);
-}).prototype = p = new cjs.Bitmap();
-p.nominalBounds = new cjs.Rectangle(0,0,72,35);
-
-
-(lib.face1 = function() {
- this.initialize(img.face1);
-}).prototype = p = new cjs.Bitmap();
-p.nominalBounds = new cjs.Rectangle(0,0,297,368);
-
-
-
-...
-
-// stage content:
-
-
-
-(lib.people = function() {
- this.initialize();
-
- // people
- this.instance = new lib.peoplemc();
- this.instance.setTransform(295,312.5);
-
- // qpmask (mask)
- var mask = new cjs.Shape();
- mask._off = true;
- mask.graphics.p("EgpUgqAMBU1AAAMAAABaIMhU1AAAg");
- mask.setTransform(278.5,308.1);
-
- // qp
- this.instance_1 = new lib.qpmc();
- this.instance_1.setTransform(291.5,263.5);
-
- this.instance_1.mask = mask;
-
- this.addChild(this.instance_1,this.instance);
-}).prototype = p = new cjs.Container();
-p.nominalBounds = new cjs.Rectangle(263,31.5,617,905.5);
-
-})(lib = lib||{}, images = images||{}, createjs = createjs||{}, ss = ss||{});
-var lib, images, createjs, ss;
-```
-
-
-## 附上最终效果
-
-[点我看效果](http://jdc.jd.com/demo/paul/flash_canvas/people.html)
-
diff --git a/source/_posts/2015-11-06-webp-responsive-image.md b/source/_posts/2015-11-06-webp-responsive-image.md
deleted file mode 100644
index c1240ca703..0000000000
--- a/source/_posts/2015-11-06-webp-responsive-image.md
+++ /dev/null
@@ -1,156 +0,0 @@
-title: Service Workers:采用WebP动态响应图片
-subtitle: "你可能听过**WebP**图片格式。相比于PNG图片,其文件大小能够节省26%;相比于JPEG图片,能够节省大约25%。"
-date: 2015-11-06 18:44:25
-categories: 性能优化
-tags:
- - WebP
-cover: //img11.360buyimg.com/ling/jfs/t1/74387/17/2091/85402/5d070791E25117dfc/52fac7950107d4f9.png
-author:
- nick: WEN
- github_name: wengeek
----
-
-> 译文地址:http://deanhume.com/Home/BlogPost/service-workers--dynamic-responsive-images-using-webp-images/10132/
-
-图片在如今的站点上不可或缺。试想一下,在我们网页上没有图片会怎样?高质量的图片能够使你的站点更加出色,但同时伴随着一定的性能损耗。由于图片文件较大,下载时间相对较长并且会减缓页面的加载。如果是一个带宽较低的用户,用户体验将会特别差。
-
-在移动设备上面,这种现象会更加明显。在移动设备上加载大型图片消耗时间取决你的网络以及连接速度。如果你是一个不耐心的用户,你将会变得沮丧。幸运的是,我们有能力处理 [响应式图片](https://responsiveimages.org/) 。通过使用 [picture](https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element) 标签,我们可以根据用户的设备为用户提供不同大小、设备像素比(DPR)以及格式的图片。例如,下面的代码就可以做到这一点。
-
-``` html
-
-
-
-
-```
-
-在上面的代码中,我们指定不同的图像大小及其相应的设备像素比给给定的屏幕宽度。使用 **picture** 标签,浏览器可以基于设备决定最佳的内容。以上的代码可以完美运行,我们可以进一步扩展,以适应更多的场景。
-
-你可能听过**WebP**图片格式。相比于PNG图片,其文件大小能够节省26%;相比于JPEG图片,能够节省大约25%-34%。目前,Chrome、Opera以及Android能够支持WebP格式,但Safari和IE尚未支持。既然我们能够用picture标签来处理响应式图片,我们也能够使用WebP格式的图片并且允许浏览器在不支持WebP时进行回退。
-
-
-
-让我们在上面代码的基础上,添加WebP图片的支持。同时,我们要确保能够根据不同的DPR使用最佳视觉效果的图片。
-
-``` html
-
-
-
-
-
-
-
-
-
-
-```
-
-在上面的代码中,我们已经创建了能够同时使用JPEG和WebP图片的picture标签。浏览器将根据设备决定最佳的选项。由于WebP并不支持IE和Safari,使用WebP图片意味着你需要在服务器上同时保存WebP和JPEG格式的图片副本。上面的代码足够满足我们当前的需求,但试想一下如果每张采用这种方式来编写,代码将会变得非常臃肿。当你的站点开始增长时,为每张图片编写上面的代码将会变得非常乏味。这时候,便可以采用Service Workers来解决这个问题。
-
-
-
-我们采用开发者工具观察HTTP请求头部,可以看出可以根据Accept头部来判断我们的浏览器是否支持WebP图片。为了利用这一点,并开始提供WebP图片,我们需要注册一个Service Worker。Service Worker的一大特性就是,它们能够拦截网络请求,这样子,我们就能够完全控制响应内容。使用这个特性,我们能够监听HTTP头部,并决定如何做。如果你想了解更多关于Service Workers的内容,可以看看这个[Github](https://github.com/slightlyoff/ServiceWorker)库获取更多的信息。
-
-我们在html页面添加如下代码用于注册Service Worker。以下的代码引用service-worker.js文件。
-
-``` html
-
-```
-
-在上面的代码中,我们做了一个简单的检查,判断浏览器是否支持Service Worker,如果支持,注册并安装Service Worker。这段代码代码最好的地方就是做了兼容处理,如果浏览器不支持Service Workers,它们会自动回退并且用户不会注意到其中差别。
-
-接下来,我们需要创建Service Worker文件‘service-worker.js‘,用于拦截正在传递到服务器的请求。
-
-``` javascript
-"use strict";
-
-// Listen to fetch events
-self.addEventListener('fetch', function(event) {
-
- // Check if the image is a jpeg
- if (/\.jpg$|.png$/.test(event.request.url)) {
-
- // Inspect the accept header for WebP support
- var supportsWebp = false;
- if (event.request.headers.has('accept')){
- supportsWebp = event.request.headers
- .get('accept')
- .includes('webp');
- }
-
- // If we support WebP
- if (supportsWebp)
- {
- // Clone the request
- var req = event.request.clone();
-
- // Build the return URL
- var returnUrl = req.url.substr(0, req.url.lastIndexOf(".")) + ".webp";
-
- event.respondWith(
- fetch(returnUrl, {
- mode: 'no-cors'
- })
- );
- }
- }
-});
-```
-
-上面的示例代码做了一系列的事情,让我们来一步步分解。
-
-在前面几行,我添加一个事件监听器来监听任何一个fetch事件。当每个请求发生时,先判断当前的请求是否是获取JPEG或者PNG格式的图片。如果当前的请求是获取图片,我就能根据HTTP请求头部来决定最佳的响应。在这种情况下,我通过检查Accept头部并且查找是否存在“image/webp“ Mime类型。一旦查询完头部的值,我就能确定浏览器是否支持WebP图片,如果浏览器支持WebP图片,就返回相应的WebP图片。
-
-现在,我们的HTML看起来比较整洁,能够支持WebP图片而并不臃肿。
-
-``` html
-
-
-
-
-```
-
-Service Workers给了我们无限的可能。在这个例子中,我们可以扩展到包括其他图片格式,甚至是缓存。你还能轻松地添加支持IE的[JPEGXR](http://caniuse.com/#feat=jpegxr)。这样子,我们能够更快地给我们的用户展示我们的页面。
-
-如果你想看看示例代码运行的效果,请移步到[deanhume.github.io/Service-Workers-WebP](https://deanhume.github.io/Service-Workers-WebP)。打开支持这些特性的浏览器,如Chrome,打开开发者工具,就可以看到页面的运行。
-
-### 参考资料
-* [https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element](https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element)
-* [http://scottjehl.github.io/picturefill/](http://scottjehl.github.io/picturefill/)
-* [https://developers.google.com/speed/webp/](https://developers.google.com/speed/webp/)
-* [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API)
diff --git a/source/_posts/2015-11-08-css-stack-order.md b/source/_posts/2015-11-08-css-stack-order.md
deleted file mode 100644
index 4687dd5873..0000000000
--- a/source/_posts/2015-11-08-css-stack-order.md
+++ /dev/null
@@ -1,238 +0,0 @@
-title: css层叠顺序探究
-subtitle: A stacking context is formed, anywhere in the document, by any element which is either
-date: 2015-11-08 11:44:25
-cover: //img12.360buyimg.com/ling/jfs/t1/44854/16/2603/81010/5d0728c5E958fc23e/c1bf8941f6a65560.png
-categories: Web开发
-tags:
- - CSS
-author:
- nick: 燕婷
- github_name: Yettyzyt
----
-嗯~一个比较基础但容易混乱的知识点~
-首先上一大段文绉绉的w3c规范以表明这是一篇严肃的学术文章(觉得太长可先跳过~):
-
-> In CSS 2.1, each box has a position in three dimensions. In addition to their horizontal and vertical positions, boxes lie along a "z-axis" and are formatted one on top of the other. Z-axis positions are particularly relevant when boxes overlap visually.
-> The order in which the rendering tree is painted onto the canvas is described in terms of stacking contexts. Stacking contexts can contain further stacking contexts. A stacking context is atomic from the point of view of its parent stacking context; boxes in other stacking contexts may not come between any of its boxes.
-> Each box belongs to one stacking context. Each positioned box in a given stacking context has an integer stack level, which is its position on the z-axis relative other stack levels within the same stacking context. Boxes with greater stack levels are always formatted in front of boxes with lower stack levels. Boxes may have negative stack levels. Boxes with the same stack level in a stacking context are stacked back-to-front according to document tree order.
->——[W3C][1]
-
-其实说人话,大致意思就是:
-**每个盒模型的位置是三维的,除了x轴和y轴,还有一个表示层叠的z轴;
-z轴上的位置决定了我们看到的盒模型之间的层叠效果(谁盖住谁)。**
-
-上述规范还解释了层叠上下文的特点以及盒模型的层叠级别,下面我们通过栗子慢慢探究。
-
-## 1. 浮动与行内
-*eg.1-1/eg.1-2共同结构与样式:*
-```html
-
-
-
-
-
-```
-```css
-div{border: 1px #000 dashed;height:200px;width:300px;text-align: center;}
-.div1{background-color: #FF4363;margin:0 0;}
-.div2{background-color: #FC9D99;margin:-170px 20px;}
-.div3{background-color: #F9CCAD;margin:-160px 40px;}
-.div4{background-color: #C7C7A8;margin:-150px 60px;}
-.div5{background-color: #84AF9B;margin:-140px -10px;}
-```
-
-----------
-
-*eg.1-1:常规流中非定位非行内元素的层叠情况*
-
-
-**结论: 常规流中非定位非行内的元素根据html顺序,按照“后来居上”的规则层叠。**
-
-----------
-
-*eg.1-2:定位元素/行内元素/浮动元素之间的层叠关系*
-
-
-**结论: 层叠顺序如下(高➡低):
-z-index为auto的定位元素;
-常规流内行内非定位元素;
-非定位的浮动元素;
-常规流内非行内非定位元素;
-z-index为负的定位元素。**
-
-## 2. 为定位元素设置z-index
-首先,你必须了解以下两点:
-- 每个定位元素都有一个整型的层叠级别(stack level);
-- z-index属性只对定位元素有效。
-
-----------
-
-*eg.2-1/eg.2-2共同结构与样式:*
-```html
-
-
-
-
-
-```
-```css
-div{border: 1px #000 dashed;height:200px;width:300px;text-align: center;}
-.div1{background-color: #FF4363;margin:0 0;}
-.div2{background-color: #FC9D99;margin:-170px 20px;}
-.div3{background-color: #F9CCAD;margin:-160px 40px;}
-.div4{background-color: #C7C7A8;margin:-150px 60px;}
-.div5{background-color: #84AF9B;margin:-140px -10px;}
-```
-
-----------
-
-*eg.2-1: 5个定位元素在未设置z-index时的层叠情况*
-
-
-**结论: z-index为auto的定位元素根据html顺序,按照“后来居上”的规则层叠。**
-
-----------
-
-*eg.2-2: 5个定位元素设置不同z-index时的层叠情况*
-
-
-**结论:
-定位元素的层叠级别由z-index的值决定,z-index为auto则其层叠级别为0(注意:只是层级为0,其z-index值仍为auto);
-同一层叠上下文中,层叠级别大的元素位于层叠级别小的元素之上;
-同一层叠上下文中,层叠级别相同的元素根据html顺序决定元素的层叠关系,遵循“后来居上”原则。**
-
-## 3. 层叠顺序(stack order)
-结合上面的例子进行总结,可得每一个层叠上下文内的层叠顺序:
-> Within each stacking context, the following layers are painted in back-to-front order:
-1. the background and borders of the element forming the stacking context.
-2. the child stacking contexts with negative stack levels (most negative first).
-3. the in-flow, non-inline-level, non-positioned descendants.
-4. the non-positioned floats.
-5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.
-6. the child stacking contexts with stack level 0 and the positioned descendants with stack level 0.
-7. the child stacking contexts with positive stack levels (least positive first).
->—[W3C][2]
-
-规范中的描述比较乏味,可结合[w3help][3]中的一张图片进行理解:
-> 
-
-## 4. 层叠上下文(stacking context)
-看完上述的例子,对于层叠顺序应该大致了解了。但突然冒出一个“层叠上下文”,这又是个什么鬼?
-
-### 4.1 层叠上下文的特点
-> 1. stacking context可以嵌套
-> 2. 每个stacking context相对于兄弟元素是完全独立的,其内部规则不会影响到外部
-> 3. 每个stacking context元素都会被父stacking context当做一个元素施加stacking规则
-> ——[Abruzzi][4]
-
-### 4.2 层叠上下文的创建
-#### 4.2.1 css2
-> The root element forms the root stacking context. Other stacking contexts are generated by any positioned element (including relatively positioned elements) having a computed value of 'z-index' other than 'auto'. Stacking contexts are not necessarily related to containing blocks.
-> ——[W3C][5]
-
-**CSS2中规定创建层叠上下文的两种情况:
-根元素(html);
-定位元素(absolute/relative)且z-index的值不为auto。**
-
-注:在同一层叠上下文中,父元素、子元素与自身都被当作是并级关系进行层叠级别的比较。他们之间可能互相层叠。
-
-----------
-
-*eg.4-1:z-index为auto的定位元素没有创建层叠上下文*
-```html
-
-
-```
-```css
-div{border: 1px #000 dashed;height:200px;width:400px;text-align: center;}
-.div1{background-color: #FF4363;}
-.div1_1{background-color: #FC9D99;margin:100px 0 0 50px;width: 300px;}
-.div2{background-color: #F9CCAD;line-height: 300px;}
-```
-
-分析上述例子:
-- **前提:**div1、div1_1、div2都是定位元素;div1、div2都没有设置z-index值。
-- **假设:**div1与div2创建了层叠上下文。不同层叠上下文之间是相对独立的,div1_1属于div1所创建的层叠上下文,与div2所创建的层叠上下文无关;根据“后来居上”原则,则div2应该在div1及其子元素div1_1之上。
-- **由上述例子可得:**div1的子元素div1_1在div2之上。
-- **因此:**div1、div2没有创建层叠上下文。
-
-**结论: z-index为auto的定位元素不会创建新的层叠上下文。**
-
-----------
-
-**IE中的BUG:**
-*在IE6-7浏览器中测试eg.4-1:*
-
-
-**结论: ie6-7中,z-index为auto的定位元素也会创建新的层叠上下文。**
-#### 4.2.2 css3
->A stacking context is formed, anywhere in the document, by any element which is either
-- the root element (HTML),
-- positioned (absolutely or relatively) with a z-index value other than "auto",
-- a flex item with a z-index value other than "auto",that is the parent element display: flex|inline-flex,
-- elements with an opacity value less than 1. (See the specification for opacity),
-- elements with a transform value other than "none",
-- elements with a mix-blend-mode value other than "normal",
-- elements with a filter value other than "none",
-- elements with isolation set to "isolate",
-- position: fixed
-- specifying any attribute above in will-change even if you don't specify values for these attributes directly (See this post)
-- elements with -webkit-overflow-scrolling set to "touch"
->——[MDN][6]
-
-**CSS3中规定创建层叠上下文的十种情况:**
- - **根元素 (HTML)**
- - **绝对(absolute)定位或相对(relative)定位且 z-index 值不为”auto”**
- - **一个 flex 项目(flex item),且 z-index 值不为 “auto”,也就是父元素 display: flex|inline-flex**
- - **元素的 opacity 属性值小于 1(参考 the specification for opacity)**
- - **元素的 transform 属性值不为 “none”**
- - **元素的 mix-blend-mode 属性值不为 “normal”**
- - **元素的 isolation 属性被设置为 “isolate”**
- - **在 mobile WebKit 和 Chrome 22+ 内核的浏览器中,position: fixed 总是创建一个新的层叠上下文, 即使 z-index 的值是 “auto”**
- - **在 will-change 中指定了任意 CSS 属性,即便你没有定义该元素的这些属性**
- - **元素的 -webkit-overflow-scrolling 属性被设置 “touch”**
-
-----------
-
-*eg.4-2:opacity创建新的层叠上下文*
-
-分析:
->If an element with opacity less than 1 is not positioned, implementations must paint the layer it creates, within its parent stacking context, at the same stacking order that would be used if it were a positioned element with ‘z-index: 0’ and ‘opacity: 1’.
->If an element with opacity less than 1 is positioned, the ‘z-index’ property applies as described in [CSS21], except that ‘auto’ is treated as ‘0’ since a new stacking context is always created.
->——[W3C][7]
-
-**结论:
-如果元素设置opacity小于1但未定位,视为css2中元素定位/z-index:0且opacity:1的情况;
-如果元素设置opacity小于1且定位,z-index为auto,视为css2中元素定位且z-index:0的情况;
-如果元素设置opacity小于1且定位,z-index不为auto,则根据css2的描述层叠。**
-(其他CSS3创建层叠上下文的元素情况与opacity相同,故不赘述。)
-
-----------
-
-至此,应该能够明白:
-- 根元素(html)会创建一个新的层叠上下文;
-- 上述CSS2/CSS3中的元素会创建新的层叠上下文;
-- 在每一个层叠上下文中都遵循上文中提到的层叠顺序;
-- 每一个层叠上下文(除根元素)在它的父层叠上下文中都以一个普通元素来对待,其内部的层叠规则不影响其本身在父层叠上下文(即其所属层叠上下文)中的层叠顺序。
-
-### 4.3 层叠上下文的层级
-- z-index值为auto的层叠上下文(z-index未设置的定位元素)层级为0;
-- z-index值为0(根元素/z-index为0的定位元素/css3中提到的除根元素与定位元素之外的其他会创建层叠上下文的未定位或已定位无设置z-index的元素)的层叠上下文层级为0;
-- z-index值已设置且不为0的层叠上下文层级(z-index已设置且不为0的定位元素)与z-index的值相等;
-- 相同层级的层叠上下文遵循“后来居上”的规则层叠。
-
-## 5. 小结
-- **属于同一层叠上下文的元素(无论它们在结构上是兄弟或父子,甚至是祖孙),都遵循上文所述的层叠顺序;**
-- **不同的层叠上下文之间,层级较大的层叠上下文元素及其内部元素位于层级小的层叠上下文元素及其内部元素之上;**
-- **不同的层叠上下文之间互相独立;**
-- **层叠上下文可嵌套,内部规则不影响外部。**
-
-[1]:http://www.w3.org/TR/CSS2/visuren.html#propdef-z-index
-[2]:http://www.w3.org/TR/CSS2/visuren.html#propdef-z-index
-[3]:http://www.w3help.org/zh-cn/kb/013
-[4]:http://blog.angular.in/css-stacking-contextli-na-xie-xian-wei-ren-zhi-de-keng/
-[5]:http://www.w3.org/TR/CSS2/visuren.html#propdef-z-index
-[6]:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
-[7]:http://www.w3.org/TR/css3-color/#transparency
diff --git a/source/_posts/2015-11-11-phantomJs-crawler.md b/source/_posts/2015-11-11-phantomJs-crawler.md
deleted file mode 100644
index fa71e9237c..0000000000
--- a/source/_posts/2015-11-11-phantomJs-crawler.md
+++ /dev/null
@@ -1,176 +0,0 @@
-title: 基于phantomJs的网络爬虫
-subtitle: "phantomJs是一个基于WebKit的服务器端JavaScript API。可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。"
-date: 2015-11-11 09:59:33
-cover: //img14.360buyimg.com/ling/jfs/t1/72384/35/2133/33582/5d0729e2E2274e3c5/0b8e3835a6eedcf8.png
-categories: Web开发
-tags:
- - PhantomJS
- - Crawler
-author:
- nick: 潘潘
- github_name: panxinwu
----
-# 基于phantomJs2.0的网络爬虫
-
-**phantomJs**是一个基于WebKit的服务器端JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。
-### 用途概述:
-
-
-- **屏幕快照** :官方提供的API中[page.render](http://phantomjs.org/api/webpage/method/render.html) 提供了强大的屏幕快照功能;
-- **网络爬虫** :[page.evaluate](http://phantomjs.org/api/webpage/method/evaluate.html) 方法提供了一个沙箱来帮助你像用js操作dom一样简单的获取你想要的内容,避免了使用复杂的正则匹配内容;
-- **网络情况监控** :定期对网站进行pageSpeed检查、可用于打开速度缓慢短信报警等服务(本文暂不做深入介绍)。
-- **页面自动化操作** :phantomJs2.0 提供了丰富的API用于页面自动化操作
-
--------------------
-
-## 关于安装
-
-> 网络上有大量的安装教程,如果你用的osx,建议直接`brew update && brew install phantomjs`。此处只叙述下在安装过程中遇到的一个坑。
-
-在Mac OS Yosemite 版本可能都会遇到这样一个问题:
-运行 `phantomjs hello.js` 后得到了报错信息:`Killed: 9`
-这个问题的原始链接在这里[github:issue/12928](https://github.com/ariya/phantomjs/issues/12928) 解决方案如下:[stackoverflow](http://stackoverflow.com/questions/28267809/phantomjs-getting-killed-9-for-anything-im-trying)
-1. Install UPX. UPX is an executable packer and unpacker
- `$ brew install upx`
-2. Unpack the phantomjs executable
- `$ upx -d phantomjs-2.0.0-macosx/bin/phantomjs`
-3. Run the phantomjs executable
- `$ ./phantomjs-2.0.0-macosx/bin/phantomjs`
-
-## 先感受下phantomJs的强大
-```
-var page = require('webpage').create();
-page.open('http://jd.com', function() {
-page.render('jd.png');
-phantom.exit();
-});
-```
-把以上代码保存到screen.js,切到terminal:
-`$ phantomejs screen.js`
-
-**可以得到如下的网站截图:**
-
-
->当然还可以继续[page.scrollPosition](http://phantomjs.org/api/webpage/property/scroll-position.html)以及Js脚本做延时截图,来避免截图中出现图片未加载完全等问题。
-
-## 页面自动化操作
-
-### 自动登录京东
-```
-var page = require('webpage').create();
-
-page.onLoadStarted =function() {
- loadInProgress =true;
- console.log("load started");
-};
-
-page.onLoadFinished = function() {
- loadInProgress = false;
- console.log("load finished");
-};
-page.onUrlChanged = function() {
- console.log("onUrlChanged");
-};
- page.open('https://passport.jd.com/new/login.aspx', function() {
- page.includeJs("http://apps.bdimg.com/libs/jquery/1.6.4/jquery.js", function() {
- var rect = page.evaluate(function() {
- $('#loginname').val('username');
- $('#nloginpwd').val('passwd');
- $('#loginsubmit')[0].click();
- return document.title;
- });
- //若引入jQuery 则用这种方法来实现click
- page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);
- console.log(rect);
- var clock =setTimeout(function(){
- page.render('jdlogin.png');
- phantom.exit();
- },2000);
- });
-});
-```
- > phantomJs2.0中click事件不是标准事件
- 若 `page.evaluate`中操作dom时并未引入jQuery,则应自己实现一个click事件如下:
-
-```
-function click(el){
- var ev = document.createEvent("MouseEvent");
- ev.initMouseEvent(
- "click",
- true /* bubble */, true /* cancelable */,
- window, null,
- 0, 0, 0, 0, /* coordinates */
- false, false, false, false, /* modifier keys */
- 0 /*left*/, null
- );
- el.dispatchEvent(ev);
-}
-```
-解决方案来自[stackoverflow:questions/15739263](http://stackoverflow.com/questions/15739263/phantomjs-click-an-element)
-
-**登录后截屏**
-
-
-> 可以看到此登录并未触发验证,若用别的网站被脱库的账号密码来批量查询的话,有很大概率撞库。
-
-## 网络爬虫
-### 数据抓取的快感
-> 众所周知知乎的搜索如此之烂,刚看过的问题,再搜就搜不到了,那把知乎上你想要的分类的问题抓取下来,自己搜索咯。(当然想这么一个烂理由来抓人家的数据也是醉人)。随便抓人家的数据不好,此处只做技术分享,切勿用于商业用途。
-
-##### 批量抓取知乎某个分类下的所有问题
-
-```
-var page = require('webpage').create(),
- testindex = 0,
- finalAns = [],
- fs = require("fs");
-page.onLoadStarted =function() {
- loadInProgress =true;
- console.log("load started");
-};
-
-page.onLoadFinished = function() {
- loadInProgress = false;
- console.log("load finished");
-};
-page.onUrlChanged = function() {
- console.log("onUrlChanged");
-};
-var circle = setInterval(function(){
- testindex++;
- if(testindex === 51){
- clearInterval(circle);
- phantom.exit();
- }
- page.open('http://www.zhihu.com/topic/19559937?page='+testindex, function(status) {
- if(status == 'fail'){
- testindex--;
- return;
- }
- var rect = page.evaluate(function() {
- var titleArr = [];
- window.scrollTo(0,document.body.scrollHeight);
- var title = $('.feed-item .question_link');
- for(var j = 0; j < title.length; j++){
- titleArr[j] = title[j].text;
- }
- return titleArr;
- });
- if(rect == null){
- testindex--;
- return;
- }
- file = fs.open("liuxue.txt", 'a');
- for(var h = 0; h < rect.length; h++){
- file.write(rect[h]+'\n');
- }
- file.close();
- });
-},2000);
-```
-> 其中用到了批量page.open 页面来控制翻页到所有的问题,然后将查询到的数据写入文件中,用到了File System API.
-
-### 运用场景畅想
- 1. 网络性能测试可用于批量、定期对竞品网站做查询,进行竞品分析如打开速度、改版频率等等。
- 2. 网络爬虫可批量获取数据进行竞品分析、行业报告等。
- 3. 页面自动化操作可用于网站自动化测试等。
diff --git a/source/_posts/2015-11-16-101-percent.md b/source/_posts/2015-11-16-101-percent.md
deleted file mode 100644
index 0011223507..0000000000
--- a/source/_posts/2015-11-16-101-percent.md
+++ /dev/null
@@ -1,214 +0,0 @@
-title: "101%还原"
-subtitle: "重构工程师不应该满足100%还原设计稿,更应该去追求101%还原度"
-date: 2015-11-16 21:39:14
-cover: //img11.360buyimg.com/ling/jfs/t1/40193/35/9186/16809/5d072a19E54ea1658/e89423b2aaea6579.png
-categories: Web开发
-tags:
-- 设计理念还原
-author:
- nick: 贴脸ADC
- github_name: mihanX
-
----
-
-*100%还原设计稿,还原误差不超1像素* 是重构工程师入行的最基本要求,而在实际工作中,这100%是远远不够的。
-
- 记得曾经带我的师傅说过一句话:
-
-> 重构工程师不应该满足100%还原设计稿,更应该去追求101%还原度。
-
-101%还原是重构工程师在还原设计稿的过程中,发挥自身的主观能动性,对设计稿进行修正或向产品、视觉、交互提出合理的建议,让最终还原出来的视觉设计稿更接近设计本意。
-
-101%的还原可以归为两类,一类是**对视觉稿的主动修正**,不包括具有信息传达的内容;另一类是**对视觉稿深入思考并提出合理建议**,包括但不限于具有信息传达的内容。
-
-## 对视觉稿的主动修正
-
-视觉设计师有时候会比较忙,设计稿中可能会出现像素之间的误差而造成不对齐的情况,如下面的设计稿:
-
-
-
-*(Retina 2X图)*
-
-很明显,视觉设计师原意是想让右则的按钮垂直居中对齐的,我们在还原的时候可以去微调边距让之对齐,得到下面的重构稿:
-
-
-
-*(重构稿1X图)*
-
-可以看到,还原出来的设计稿虽然和原设计稿并没有100%吻合,但是出来的效果确实更符合垂直居中对齐的准则,更接近设计的本意,而且节省了沟通的成本。
-
-有些同学许会问,在没有周知视觉设计师的情况下私下改动设计稿貌似有点不太尊重视觉设计师的工作吧?
-
-**对视觉稿的主动修正有一个很重要的原则,就是在没有信发生息传达的情况下修正,所作的修正不能违背设计本意。**拿刚才的例子来说,如果我个人不喜欢按钮的边角是方角的,就私下把方角还原成圆角,如下图:
-
-
-
-那就产生了还原稿与设计原稿之间的信息传达内容了,因为方角和圆角是两个不一样的设计风格,圆角按钮明显不是视觉设计师的设计本意,如果圆角按钮在视觉设计师完全不知情的情况下上了线,那就是真正的不尊重视觉设计师的工作了。
-
-当然视觉设计师都希望自己输出的设计稿完美无缺,但一些客观因素(交接模块)或主观上的操作(工作太忙,拖动元素排版的时候手抖)难免会让设计稿存在一些像素级的误差,对视觉稿的主动修正,是和视觉设计师协作的一种默契,如果每一项这样的修正都要让视觉设计师重新去调整再生成新的PSD文件的话,沟通成本未免过高
-
-## 对视觉稿深入思考并提出合理建议
-
-我们先看一下下面的设计稿:
-
-
-
-从视觉稿来看,视觉设计师把“关注本店”、“关注公众号”和“联系卖家”这三项的按钮所占的区域作了等分处理,按钮里面的文案和icon水平居中
-
-等分的排版,虽然个体之间的内容不一样会出现内容与分隔线边距不相等的情况,但是在按钮所占展示区域比例相等的情况下,三个按钮整体看上去是非常整齐的,排版逻辑很清晰:
-
-
-
-可以看出,让三个按钮在页面上的排版整体看起来是整齐的是设计师的设计本意,那么问题来了:
-
-在还原设计稿中,我们通常会考虑到布局的扩展性,会考虑到不足三个按钮或者多于三个按钮的排版情况,如果按照等分的排版型去还原,按钮出现增减的话,就会出现下面的情况:
-
-
-
-*(等分四个按钮)*
-
-
-
-*(等分:三个按钮)*
-
-
-
-*(等分:两个按钮)*
-
-
-
-*(等分:一个按钮)*
-
-可以看到,大于3个按钮的时候,文案的展示出现了问题,小于3个按钮的时候按钮的大小和文案与分隔线的间距就略显夸张了,特别是只有一个按钮的情况,几种情况的排版在视觉上变化都很大,而且视觉稿里是没有相应的展示的,那么这里面包含了排版之间的信息传达。
-
-**在还原过程中,当发生信息传达的时候,任何疑问和建议都应该周知相关的负责人,这是101%还原中的基本原则**
-
-把刚才上面的几种情况,写好demo向产品和视觉设计师展示,反馈并确认两个问题:
-
-* 按钮在不同的场景中最多展示的个数和最少展示的个数
-
-* 如果按钮展示个数有变,用等分自适应排版的话,以上情况的排版方式能否接受
-
-然后得到的答复是:
-
-*产品:最多展示3个,最少展示1个,排版看还有没有更好的*
-
-*视觉:按钮不用等分自适应,用定宽展示的*
-
-可以get到信息:
-
-等分自适应的排版在这里不适用:*对视觉设计稿排版信息的理解与视觉设计师的原意有出入*
-
-与产品和视觉设计师对相应的信息进行确认后,于是给到了定宽的效果:
-
-
-
-*(定宽:三个按钮)*
-
-
-
-*(定宽:两个按钮)*
-
-
-
-*(定宽:一个按钮)*
-
-定宽排版与等分排版两个方式对比来看:
-
-* 定宽排版的3个按钮与等分排版的效果一样
-
-* 定宽排版的2个按钮比等分排版的效果差。
-
-* 定宽排版的时候,按钮所占空间并没有等分展示区域,而文案离分隔线的间距又不相等,排版逻辑不清晰,显得很不整齐
-
-* 定宽排版的1个按钮比等分排版的效果好。
-
-等分排版的时候,虽然按钮在展示区域中是居中对齐了,但是考虑到上下文的对齐,按钮并没有和星星的对齐,相反,等宽排版的文案更接近与星星的左对齐,虽然并没有绝对对齐,只是展现出来的排版效果、与上下文的排版逻辑显得更严谨。
-
-其实两种排版的文案都没有办法100%保证与星星左对齐的,因为文案长度不一样,居中的位置就不一样:
-
-
-
-*(定宽、等分的居中文案)*
-
-综合以上,向产品和视觉设计师提出建议:按钮的文案与分隔线间距相等,并且第一个按钮的文案与星星左对齐。于是得到了最终的效果:
-
-
-
-*(优化后的)*
-
-
-
-*(优化后的)*
-
-
-
-*(优化后的)*
-
-这与原有的设计稿相比,扩展性更强,排版逻辑更严谨性、更趋向设计本意,建议是合理的。
-
-优化的地方虽然不大,但我们需要对设计稿进行认真深入的分析,从产品层面、视觉层面、开发层面甚至交互层面去尽可能地解读设计稿,深入思考才能发现问题,提出合理的建议,101% 中的 1% 威力就会慢慢的程现出来。
-
-### 一个特殊的例子
-
-
-
-由于项目快速迭代,视觉设计资源紧缺的原因,于是有了这张没有经过视觉流程的设计稿,是一位产品GG给到的,如果我们拿到设计稿,不加以思考的话,100%还原出来,那么
-
-得到了第一稿:
-
-
-
-其实认真思考一下,可优化的地方还是有的:
-
-**交互上**
-
-*  和  这两个其实只是文案中的一部分,并没有任何交互,设计稿上却做成了和文本形成强烈对比的看上去可点击的按钮,容易误导用户去点
-
-**视觉上**
-
-* 复制按钮的配色欠恰当,复制的操作并不会引起用户警告或错误的提示,而红色恰好有让人警惕的意味
-
-* 输入框和复制按钮的高度不一样,显得不够整齐美观
-
-* 内容和顶部的间距太小,内容视觉焦点欠佳
-
-交互和视觉上都涉及到不同的信息传达,因此不能用对视觉稿进行主动修正,将以上信息和产品反馈
-
-最终建议:
-
-* “添加朋友” 和 “关注” 采用文本加色强调形式表现
-
-* 复制按钮的颜色采取常用的给人友好感觉的绿色
-
-* 调整复制按钮的调试使之与输入框的调试一样
-
-* 调整内容与顶部的间距大小
-
-得到了第二稿:
-
-
-
-*(第二稿)*
-
-第二稿中“您已收藏店铺,可在个人中心查看”的收藏反馈提示是产品新增的内容,一开始要求放在上图的位置,虽然第二稿在交互和视觉上得到了一定的优化,但还有优化的空间,特别是
-
-**产品上**
-
-* 文字左对齐可显页面排版整齐,但从内容的亲密性上看,最底部的已收藏文字反馈提示并不属于引导操作的内容
-
-最终建议:
-
-* 让反馈内容居中对齐
-
-* 增加与操作内容的边距,让用户可以一目了然看到反馈内容的归属
-
-* 调整文案强调色的色系,让其不至于过重而显得太突眼。
-
-最终得到101%的还原效果:
-
-
-
-这个例子中,最终还原出来的效果也许没有视觉设计师那么专业,但至少还原稿上多了一份思考,多了一份心思,在这过程中也能让大家去探讨一些非自己职位上的知识,互相学习,互相提高。
-
-从100%到101%的过程,其实就是一个主动思考,积极执行的过程,是一个追求极致的过程,是一个把事做好的过程。在还原设计稿的过程中,1%在100%中占的比例不多,但是如果能把这1%处理得好,还原出来的设计稿会更具级数。
diff --git a/source/_posts/2015-11-17-Git-Commands.md b/source/_posts/2015-11-17-Git-Commands.md
deleted file mode 100644
index b0e9da5de6..0000000000
--- a/source/_posts/2015-11-17-Git-Commands.md
+++ /dev/null
@@ -1,97 +0,0 @@
-title: "Git常用操作总结"
-subtitle: "理解Git的内部原理,分清楚工作区、暂存区、版本库,还有就是理解Git跟踪并管理的是修改,而非文件。"
-cover: //img11.360buyimg.com/ling/jfs/t1/64152/19/2101/22706/5d072d13Ec37b48aa/d57d66b18dc18f1f.jpg
-date: 2015-11-17 12:44:25
-categories: Web开发
-tags:
- - Git
-author:
- nick: LV主唱大人
- github_name: mamboer
-
----
-
-用Git比较久了,之前一直在Win用的TortoiseGit,现在命令行用的比较多,所以把一些指令总结一下,以便回顾和查询。
-理解这些指令,觉得最重要的是理解Git的内部原理,比如Git的分布式版本控制,分清楚工作区、暂存区、版本库,还有就是理解Git跟踪并管理的是修改,而非文件。
-
-
-
-### 设置
- $ git config --global user.name "Your Name"
- $ git config --global user.email "email@example.com"
-
-### 提交
-git tracked的是修改,而不是文件
-
-
-
- #将“当前修改”移动到暂存区(stage)
- $ git add somfile.txt
- #将暂存区修改提交
- $ git commit -m "Add somfile.txt."
-
-### 状态
- $ git status
- $ git diff
-
-### 回退
- # 放弃工作区修改
- $ git checkout -- file.name
- $ git checkout -- .
-
- # 取消commit(比如需要重写commit信息)
- $ git reset --soft HEAD
-
- # 取消commit、add(重新提交代码和commit)
- $ git reset HEAD
- $ git reset --mixed HEAD
-
- # 取消commit、add、工作区修改(需要完全重置)
- $ git reset --hard HEAD
-
-### 记录
- $ git reflog
- $ git log
-
-### 删除
- $ rm file.name
- $ git rm file.name
- $ git commit -m "Del"
-
-### 远程操作
- $ git remote add origin git@github.com:michaelliao/learngit.git
- # 第一次推送,-u(--set-upstream)指定默认上游
- $ git push -u origin master
- $ git push origin master
-
-### 克隆
- $ git clone https://github.com/Yikun/yikun.github.com.git path
- $ git clone git@github.com:Yikun/yikun.github.com.git path
-
-
-### 分支操作
-
-
-
- # 查看当前分支
- $ git branch
-
- # 创建分支
- $ git branch dev
- # 切换分支
- $ git checkout dev
-
- # 创建并checkout分支
- $ git checkout -b dev
-
- # 合并分支
- $ git merge dev
-
- # 删除分支
- $ git branch -d dev
-
-### 标签
- $ git tag 0.1.1
- $ git push origin --tags
-
-注意:本文Fork自 [yikun.github.io](http://yikun.github.io/),[凹凸实验室](http://aotu.io)作进一步完善。
diff --git a/source/_posts/2015-11-20-svg-I-know.md b/source/_posts/2015-11-20-svg-I-know.md
deleted file mode 100644
index a335066e9c..0000000000
--- a/source/_posts/2015-11-20-svg-I-know.md
+++ /dev/null
@@ -1,304 +0,0 @@
-title: SVG I Know
-subtitle: SVG即Scalable Vector Graphics可缩放矢量图形,使用XML格式定义图形。
-date: 2015-11-20 11:30:45
-cover: //img11.360buyimg.com/ling/jfs/t1/46164/38/2407/14936/5d072d82E9c094fd6/bbc2c66d57bdeac1.png
-categories: Web开发
-tags:
- - svg
-author:
- nick: 暖暖
- github_name: Newcandy
----
-
-## 第一章:SVG入门篇
-
-### SVG简介
-SVG即Scalable Vector Graphics可缩放矢量图形,使用XML格式定义图形。
-优点:
-- SVG与其他图片格式相比:主要优势在于可缩放的同时不会影响图片的质量。
-- 与flash相比 :SVG 最大的优势是与其他标准(比如 XSL 和 DOM)相兼容。而 Flash 则是未开源的私有技术。
-
-### SVG in HTML常用方法
-#### 使用<img>元素来嵌入SVG图像
-```html
-
-```
-
-#### 将SVG图像作为背景图像嵌入
-```css
-background: url('http://www.w3school.com.cn/svg/rect1.svg') no-repeat;
-```
-
-#### 使用svg元素,通过代码将SVG图像嵌入到HTML代码中
-```html
-
-
-
-```
-
-### svg sprites
-svg sprites类似于css sprites,将各个svg合并在一起。
-最主要的优点就是能减少页面的加载时间,优化开发流程,以及保持页面中图片元素的一致性。
-实践中我们可以把整块的svg放在head头部, 因此可以在一处地方更新svg即可,而不是让svg的代码块散落在文档的各个地方。
-```html
-
-
- svg
-
-
-
-
-```
-在这里[https://icomoon.io/app/#/select](https://icomoon.io/app/#/select)可以设置sprites,可以自己导入svg。
-
-
-
-### symbol+use
-在head头部的svg中使用symbol元素,并使用id属性。其中symbol类似flash中的元件,可多次使用。
-```html
-
-```
-然后在需要用到这个元件的地方使用use元素引用元件。其中xlink:href="#truck"相当于元件的链接,通过引用元件的id来实现。
-```html
-
-```
-
-### 兼容性
-
-
-
-兼容性详细情况请点击 [此处](http://caniuse.com/#search=svg)
-
-### 总结思考
-一般在html中使用SVG有三种方法:使用<img>元素来嵌入SVG图像;将SVG图像作为背景图像嵌入;使用<svg>元素,通过代码将SVG图像嵌入到HTML代码中。
-使用过程中,可通过svg sprites提高性能,通过symbol以及use元素提高文档的可维护性等。
-
-
-## 第二章:SVG形状
-
-### 矩形 <rect>
-```html
-
-```
-解释:x为x坐标,y为y坐标;width 和 height 分别为形状的高度和宽度;rx 和 ry 属性可使矩形产生圆角。
-另外,下面三个属性是文章后面会用到的,之后不会过多讲述:
-- fill 属性定义形状的填充颜色
-- stroke 属性定义图形边框的颜色
-- stroke-width 属性定义形状边框的宽度
-
-
-### 圆形 <circle>
-```html
-
-```
- 解释:cx 和 cy分别为圆点的 x 和 y 坐标;r为半径。
-
-
-### 椭圆<ellipse>
-```html
-
-```
-解释:cx 圆点的 x 坐标,cy 圆点的 y 坐标;rx 水平半径,ry 垂直半径。
-
-### 线<line>
-```html
-
-```
- 解释:(x1,y1)为线条的开始坐标;(x2,y2)为线条的结束坐标。
-
-### 折线<polyline>
-```html
-
-```
- 解释:points 属性定义多边形每个角的 x 和 y 坐标。为了可读性,建议x与y坐标用逗号分开,每个角之间的坐标用空格分开。
-
-### 多边形<polygon>
-```html
-
-```
- 解释:points 属性定义多边形每个角的 x 和 y 坐标。
-
-### 路径<path>
-直线指令:
-M = moveto
-L = lineto
-H = horizontal lineto
-V = vertical lineto
-Z = closepath
-注释:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
-```
-
-```
-解释:该路径开始于位置 250 150,到达位置 150 350,然后从那里开始到 350 350,最后在 250 150 关闭路径。
-由于绘制路径的复杂性,建议使用 SVG 编辑器来创建复杂的图形。
-
-#### svg的贝塞尔曲线
-贝塞尔曲线指令:
-C = curveto
-S = smooth curveto
-Q = quadratic Belzier curve
-T = smooth quadratic Belzier curveto
-贝塞尔曲线控制小工具[http://dayu.pw/svgcontrol/](http://dayu.pw/svgcontrol/),操控多次可加深对贝塞尔曲线的理解。
-
-
-
-
-
-CSQT比较难记,联想记忆法“厕所切图(CSQT)”就比较容易记住了。
-厕所是3D空间,所以CS是三次曲线噢,切图是平面图,所以是二次曲线,很好记。
-
-##### C三次贝塞尔曲线
-```html
-C x1 y1, x2 y2, x y (or c dx1 dy1, dx2 dy2, dx dy)
-```
-最后一个坐标(x,y)表示的是曲线的终点,另外两个坐标是控制点,(x1,y1)是起点的控制点,(x2,y2)是终点的控制点。小写指令c表示相对坐标。
-
-##### S光滑三次贝塞尔曲线
-```html
-S x2 y2, x y (or s dx2 dy2, dx dy)
-```
-之所以S命令没有x1 y1,是因为S命令跟在C命令后,x1 y1默认是C命令的第二个控制点的对称点,如下图蓝色线条所示。
-
-
-如果前面没有C命令,即S命令单独使用时,S命令画出来的是二次贝塞尔曲线,因为x1 y1和x2 y2默认是同一个控制点了。
-
-##### Q二次贝塞尔曲线
-```html
-Q x1 y1, x y (or q dx1 dy1, dx dy)
-```
-
-##### T光滑二次贝塞尔曲线
-```html
-T x y (or t dx dy)
-```
-T命令的控制点默认是前面C命令的控制点的对称点。
-
-
-如果T命令前面没有C命令,即T命令单独使用时,T命令画出来的是直线。
-
-
-### 总结思考
-路径比基本形状更强大、更灵活。使用路径绘制复杂图形比较麻烦,但是使用它们来绘制图形的效果大多数时候很赞,一般其他基本图形是做不来的。
-
-
-## 第三章:SVG动画
-----------
-
-### svg路径动画
-DEMO:
-
-
-g元素是用于把相关元素进行组合的容器元素。animateMotion使元素沿着动作路径移动,且该路径不可见,path定义的是可见的路径。rotate="auto"使元素移动得更加自然,会随着路径旋转一定的角度。
-```html
-
-```
-[点击查看全部代码](https://github.com/Newcandy/svg/blob/master/path.html)
-
-### svg路径描边动画
-DEMO:
-
-
-在path等元素上必须使用stoke属性,否则动画不执行。stroke 表示描边颜色;stroke-width 表示描边的粗细;
-```html
-
-```
-使用CSS3 animation实现,因为内联的svg本身就是Html元素,可以通过CSS3来控制颜色等属性。
-stroke-dasharray 表示虚线描边;stroke-dashoffset 表示虚线的起始偏移。
-```css
-.device { position: absolute;top: 43%;left: 50%;margin: -200px 0 0 -200px;stroke-dasharray: 4000;stroke-dashoffset: 4000;-webkit-animation: dash 2s infinite;animation: dash 2s infinite; }
- @-webkit-keyframes dash {
- 100% { stroke-dashoffset: 0; }
- }
- @keyframes dash {
- 100% { stroke-dashoffset: 0; }
- }
-```
- [点击查看全部代码](https://github.com/Newcandy/svg/blob/master/stroke.html)
-
-### css中的clip-path
- clip-path按照路径内部的尺寸进行裁剪。只有路径内的内容可见。使用方法如下:
-```css
-.element {
- clip-path: polygon(...); /* 或者其他的图形函数 */
-}
-```
-```html
-
-circle: circle(radius at x-axis y-axis)
-ellipse: ellipse(x-rad y-rad at x-axis y-axis)
-polygon: polygon(x-axis y-axis, x-axis y-axis, … )
-inset: inset(top right bottom left round top-radius right-radius bottom-radius left-radius)
-```
-
-DEMO1:
-
-
-利用伪元素:before和:after实现相同大小相同位置的文字,使用clip-path分别裁剪文字:
-```
-.txt { display: inline-block;position: relative;font-size: 70px;text-transform: uppercase;color: transparent; }
-/* 此处省略代码 */
-.txt:before { -webkit-clip-path: polygon(0 0,100% 0,100% 100%);clip-path: polygon(0 0,100% 0,100% 100%); }
-.txt:after { -webkit-clip-path: polygon(0 0,0 100%,100% 100%);clip-path: polygon(0 0,0 100%,100% 100%); }
-```
-[点击查看全部代码](https://github.com/Newcandy/svg/blob/master/clip-path/text.html)
-
-DEMO2:
-
-
-如果结合clip-path和keyframes动画,可实现相关元素按照我们的路径逐步出现的效果。clip-path可通过此工具http://www.bennettfeely.com/clippy/实现复杂的路径。
-```css
- .line { position: absolute;left: 0;top: 0;width: 28px;height: 34px;background: url(line.png) 0 0 no-repeat;-webkit-animation: moveLine .8s ease infinite;animation: moveLine .8s ease infinite; }
-
-@-webkit-keyframes moveLine {
- 0% {
- -webkit-clip-path: polygon(0 100%, 0 100%, 0 100%);
- }
- 25% {
- -webkit-clip-path: polygon(0 82%, 100% 81%, 100% 100%, 0 100%);
- }
- 50% {
- -webkit-clip-path: polygon(20% 0%, 80% 0%, 73% 47%, 74% 64%, 99% 100%, 0 100%, 56% 77%, 64% 58%);
- }
- 60% {
- -webkit-clip-path: polygon(50% 0%, 72% 48%, 75% 70%, 100% 100%, 0 100%, 55% 78%, 5% 68%);
- }
- 75% {
- -webkit-clip-path: polygon(28% 0, 100% 34%, 79% 100%, 0 100%, 0 0);
- }
- 100% {
- -webkit-clip-path: polygon(100% 0, 100% 100%, 0 100%, 0 0);
- }
-}
-```
-[点击查看全部代码](https://github.com/Newcandy/svg/blob/master/clip-path/line.html)
-
-### 总结思考
-本章主要介绍svg路径动画,svg路径描边动画以及css中的clip-path,从中我们也发现了路径的强大之处,如若能在项目中灵活使用,无非给动画添加更生动的效果。
diff --git a/source/_posts/2015-11-23-css3-animation-to-movie-part_1.md b/source/_posts/2015-11-23-css3-animation-to-movie-part_1.md
deleted file mode 100644
index 008fb27afe..0000000000
--- a/source/_posts/2015-11-23-css3-animation-to-movie-part_1.md
+++ /dev/null
@@ -1,68 +0,0 @@
-title: "以电影之眼看CSS3动画(一)"
-subtitle: "要写CSS3动画,必先学技术。要写好CSS3动画,还是得深入探索传统动画的精华。"
-date: 2015-11-23 17:27:00
-cover: //img11.360buyimg.com/ling/jfs/t1/80553/40/2116/13062/5d073693E7ccbf459/ae5cf63225f5e190.png
-categories: Web开发
-tags:
- - CSS3
- - Animation
-author:
- nick: EC
- github_name: lyxuncle
----
-# 以电影之眼看CSS3动画(一)
-----------
-
- 注:此文非干货聚集地,来找干货的对不住了。
- 注注:又多又大的图预警!!!
-
-
-[CSS3动画](http://isux.tencent.com/css3/index.html)的变形基础(transform)包含4种变形方式(translate、rotate、scale、skew),同时还可设置2D、3D、变形原点(transform-origin)、透视(perspective)、透视原点(perspective-origin)等等特性;动画时间频率包含9种基本模式(ease、linear、ease-in、ease-out、ease-in-out、step-start、step-end、steps),甚至还可以使用cubic-bezier写出任何你想要的模式;再加上动画持续时间(animation-duration)等设定,各种排列组合,CSS3动画简直拥有了整个世界!
-
-
-
-- 图片来源《动画的时间掌握》
-
-根据[维基](http://zh.wikipedia.org/wiki/%E5%8A%A8%E7%94%BB)的释义,动画是指由许多帧静止的画面,以一定的速度(如每秒16张)连续播放时,肉眼因视觉残象产生错觉,而误以为画面活动的作品(gif图片正是运用这种原理)。因此最初的动画是通过几张快速翻动的连续画面制作而成,而后经历了电影摄影技术的出现、电脑科技的进步,逐渐转向数字化。
-
-
-
-
-- 将gif拖入PS之后打开时间轴窗口即可看到每一帧的画面
-
-无论是2D还是3D动画,关键帧,正如其名,是动画制作中最关键的部分,同时也是最难把握的部分。曾经有位设计师告诉我,在大学的第一节flash课的课后作业,老师要求大家上交一份小球动画,包含气球、石头球与皮球,并告诉大家,以相同的外观表现出不同的质感是在考验你对关键帧的悟性,而这一个作业就能体现你是否适合学习动画。
-
-
-
-> A 需要很大的力才能使一个炮弹移动。一旦它移动了,同样需要很大的力才能阻挡它前进。B 一只汽球只需要很小的力去移动它,但空气阻力使它很快停止动作。这两个例子都画了动作分格线,可以看出在银幕上表现物体的轻重,取决于对它们动作的时间掌握。(图片来源:《动画的时间掌握》)
-
-在[《動畫製作流程介紹》](http://cghappening.blogspot.com/2011/02/blog-post_23.html)提供的视频中可以看到关键帧在动画制作中所起的地基般的作用。
-
-
-
-- 画面上方的手绘图即为[怪物公司]的关键帧
-
-与关键帧紧密关联的即为时间轴(或摄制表),时间轴是补齐中间帧不可或缺的一项,在传统动画制作中,导演就是通过制定时间轴来掌控整部动画的节奏。
-
-
-
-- 摄制表(图片来源:《动画的时间掌握》)
-
-在CSS3中,@keyframes正是动画的关键帧容器。@keyframes中包含的包括transform在内的元素形态设定构成了关键帧的画面。@keyframes中的百分比即为时间轴的体现。中间帧则由浏览器自动完成(就像flash中的补全动画)。
-
-``` css
-.people{animation:people linear 1.5s;}
-@keyframes people{
- 0%, 95%{opacity:0;}
- 100%{opacity:1;}
-}
-```
-
-
-- 一个简单的动画关键帧示例
-
-现在我们知道了CSS3动画的结构与传统动画之间的关系,重点来了, CSS3动画可以做出一部动画电影吗?欲知详情,且听下回分解。
-
-## 参考资料:
-
-- [《动画的时间掌握(修订版)》](http://www.amazon.cn/%E5%8A%A8%E7%94%BB%E7%9A%84%E6%97%B6%E9%97%B4%E6%8E%8C%E6%8F%A1-%E5%93%88%E7%BD%97%E5%BE%B7%E2%80%A2%E5%A8%81%E7%89%B9%E5%85%8B/dp/B0094N5III/ref=sr_1_1?ie=UTF8&qid=1420369719&sr=8-1&keywords=%E5%8A%A8%E7%94%BB%E7%9A%84%E6%97%B6%E9%97%B4%E6%8E%8C%E6%8F%A1)[英]哈罗德•威特克;[英]约翰•哈拉斯;[美]汤姆•赛图
diff --git a/source/_posts/2015-11-23-css3-animation-to-movie-part_2.md b/source/_posts/2015-11-23-css3-animation-to-movie-part_2.md
deleted file mode 100644
index 69f649890b..0000000000
--- a/source/_posts/2015-11-23-css3-animation-to-movie-part_2.md
+++ /dev/null
@@ -1,136 +0,0 @@
-title: "以电影之眼看CSS3动画(二)"
-subtitle: "CSS3动画和电影到底有啥关系?讲了一篇都没讲到,不会是在骗我吧?你这个骗子。"
-date: 2015-11-23 17:27:00
-cover: //img20.360buyimg.com/ling/jfs/t1/49016/11/2549/13062/5d07379eE2564f45d/a8e31d8bc825982d.png
-categories: Web开发
-tags:
- - CSS3
- - Animation
-author:
- nick: EC
- github_name: lyxuncle
----
-# 以电影之眼看CSS3动画(二)
-----------
-
- 注:此文非干货聚集地,来找干货的对不住了。
- 注注:又多又大的图预警!!!
-
-上回说到CSS3动画与传统动画之间千丝万缕的联系,现在就让我们来探讨一下用CSS3动画做一部动画电影都需要些什么。
-
-一、
-
-**首先你需要一个故事。**
-
-即使只是一堆雪花往下掉,也是包含故事的——为什么下雪?是冬天来了?那是冬天的第一场雪吗?第一场雪有什么特点呢?好吧作为一个从没见过雪的南方人我承认我给自己挖了个坑,不过就是类似这种思路,让我们拥有了一个故事,所以,即使只有一秒钟的动画也是有故事的。Use your imagination.
-
-小tip:在做影视题材的专题页时,我会首先根据相关影视的预告片确定入场动画的风格与基调,观看预告片不仅能够了解影片的风格,同时还能学习其字幕出现、消失以及转场的方式,获得一种节奏感,也就是上面所说的时间掌控。在看电影正片时也可留意影片开头与结尾字幕出现的形式,尤其是科幻片,电影字幕的设计与电影风格相辅相成,常常能让你脑洞大开——原来还能这么玩。
-
-
-
-- [[窃听风云3]预告片](http://movie.douban.com/trailer/156598/#content)中字幕出现的方式表现出信号干扰的效果,由此可以将影片相关专题作出这样的开场动画——
-
-
-
-- 视觉设计:吴丹枫
-
-```css
-@keyframes peoInner{
- 0%, 12.5%, 16.5%, 20.5%{background:none;}
- 10%, 12%{background:url(../img_bg/casts_adv_green_red.jpg) no-repeat 0 0;}
- 14%, 16%{background:url(../img_bg/casts_adv_green_red.jpg) no-repeat 0 -725px;}
- 18%, 20%{background:url(../img_bg/casts_adv_green_red.jpg) no-repeat 0 -725px;}
- 13%, 17%, 21%, 100%{background:url(../img_bg/cast_adv_01.jpg) no-repeat top center;}
-}
-```
-
-- 简单的几个不同色调的图片进行替换就能做出类似效果。([demo地址](http://jdc.jd.com/demo/ec/movieeye/doing_movie_by_css3.html))
-
-二、
-
-当我们在脑内小剧场构思好动画小故事之后(当然,你也可以将它写下来),我们就可以进行**关键帧与时间轴的设计**了。
-
-> 任何人都可以用电脑动画软件将一个物体移动。但是如何赋予物体重量、大小、规模、移动和幽默感,这些都与你如何移动物体相关。电脑不能为动画师创造动画,动画师仍然需要了解时间掌握的原则知识以赋予电脑动画生命力。(《动画的时间掌握》)
-
-这时需要注意的是因果关系对动画的影响,“一个动画师必须懂得自然界物体运动的力学知识”,这样“才能创造情绪和表达正确的感觉。”我们来看看为了使动画更加流畅真实,迪士尼爷爷想出了什么办法。[白雪公主与七个小矮人]作为80、90后动画电影启蒙,使用了一项革新动画制作的技术——[转描机](http://zh.wikipedia.org/wiki/%E8%BD%AC%E6%8F%8F%E6%9C%BA%E6%8A%80%E6%9C%AF)。
-
-- (视频 [http://player.ku6.com/refer/TH-adgFO0MjSKh3i/v.swf](http://player.ku6.com/refer/TH-adgFO0MjSKh3i/v.swf) )
-
-
-
-- 视频:[白雪公主与七个小矮人](1974)幕后花絮
-
-视频中有一个细节,迪士尼爷爷让动画师注意那位大叔在跳踢踏舞时重力对裤腿的作用(19分15秒)。是的,迪士尼爷爷强调的就是动画与物理学的关系。其实即使是网页中的动画也能用到牛顿运动定律,将网页元素看作一个有重量、有结构、有柔韧性的物体进行动画设计,会得到意想不到的效果。事实上已经有人这么做了——
-
-
-
-- dribbble's stripe checkout(图片来源:[The Art of Animation](http://markgeyer.com/pres/the-art-of-ui-animations/#/2/9))
-
-Adds a bit of realism to an otherwise static interface. ——[The 12 basic principles of animation - The Art of Animation](http://markgeyer.com/pres/the-art-of-ui-animations/#/2/5)
-
-
-
-- 图片来源:[Giving Animations Life](https://medium.com/tictail-makers/giving-animations-life-8b20165224c5)
-
-Using Bounce.js and classical animation concepts to bring life to user interfaces. ——[Giving Animations Life](https://medium.com/tictail-makers/giving-animations-life-8b20165224c5)
-
-三、
-
-**不断的修改与调整。**
-
-这是一个需要细致与耐心的过程,你得在不断的调整中保持大局观,避免陷入细节的纠结,同时又需要有能够将别扭的细节调整好的灵感。说白了就是同时拥有汉子的粗犷与妹子的细腻。节奏是一个很重要的要素,与银幕上的动画类似,CSS3动画创作者的意念必须即时并完全交给观众。
-
-> 意念清晰易懂靠两个因素:1、好的表现手法和设计,要使每个主要动作能以最清楚和最有效的方式呈现在银幕上。2、好的时间掌握,要有足够的时间先使用户预感到将有什么事情发生,然后用于表现动作本身,最后要有好的收尾。这三者中,任何一项所占时间太多,便会感觉节奏太慢,用户会感到不耐烦,动画的出现便如同鸡肋。反之,如果时间太短,那么用户在注意到它之前,动作已经结束,创作者的意念未能充分表达,就浪费掉了。——《动画的时间掌握》
-
-四、
-
-别忘了进行**性能测试**。
-
-这是一步有可能推翻前面两步甚至三步的一个步骤。但是即便发生了这样的事,也不要气馁,这并不意味着之前做的前功尽弃,反而是个宝贵的财富——对于性能的感受又多了一次体验,而其中的一些动画心得或许下次也能用上。
-
-说了这么多,一切都显得辣么抽象,下面就上栗子。
-
-
-
-- 动画来源:[Pseudo-Elements Animations and Transitions](http://tympanus.net/Development/PseudoElementsAnimationsTransitions/index4.html)
-
-这是个使用了最简单的css属性——padding、line-height、box-shadow——实现了令人吃了一斤效果的栗子,就像一道脑筋急转弯一样让大家对CSS3的动画的理解不止于CSS3的新属性,我们曾经用烂的CSS2.0属性同样也能开出花儿。
-
-我们看到,CSS3动画并不只是由transform、opacity等等简单组成,它还可以包含许许多多的设计、想法、甚至感情。台上一分钟,台下十年功在动画上也适用,或许在所有事物上都适用。
-
-目前为止用CSS3动画拍电影只是个概念,但想象一下你是这部电影的导演,所有元素都是可调度的场景与角色,用CSS3动画拍电影是不是也没有那么遥远了?
-
-最后,我想将我一直以来没能找到合适实现方法的动画效果放上来,希望能够抛砖引玉、集思广益:
-
-
-
-
-
-- A 冷空气从火的底部冲入,受热后上升。 B 一套火的循环①-⑧,标以×的漩涡一个接一个地向上升起。升得越高,速度越慢。
-
-> 火焰的动作受火的上部流动着的空气的控制。最热的部分在火的中央,在这之上热空气上升,当热空气上升时,旁边的冷空气冲入取代热空气的位置。这部分冷空气变热后又上升,这个过程重复不已。空气的流通常常使火焰成为粗略的圆锥形,由冷空气的漩涡形成一连串锯齿状火焰,从火的底部向里和向上移动。(《动画的时间掌握》)
-
-
-除了空气与火焰的关系外,火焰的运动由于随机性很大,循环动画需要写得看不出动作在循环也是难点之一。如何才能在保证结构、性能的同时做出最佳的火焰效果?
-
-最最后,放上迪士尼爷爷的一段话,在我做动画甚至做任何事时它将不断地在脑海中回响:
-
-曾经有人问迪士尼,[白雪公主]大受欢迎的秘密是什么?他回答说:
-
-“我们只能确定一件事,每一个人都有童年,每次拍一部新片,我们不是为大人而拍,也不只是为小孩子拍,我们是为了唤醒每个人内心深处那种早就被遗忘的纯真世界。”
-
-## 参考资料:
-
-- [《动画的时间掌握(修订版)》](http://www.amazon.cn/%E5%8A%A8%E7%94%BB%E7%9A%84%E6%97%B6%E9%97%B4%E6%8E%8C%E6%8F%A1-%E5%93%88%E7%BD%97%E5%BE%B7%E2%80%A2%E5%A8%81%E7%89%B9%E5%85%8B/dp/B0094N5III/ref=sr_1_1?ie=UTF8&qid=1420369719&sr=8-1&keywords=%E5%8A%A8%E7%94%BB%E7%9A%84%E6%97%B6%E9%97%B4%E6%8E%8C%E6%8F%A1)[英]哈罗德•威特克;[英]约翰•哈拉斯;[美]汤姆•赛图
-
-- [The Art of UI Animations](http://markgeyer.com/pres/the-art-of-ui-animations/#/)
-
-## 推荐:
-
-- [ISUX动画工具、动画手册](ttp://isux.tencent.com/css3/tools.html)
-
- > 了解所有与CSS3动画相关的属性,使用动画工具更直观地调整变形。
-
-- [12 Principles of Animation](http://minyos.its.rmit.edu.au/aim/a_notes/anim_principles.html)
-
- > 最近存在感极强的动画12原则,如果想要做出自然流畅的CSS3动画,这个由迪士尼动画巨头所总结出的经典原则绝对是必读之物。这里附上视频版:[http://vimeo.com/93206523](http://vimeo.com/93206523)
diff --git a/source/_posts/2015-11-24-3D-CleaningCream.md b/source/_posts/2015-11-24-3D-CleaningCream.md
deleted file mode 100644
index 7f36871a61..0000000000
--- a/source/_posts/2015-11-24-3D-CleaningCream.md
+++ /dev/null
@@ -1,148 +0,0 @@
-subtitle: 看官别走啊,这真不是软文。
-title: 使用ThreeJS在浏览器中展示3D物件
-cover: //img20.360buyimg.com/ling/jfs/t1/81927/16/2167/55464/5d073a11Eba3687ba/6f9c3d5ed59a34fa.png
-date: 2015-11-24 13:00:35
-categories: Web开发
-tags: three.js
-author:
- nick: Littly
- github_name: Littly
----
-这是一篇介绍如何在浏览器中展示洗面奶3D物件的文章。
-
-
-### 前言
-
-这篇文章仅仅是向你介绍应对下面这种的场景的方法:如果有人突然跟你说,你的皮肤挺不错的耶,你用的什么洗面奶,我也想买一个,你会怎么回答呢?手头又没法拿出你的洗面奶给他看,光凭言语无法准确地形容出你的洗面奶到底长什么样。作为前端的程序猿,我会想,这种时候如果可以有一个链接让对方自己去看一下把玩一下,对方势必会对你的洗面奶高Bigger有更深刻的认识。本文的目的,就是向屏幕对面的程序猿介绍这种高效搞笑的方式。
-
-
-### 走进3D的世界
-
-在页面里面放几个图片是完全无法满足让观看者自己看自己把玩的要求的。所以这里我们将会使用3D的形式来展现我们的洗面奶。老话说得好,同样是山,却有横看成岭侧成峰的不同。比起2D渲染,3D渲染多了一个维度,由于透视效果,物体遮挡、光照角度、光的反射折射等的存在,观看者在不同的角度观看会得到不同的结果。
-
-在浏览器里面,CSS3提供了3D变换的相关属性,但对于光照相关的需求却是无能为力。而使用Canvas进行绘制的话,如果不依赖封装好的图形库,进行图形变换又是相当麻烦的事情。就算是在CSS中一个简单的2D旋转或者是放大,在Canvas的像素操作中,我们还需要通过矩阵计算才能知道变换后每个像素的位置。正因如此,图形库出现了。
-
-说到图形库,我们不得不提到[OpenGL](http://www.opengl.org)。OpenGL是一个跨平台的图形编程规范,定义了2D与3D绘制中所需要各种接口,进行图形绘制中所需要的变换,纹理映射,光照等。OpenGL定义的接口很多是为硬件加速设计的。有了各大硬件厂商的支持,OpenGL的渲染效率比起软件渲染高了不止一点点。同时,OpenGL不局限于某平台或者是语言,它只是一个关于图形渲染的规范,对外提供关于图形渲染的各种接口,所以有许多的语言绑定,而在浏览器中用到的是Javascript的绑定WebGL。
-
-### ThreeJS
-
-[ThreeJS](http://threejs.org/)是一款在浏览器中进行3D绘制的Javascript库,为使用canvas绘制,WebGL渲染等图形操作提供了简便的API。到底有多简便?在[PixiJS](http://www.pixijs.com)等2D绘制库中,我们需要场景+物件+贴图来搞定一张图,而在ThreeJS中我们只需要在这基础上额外添加适当光照与一台照相机而已,下面是一个最简单的Demo,绘制了一个旋转的绿色立方体。
-
-```javascript
- var scene = new THREE.Scene();
- /*创建场景*/
- var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
- /*创建照相机*/
- var renderer = new THREE.WebGLRenderer();
- /*创建渲染器*/
- renderer.setSize( window.innerWidth, window.innerHeight );
- document.body.appendChild( renderer.domElement );
-
- var geometry = new THREE.BoxGeometry( 1, 1, 1 );
- /*创建几何模型*/
- var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
- /*创建材质*/
- var cube = new THREE.Mesh( geometry, material );
- /*几何模型与材质合成为物件*/
- scene.add( cube );
- /*将物件添加入场景*/
-
- camera.position.z = 5;
-
- var render = function () {
- requestAnimationFrame( render );
- cube.rotation.x += 0.1;
- cube.rotation.y += 0.1;
- renderer.render(scene, camera);
- /*渲染出在相机camera中看到的scene场景*/
- };
-
- render();
-```
-
-画出来就像这样子:
-
-
-ThreeJS中提供了少量基础的几何模型,如长方体(Box3),球体(Sphere)等,但面对我们要实现的洗面奶还是太小儿科了。这是不是说明我们的洗面奶没办法做了?文章都写到这里了,办法肯定是有的。ThreeJS提供了加载外部模型的模块(Loader),可以加载外部的Obj,json等格式的模型。另外,ThreeJS的[Github仓库](https://github.com/mrdoob/three.js/tree/master/utils/exporters)中还提供了在3ds Max、Blender等3D绘制软件中导出模型的工具。是的,我们就可以用别的3D建模软件建模再导出成ThreeJS所需要的格式了。
-
-### 动手
-
-我们这里使用的是建模工具是Blender。我们需要先拍下物体的三视图作为建模的参考。导入Blender后,依据三视图,我们很快就可以建出洗面奶的模型。
-
-模型的样子
-
-
-在Blender中加上ThreeJS的插件之后,我们可以在Blender的文件菜单中见到Export/Three.js(.json)选项。点击之后,选择导出的目录,然后记得在左下角勾上我们要导出的元素。在这个例子中,我们需要导出的是Scene,也就是场景本身。
-
-
-在ThreeJS中进行导入的操作也十分简单。ThreeJS中提供了许多种类的Loader,分别针对不同的使用需求。比如,JSONLoader针对的是.json格式的模型,OBJLoader针对的是.obj格式的模型等等。翻阅网上资料的时候还可以看到SceneLoader的踪影,这就是用来加载整个场景的.json格式文件的。可是在ThreeJS的新版本中,SceneLoader已经被废弃,取而代之的是更为牛叉更为智能的ObjectLoader。ObjectLoader可以判断导出的模型到底是什么种类,从而将它们转化为ThreeJS中的对应对象便于开发者使用。
-
-在这个例子中,我们导出的.json文件中包含的是场景本身。所以,除了需要添加部分ObjectLoader的代码,其余部分的代码甚至比上面那个例子还要简单:
-
-```javascript
- var scene,
- camera,
- renderer,
- loader,
- wid,
- hei,
- animate;
-
- animate = function () {
- renderer.render(scene, camera);
- requestAnimationFrame(animate);
- };
-
- wid = window.innerWidth;
- hei = window.innerHeight;
- camera = new THREE.PerspectiveCamera(45, wid / hei, 1, 1000);
- /*创建照相机*/
-
- camera.position.set(10, 10, 10);
- camera.lookAt(new THREE.Vector3(-1, -1, -1));
-
- renderer = new THREE.WebGLRenderer();
- renderer.setSize(wid, hei);
-
- loader = new THREE.ObjectLoader();
- /*创建ObjectLoader*/
-
- document.body.appendChild(renderer.domElement);
-
- loader.load('objs/object.json', function (_sce) {
- scene = _sce;
- scene.add(camera);
- animate();
- });
- /*加载Scene,成功后执行回调开始动画*/
-```
-
-浏览器中一看,却不太对劲。形状对了,可是颜色呢?高端黑的洗面奶怎么就变成这么山寨的颜色了,而且每次刷新都变颜色。活了二十几年,小便表示还真没见到过这样的洗面奶。
-
-
-
-出现这种情况,毫无疑问是材质的问题。原来我们在建模软件中还没给洗面奶加过材质,所以ThreeJS加载完我们的.json文件后,发现只有模型却没有材质,就给模型加上了一个随机颜色的材质。解决办法也很简单,在ThreeJS中手动贴上贴图就好了。而更简单且有效的办法是,在建模软件中上好贴图再一起导出。
-
-回到Blender中,将洗面奶的表面进行UV展开后导出展开图后,我们新建一张图片,将我们要贴的图放到展开图上的相应位置,再回到Blender中将这张新的图片设为瓶身的材质。渲染一下,检查到效果无误后,将模型导出。这次要记得将左下角的Materials勾上,另外还需要勾上texture的复选框。
-
-将这次导出的模型放到先前的目录下,我们会发现,浏览器中并没有出现想象中的场景。在控制台中可以看到,由于我们没有将贴图一起放到一个目录下,贴图加载失败了。按照要求放好后,我们会更惊奇地发现,浏览器中除了一片黑,什么都没有。这是为什么呢?
-
-
-> 神说要有光,所以就有了光。
-
-在3D的世界中,光是非常重要的存在。我们之所以能看见物体,都是因为有光进入了我们的眼球。除去本身会发光的物体,我们能看见的其他的物体,都是因为这些物体将外界的光反射后进入我们眼球了。换句话说,没有光的话我们就什么都看不到。
-
-在ThreeJS中也是如此。如果没有光,我们就看不到自发光以外的材质,视野中将是一片黑。在ThreeJS中,光照也有很多种:全局光照(AmbientLight),有向光(DirectionalLight),点光源(PointLight)等。在这个例子中,为了360观看整个物体,我们添加一个全局光照。
-
-```javascript
- var light = new THREE.AmbientLight( 0xffffff );
- scene.add( light );
-```
-
-再刷新一下,就可以看见我们的洗面奶了。大功告成!
-
-
-
-### 小结
-
-进行3D建模,将物体在浏览器中展示,目前已经有了不少的应用,有的公司在宣传新产品的时候会使用上这样的技术,让消费者可以在浏览器中亲自把玩产品,观察产品的每个小角落,起到了不错的效果。同样的技术并不只是在展示商品的时候能用上。将适当的全景图贴在立方体的内表面,用户视角置于立方体中心点的话,还可以让用户有置身其境的感觉,可以上下左右转动视角观察一个地点周围的景象,做出街景的效果。可以说,浏览器中的3D技术将会有越来越多的用武之地。
diff --git a/source/_posts/2015-11-24-project-summary.md b/source/_posts/2015-11-24-project-summary.md
deleted file mode 100644
index c8e786521a..0000000000
--- a/source/_posts/2015-11-24-project-summary.md
+++ /dev/null
@@ -1,340 +0,0 @@
-title: 精致化页面重构
-subtitle: "刚完成了一个项目的开发,本文将分享给大家一些项目中的一些经验与小技巧。"
-cover: //img10.360buyimg.com/ling/jfs/t1/59362/35/2181/177423/5d073aeeE49f26328/003098e78f23089b.png
-categories: 项目总结
-tags:
- - summary
-author:
- nick: NoNo
- github_name: liqinuo
-date: 2015-11-24 20:23:44
----
-
-
-
-## 一 布局方式
-
-作为一个注重用户体验的 H5 页面,合适的页面布局方式很重要。
-移动端页面常规布局基本分两种:
-
-### 1. 流式布局(响应式宽度自适应布局)
-
-这是普遍使用的方法,流式布局使用这个标签即可自适应所有尺寸的屏幕。
-```html
-
-```
-优点:响应式、简单、兼容好。
-缺点:非设计稿尺寸屏幕展现效果可能不是很理想。
-
-### 2. 版式布局(页面等比缩放布局)
-**可行方案:**
-1. 页面使用 REM 作为页面数值单位运算。
-2. 通过 zoom/scale 整体缩放页面。
-
-优点:页面等比缩放,比例与设计稿一致。
-缺点:大屏手机等比放大后的体验可能不佳。
-
-### 结论:
-
-两种布局方式各有优劣,项目最终选用流式布局,原因:
-1. 部分页面还是与现有项目模块共用,版式布局改动成本偏高,不好维护。
-2. 考虑到页面在大屏手机等比放大后的体验可能不佳。
-3. 流式布局可以针对大屏手机做一些更灵活的排版(配合媒体查询),达到更好的用户体验。
-
-
-## 二 设计规范
-
-设计规范也是重要元素之一,条件允许情况下,从开发前期就需要跟设计师达成共识制定了一套设计规范。
-
-**设计规范需要包括:**
-页面背景色、文字颜色、边框颜色、各种按钮样式、图标等等全局通用样式。
-
-
-
-
-当然除了前期到设计规范,开发过程中这边也需要分离出一些可复用的组件、公共样式,包括:
-公共底部、商品组模块、轮播组件等等。
-
-
-## 三 技巧
-
-### 1. 还原设计稿的 0.5px
-
-> 在 2014 年的 WWDC,“设计响应的 Web 体验” 一讲中,Ted O’Connor 讲到关于“retina hairlines”(retina 极细的线):在 retina 屏上仅仅显示 1 物理像素的边框。
-
-简单点说就是:在 Retina 屏的设备上,1px 其实相当于 2 个物理像素,所以 1 个物理像素 = 0.5px。
-
-
-
-实现 0.5px 有很多种方法,这里比较一下各种处理的优缺点:
-
-#### 1. iOS8 以上支持 0.5px
-实现原理:常规属性。
-
-```css
-.border {
- border: 0.5px solid red;
-}
-```
-优点:原生、简单、常规写法。
-缺点:目前只有 iOS8 以上系统才能支持,iOS7及以下、安卓系统都显示为 0px,可以通过脚本判断系统然后区分处理。
-
-#### 2. CSS 渐变模拟
-实现原理:设置 1px 通过 css 实现的背景图片,50%有颜色,50%透明。
-```css
-.border {
- background-image:linear-gradient(180deg, red, red 50%, transparent 50%), linear-gradient(270deg, red, red 50%, transparent 50%), linear-gradient(0deg, red, red 50%, transparent 50%), linear-gradient(90deg, red, red 50%, transparent 50%);
- background-size: 100% 1px, 1px 100%, 100% 1px, 1px 100%;
- background-repeat: no-repeat;
- background-position: top, right top, bottom, left top;
- padding: 10px;
-}
-```
-优点:兼容性较好,单边框、多边框可实现,大小、颜色可配置。
-缺点:代码量多、无法实现圆角、同时占用了背景样式
-
-#### 3. 阴影
-实现原理:利用 css 对阴影处理的方式模拟。
-```css
-.border {
- -webkit-box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.5);
-}
-```
-优点:兼容性较好,单边框、多边框、圆角可实现,大小、颜色、可配置。
-缺点:模拟效果强差人意,颜色不好配置。
-
-#### 4. viewport + rem
-实现原理:通过设置页面 viewport 与对应 rem 基准值。
-
-```html
-
-
-
-
-
-```
-优点:兼容比较好,写法跟常规写法无异。
-缺点:老项目改用 rem 单位成本较高。
-
-#### 5. border-image
-实现原理:通过图片配合边框背景模拟。
-```css
-.border-image{
- border-image: url() 2 0 stretch;
- border-width: 0 0 1px;
-}
-```
-优点:无。
-缺点:图片边缘模糊,大小、颜色更改不灵活。
-
-#### 6. CSS3 缩放
-实现原理:利用 :before/:after 重做 border,配合 scale 使得伪元素缩小一半
-```scss
-$bor_style : 1px solid #ddd;
-%border-top-1pt {
- content: '';
- height: 0;
- display: block;
- border-bottom: $bor_style;
- position: absolute;
- left: 0;
- right: 0;
- top: 0;
-}
-@media only screen and (-webkit-min-device-pixel-ratio:2) {
- %border-top-1pt {
- -webkit-transform: scaleY(0.5);
- -webkit-transform-origin: 50% 0%;
- }
-}
-```
-优点:实现简单、单边框、多边框、圆角可实现,大小、颜色可配置。
-缺点:代码量多,可通过 sass 预处理器处理。
-
-#### 总结:
-经过比较与实操测试,最好的处理方式是 CSS3 缩放,目前项目已经在广泛使用。
-
-
-### 2. Flexbox 布局
-
-> Flexbox Layout(弹性盒模型)模块(目前W3C工作草案正在最后通过)的目的是为了提供一种更有效的方式来布局,使各模块即使大小是未知或者动态的也可以在项目空间中合理分配位置(就像“弹性”这个词一样)。
-
-项目哪些地方可以使用 flexbox?比如这些
-
-
-
-#### 基本语法:
-```css
-ul {
- display: box;
- display: -webkit-box;
- display: flex;
- display: -webkit-flex;
-}
-ul li {
- display: block;
- flex: 1;
- -webkit-flex: 1;
- box-flex: 1;
- -webkit-box-flex: 1;
-}
-```
-
-### 3. 元素水平垂直居中
-
-实现的方法有很多种,下面几种比较常用:
-
-#### 1. 表格方法:
-实现方法:表格内容本来就是垂直居中的,可以通过模拟表格处理。
-```html
-
-```
-```scss
-.box_center {
- display: table-cell;
- width: 300px;
- height: 300px;
- text-align: center;
- vertical-align: middle;
-}
-.box_center .inner {
- display: inline-block;
-}
-```
-#### 2. vertical-align: middle
-实现方法:利用空元素占位实现
-```html
-
-```
-```css
-.box_center {
- width: 300px;
- height: 300px;
- text-align: center;
-}
-.box_center .inner {
- display: inline-block;
-}
-.box_center .placeholder {
- display: inline-block;
- width: 0;
- height: 100%;
- vertical-align: middle;
-}
-```
-
-#### 3. 绝对定位
-```css
-%box_center {
- width: 300px;
- height: 300px;
- position: absolute;
- left: 0;
- right: 0;
- top: 0;
- bottom: 0;
- margin: auto;
-}
-```
-
-#### 4. 使用 transform 实现
-```css
-%box_center {
- position: absolute;
- left: 50%;
- top: 50%;
- -webkit-transform: translate(-50%, -50%);
- transform: translate(-50%, -50%);
-}
-```
-兼容性:Android2.3 系统浏览器不支持容器直接使用 fixed 进行定位,外加 fixed 容器可解决。
-
-#### 结论:
-
-经过各种场景的适用型比较,项目使用 transform 实现,兼容性好且使用方便。
-
-
-### 4. 图片占位
-
-图片未加载出来之前浏览器是无法计算出图片实际尺寸的,所以会出现一个问题,页面刚打开各种元素会因为图片未完全加载而跳动/错位。
-
-这里推荐一种兼容性很好做法简单的方法:
-
-**实现原理:**
-通过图片宽高比例计算出图片所需占位空间,赋值于外容器,图片再绝对定位在等比缩放的容器当中。
-```css
-.placeholder {
- position: relative;
- overflow: hidden;
- width: 100%:
- height: 0;
- padding-top: 100%:
-}
-.placeholder img {
- display: block;
- width: 100%;
- height: auto;
- position: absolute;
- left: 0;
- top: 0;
-}
-```
-
-**计算公式:**
-padding-top = 图片高度(px)/图片宽度(px) * 100%
-
-**比如:**
-1:1 比例的图片 padding-top: 100%;
-2:1 比例的图片 padding-top: 50%;
-
-
-## 四 尽可能减少样式图片
-
-大多图标元素都可以使用 CSS 样式绘制,可以大大减少样式图资源请求还有增强图标可维护性。
-比如:链接箭头、圆点、优惠券点点、选择框、checkbox等等。
-
-
-
-
-## 五 使用 WebP 格式图片
-
-> WebP 格式,由 google 于 2010 年推出的新一代图片格式,在压缩方面比 JPEG 格式更优越,并能节省大量的服务器带宽资源和数据空间。与 JPEG 相同,WebP 也是一种有损压缩,主要优势在于高效率。在质量相同的情况下,WebP 格式图像的体积要比 JPEG 格式图像小 40%。
-
-项目中大部分页面素材图都使用了 WebP 格式,兼容方案:
-
-1. **打开场景是浏览器:**通过 javascript 检测,对支持 WebP 的用户输出 WebP 格式图片。
-WebP 支持 插件:http://webpjs.appspot.com/
-
-2. **打开场景是APP:**根据不同系统使用 Android WebP 解析库或iOS WebP 解析库做兼容解析。
-Android4.0 以下解析库:https://github.com/alexey-pelykh/webp-android-backport
-iOS 解析库:https://github.com/carsonmcdonald/WebP-iOS-example
-
-PS:除了 Android4.0 以上提供原生支持
-
-资料参考:http://isux.tencent.com/introduction-of-webp.html
-
-**结论:**
-保证图片高清质量的同时,大大压缩了图片大小,节省了服务器带宽资源和数据空间。
-
-## 六 APP缓存策略
-注: APP缓存策略由开发同学提供
-
-### 1. 缓存方式
-
-- 模块化的使用 APP 缓存,写入磁盘,包括 HTML、JS、CSS。
-
-- 图片使用浏览器缓存,稳定后的背景图以及常用图片也使用 APP 缓存。
-
-### 2. 缓存更新
-
-- **主模块更新:**APP 打开就发送主模块版本号到服务端,返回有更新的模块内容以及版本号,并且返回所有模块版本索引。
-
-- **子模块更新:**进去一个主模块,在加载完成后,会检查所有子模块版本索引,并获取需要更新的模块内容。
-
-- **当前模块更新:**在直接打开模块时(非首页进入),会去 check/更新一下当前版本,然后在加载。
-
diff --git a/source/_posts/2015-12-04-edgeAnimate.md b/source/_posts/2015-12-04-edgeAnimate.md
deleted file mode 100644
index 92fdb68723..0000000000
--- a/source/_posts/2015-12-04-edgeAnimate.md
+++ /dev/null
@@ -1,149 +0,0 @@
-title: Adobe edge animate制作HTML5动画
-subtitle: "Edge Animate是Adobe出品的制作HTML5动画的可视化工具,简单的可以理解为HTML5版本的Flash Pro。"
-cover: https://img11.360buyimg.com/ling/jfs/t1/83778/11/2399/605840/5d09d344E5f7d42a4/7838325243685d09.jpg
-categories: Web开发
-tags:
- - edge animate
- - html5
- - animate
-author:
- nick: 高大师
- github_name: pfan123
-date: 2015-12-04 22:05:18
----
-
-Edge Animate是Adobe出品的制作HTML5动画的可视化工具,简单的可以理解为HTML5版本的Flash Pro。Adobe Edge Animate的目的是帮助专业设计师制作网页动画乃至简单游戏。目前该工具的重点放在动画引擎上,将增加更多HTML5功能,比如Canvas、HTML5音频/视频标签等。支持Android、iOS、webOS、黑莓PlayBook、Firefox、Chrome、Safari和IE9等各个平台。
-
-Edge Animate主要使用HTML5,CSS3和JavaScript。HTML5是其用于创建的doctype,2D的transform,translate,rotate,scale,skew等特效都是渲染为CSS3,如果是最新版本的浏览器,可以操作纯粹的CSS3,如果是主流大众浏览器,Edge Animate则会通过JavaScript库的配合来保证HTML和CSS的显示兼容性。
-
-## Adobe edge animate CC功能
-1.精确的动画。
-2.直觉化的使用者界面。
-3.绘图和文字工具。
-4.移动路径。
-5.可重复使用的符号。
-6.兼容性比较不错,android机也表现良好。
-单一使用做html5 css3动画,带来了巨大的福音。
-
-## Adobe edge animate CC缺点
-1.不太适合,做复杂的动画与游戏,适用场景狭窄。
-2.操作比较适合设计师,不适合程序员,操作效率不高,调节不是特别可控。
-3.采用html5 css3相关的动画,频繁产生重排导致效率低下。
-4.动画元素层级绝对定位,后期维护增加元素,层级覆盖影响较大。
-5.比较适合pc端动画制作,移动端需要进行二次转换,scale进行缩放已达到多屏适配的问题。
-
-## Adobe edge animate下载地址
-[mac 环境下下载](http://example.net/) [window 环境下下载](http://example.net/)
-
-在开始玩Edge Animate前,你可能有个顾虑,就是Edge Animate如果要做交互动画,生成的内容是否会打破已有的HTML文件代码结构?答案是不会。通过Edge Animate生成的HTML代码少之又少,几乎都可以用下面的代码表达方式来概述:
-```
-
-```
-Edge Animate使用JSON来存储元素的定义和属性。相关的动画内容则会全部以代码块的形式嵌入上面的div中,修改和删除都不会影响原有的HTML项目代码,对HTML中元素的操作都通过JSON对象和引入的JavaScript来完成。但是有一点,edge动画对html元素的动画操作,会导致浏览器频繁重排,降低效率。
-
-创建edge animation 工程
-启动Edge Animate,创建一个新项目ctrl+N/command+N。
-
-设定Stage(舞台)宽度为640px, 高度为1136px。Ctrl+S保存为demo.html。打开我们保存的项目目录,一个标准的Edge Animate项目是由一系列html,css,js和相关资源文件组成的。如下图所示:
-
-1)Edge Animate的工程文件: .an 格式文件更像一个空壳文件或者索引文件,标明了项目的必要信息。你可以使用记事本打开.an文件了解其中具体内容。
-2)edge_includes目录:该目录下是Edge制作的html5所依赖的JS类库:edge.6.0.0.min.js 115kb,还是蛮大的。(之前的版本有依赖jquery,再5.0之后就去掉了,产生了自有库,写法参展jquery)。
-3)其他.js文件:诸如demo1_edgeActions.js,demo1_edge.js等js文件是专门针对当前动画所生成js文件。
-4).html文件:主html文件。
-
-Edge Animate的工具界面默认情况下包含了7个Window面板,均可以通过菜单的Window选项开启和关闭,分别是Tools工具,Properties属性,Stage场景,Elements元素,Library库,Timeline时间轴,代码管理和lessons课程。接下来,简单的让大家了解一下,edge animation的属性面包,元素面板,时间轴runtime,代码管理器,这些是我们经常会用到的。
-
-edge animation 属性面板
-Adobe Edge Animate的强大之处在于它能获得舞台中元素的标签(即ID)和这个元素样式属性(CSS)的变化,并将这些变化在时间线上以关键帧的形式“标记”。这样必然导致关键帧之间属性值的变化,这个中间阶段会被转化为一个过渡阶段,或者说一段动画(如图片透明度Opacity的变化,淡入淡出、一个元件的移动Location和缩放Scale等等)。
-
-
-edge animation 元素面板
-Adobe Edge Animate元素面板显示的是节点式的树形结构,表示元素与父元件Stage的联系。这点与ps,flash都比较类似。
-放置(或堆叠)在上方的元素具有更高的Z-index值,会显示在其他元素(堆叠在下方的元素)上方。
-
-
-edge animation 时间轴runtime
-Adobe Edge Animate的时间线融合了元素的节点式树状结构和与元素属性关联的关键帧,这些信息显示在时间线左侧,而右侧则显示时间信息表。元素属性值(关键帧)被标记在时间线确切的时间点,当属性值发生改变时,过渡阶段会产生动画。
-1.动画标签(Label)和触发器(Trigger):自定义的时间线动画标签和触发器也可以控制舞台中元素动画的状态和处理方法;使用Ctrl/Command + L可以在播放头所在时间点生成一个动画标签,使用Ctrl/Command + T可以在播放头所在时间点放置一个触发器。
-2.仅显示具有动画的元素(Filter Animated Elements)
-3.启用时间线吸附功能(Enable Timeline Snapping):拖动播放头,播放头将会自动吸附到时间点、动画或关键帧等
-4.启用时间线网格(Enable Timeline Grid):时间信息表上将会显示时间网格,方便设计者在确切时间点设定关键帧等,网格的大小可用户自定义。
-5.自动记录关键帧模式(Auto Keyframe Mode(K)):开启模式下,设计者对元素所做的属性值修改都会以关键帧的形式记录在时间线上。
-6.自动生成动画模式(Auto Transition Mode(X)):开启模式下,在两个关键帧之间会自动生成动画,默认开启。
-7.播放标记(Toggle Pin(P)):可以设置播放的起始和终止位置。
-
-
-edge animation 代码管理
-代码管理器使用一个单独完整的窗口界面来展示所有事件控制代码和时间线触发器。(快捷键Ctrl/Command + E或者通过菜单Window-Code打开)所被编辑的控制代码或触发器会被高亮显示。
-1.点击“+”图标添加全局、局部、时间线控制代码或者触发器;
-2.点击“Full Code”按钮可以显示并编辑单个文件的全部代码,而不仅仅是单个功能函数内部代码;
-3.可以通过下方的代码错误提示窗进行错误快速排除检测。
-
-
-## 实例操作
-当我们了解以上这些知识点,之后,我们来做一下简单的实例,实现顶部图片我们所看到的界面,人物跑动,背景向前移动。
-
-## 第一部分 使用SpriteSheet在Edge Animate中制作人物跑动的动画
-1.启动Edge Animate,创建一个新项目blackfriday,设置stage大小为640*1136;
-
-2.导入blackfriday SpriteSheet
-点击菜单“File->Import”,或者快捷键Ctrl+I / Command+I,来导入blackfriday_sprite.png到舞台。在舞台上选中导入的图片,在左边栏Position and Size栏目下,设定其X坐标值=160px,y坐标值为330px,保证第一个smurf的位置在舞台最左侧并垂直居中。
-
-3.使用Clip切割Spritesheet,显示单一Sprite元素
-我们导入的蓝精灵Spritesheet是320*480大小的透明背景png图片,一共描绘了32个蓝精灵行走的姿态。通过序列播放这32个行走姿态,就可以制作一个完整蓝精灵行走动画。
-首先,要在舞台上只显示一个Sprite元素,比如最左上角的第一个蓝精灵。在Edge Animate左侧属性面板中,倒数第二个栏目是clip子面板。顾名思义,clip功能区可以帮助我们“切割”舞台上的元素,比如图片。该功能区实际上利用了CSS的clip属性。
-点击clip子面板的开关按钮,可以激活clip功能。使用鼠标,可以在clip属性设定面板上的上、下、左、右属性值上滑动,你可以在舞台上实时看到“切割”的图片情况。如下图。 在本例中,请设定clip的top,right,bottom,left属性值分别为0, 320,480,0。
-
-
-4. 创建32个Keyframe,实现行走动作
-接下来,我们创建32个帧来完成蓝精灵行走的动作。
-1) 调整帧间隔
-在舞台下方的时间轴上,Edge Animate用竖线网格标记了每帧间距。在Smurf行走动画中,我们希望在1毫秒的时间左右完成一个行走动作,即32帧。因此,我们需要通过时间轴下方的Gird Size图标调整时间轴为30帧/秒。如下图:
-
-2) 激活“Auto-Keyframe Mode (自动创建帧)”
-Edge Animate有三个非常重要的按钮分别开启Auto-Keyframe Mode(自动创建关键帧)、Auto-Transition Mode和Toggle Pin(大头针)。图标如下图:
-
-Edge Animate Buttons
-本例中,我们将启用Auto-Keyframe Mode,而关闭Auto-Transition Mode和Pin。在启用Auto-Keyframe Mode的情况下,每当我们在新的一帧修改舞台中元素的属性,Edge Animate会自动在此创建关键帧。由于我们关闭了Auto-Transition Mode,因此Edge Animate将不会自动在关键帧之间创建过渡效果。
-3) 创建第一个关键帧
-在时间轴上,把播放头移到0:00秒位置,选中舞台中的蓝精灵,在左边属性面板中的Image子面板下,确认Background Image的x和y属性值为0,然后点击x和y属性边上的小菱形符号(当鼠标移到该菱形符号时,其变为黄色,并显示tips:“Add Keyframe for Background Position”),此时Edge Animate将在时间轴的0:00秒出创建第一个关键帧。如下图
-
-依此方法,在gard线上接着做31个帧。
-
-5。创建完成后,预览:
-使用快捷键Ctrl+Enter/Command+Enter,可以启动默认浏览器看起运行的效果.
-现在,人物已经实现了行走动作,但是还没有完成行进,还不循环播放,运行完32个帧就停止了。
-
-6.转换为元件在最后一帧,设置trigger触发器,达到帧循环动画
-在舞台上选中该图片后,快捷键Cmd+Y/Ctrl+Y将其转换成一个元件(Symbol),叫us,然后删除stage舞台上面的元素,从library面板里面拖动stage舞台上面 。双击元件,进入元件舞台区域,如图,insert trigger:
-
-
-
-## 第二部分 实现背景的滚动
-1.倒入背景图片,生成元件
-快捷键Cmd+I/Ctrl+I导入背景图片american.png,在舞台上选中该图片后,快捷键Cmd+Y/Ctrl+Y将其转换成一个元件(Symbol),命名为americanbg2。
-2.激活Auto-Keyframe Mode,Auto-transition Mode,平移背景图片形成单循环的过渡动画。
-但是当背景向左移出舞台的时候,会看到舞台空出了部分
-3.实现背景图循环滚动的效果
-再次向舞台导入元件,命名为americanbg4.拷贝americanbg2的运动动画,到americanbg2左移舞台出现空白的临界点帧时间,给americanbg4粘贴动画效果。因为我们不需要americanbg4整体效果,所以需要删除americanbg4运动帧超出americanbg2运动帧的结束点。
-
-4.最后一帧,设置trigger触发器,形成循环动效
-
-## 第三部分 增加音乐,闪烁星空
-这一部分,基本参照第一二部分的我们就可以完成整个动画,有一点需要注意设置playback,做初始延迟。
-
-## 第四部分 处理移动端的适配,增加loading
-由于这里出来的动画是640x1136px出来的效果,实现多终端预览时,需要做适配处理,这里我是采用scale进行缩放,已到达统一的效果。
-```
-(function(){var c=document.documentElement,d=function(){var b=c.getBoundingClientRect().width;s=(640<=b?640:b)/640,document.write('");window.addEventListener("resize",function(){var e=c.getBoundingClientRect().width;s=(640<=e?640:e)/640;document.getElementById("scaleCon").innerHTML=".o2-scale{-webkit-transform: scale("+s+"); transform: scale("+s+");-webkit-transform-origin:0% 0%;transform-origin:0% 0%;}"})};d()})();
-```
-我们只需要把class类o2-scale,添加给舞台就可以,完成适配。
-
-[demo演示效果](http://jdc.jd.com/fd/promote/201512/blackfriday/index.html)
-手机扫描:
-
-ios,android亲测,效果还是比较流畅的。
-
-#### 参考资料:
-[Adobe Edge Animate CC 2014 JavaScript API 5.0](http://www.adobe.com/devnet-docs/edgeanimate/api/current/index.html#audio)
-[Adobe Edge Animate 视频教程](https://helpx.adobe.com/edge-animate/how-to/edge-animate-symbols.html)
diff --git a/source/_posts/2015-12-09-an-introduction-to-sass-maps.md b/source/_posts/2015-12-09-an-introduction-to-sass-maps.md
deleted file mode 100644
index a68401cebb..0000000000
--- a/source/_posts/2015-12-09-an-introduction-to-sass-maps.md
+++ /dev/null
@@ -1,506 +0,0 @@
-title: 【译】介绍Sass Maps:用法跟例子
-subtitle: 本文介绍如何利用Sass Maps简化我们的代码,翻译水平有限,敬请指正。
-cover: //img14.360buyimg.com/ling/jfs/t1/42043/13/6770/91198/5d073b77Eff25bd09/30aaefb0edf89c44.jpg
-categories: Web开发
-tags:
- - sass
- - sass maps
-author:
- nick: skycai
- github_name: cnt1992
-date: 2015-12-09 09:54:16
----
-
-> 本文翻译自[An Introduction to Sass Maps:Usage and Examples](http://webdesign.tutsplus.com/tutorials/an-introduction-to-sass-maps-usage-and-examples--cms-22184)
-
-
-
-对于前端可伸缩页面的编写来说Sass Maps可以说是一个福音,从逻辑模块中抽取出配置是一种非常好的方法。现在就让我跟你解释为什么我认为在Sass 3.3中Sass Maps是最好的特性。
-
-## Sass 3.3
-
-Sass 3.3[*注1*]即将更新给所有人使用,但是对于很多开发者来说还有很多实用性的特性他们依然不熟悉。新版本的Sass 3.3带给我们新的数据类型称为`map`。`Maps`是`key/value`键值对的集合,能够帮助我们通过简单的代码创建一块配置区域。
-
-## 如何使用 Sass Maps
-
-首先我们会覆盖Sass Maps的基本用法,后面会看几个实例。
-
-### 创建一个Map
-
-下面是一个快速创建Sass Maps的语句,创建一个变量(这里用了`$map`)然后输入一些`keys`跟`values`,通过`,`来分割,这些键值对通过括号包围起来:
-
-```css
-$map: (
- key: value,
- nextkey: nextvalue
-);
-```
-
-### 如何获取Map的值
-
-当你定义了很多对`key/value`键值对之后,有时候你需要取出一些值。你可以通过`map-get()`方法来找出某个`key`的`value`。该方法需要传入两个参数:`map`的名称还有`key`。
-
-```javascript
-.element:before {
- content: map-get($map, key);
-}
-```
-
-上面编译输出后的结果如下:
-
-```css
-.element:before {
- content: value
-}
-```
-
-### 如何检查某一个key是否存在
-
-在用`Sass`进行编码的时候强烈建议使用[可靠的错误处理](https://webdesign.tutsplus.com/tutorials/an-introduction-to-error-handling-in-sass--cms-19996)。在这里`Sass`给了我们一个方法`map-has-key()`。这个方法能够检测出某个`key`是否存在,如果不存在能够输出其他信息给开发者。
-
-可以移步 `Hugo Giraudel` 写的这篇如何处理错误的文章 [An Introduction to Error Handing in Sass](http://webdesign.tutsplus.com/tutorials/an-introduction-to-error-handling-in-sass--cms-19996)。
-
-```javascript
-$map: (
- key: value,
- nextkey: nextvalue
-);
-
-.element {
- @if map-has-key($map, key){
- content: 'Map has this key.';
- } @else {
- content: 'Map has not this key.'
- }
-}
-```
-
-编译之后结果如下:
-
-```css
-.element {
- content: 'Map has this key.';
-}
-```
-
-### 如何合并Maps
-
-这个一个福利:`Sass`允许我们合并两个甚至更多个`maps`成一个,这是一个非常实用的功能,通过下面这个例子我们将知道如何使用`map-merge()`方法:
-
-```javascript
-$colors: (
- light: #ccc,
- dark: #000
-);
-
-$brand-colors: (
- main: red,
- alternative: blue
-);
-
-// 合并maps
-$merged: map-merge($colors, $brand-colors);
-
-.element {
- content: map-get($merged, alternative);
-}
-```
-
-编译之后结果如下:
-
-```css
-.element {
- content: blue;
-}
-```
-
-## 利用Sass Maps进行实战
-
-上面我们介绍了如何实用`Sass Maps`,现在我们将通过一些实战训练看看在哪些地方适合使用该特性。
-
-1.如何循环Map生成类
-
-你可以遍历`map`通过里面的`values`去定义你需要的变量然后加到`map`里面的`name`去,这样子你可以创建出很多种`values`。
-
-在下面的例子中我将输出`classes`来展示`icons`。我将`icon`的`name`作为`key`,让`value`去替代实际的`content`(通过伪元素加进去)。
-
-> 注意:在项目实战中我们通过会先声明一些基础的样式,这不在本教程的范围内。
-
-```javascript
-/* 定义一个sass map名称为$icons */
-$icons: (
- checkmark: a,
- plus: b,
- minus: c
-);
-
-/* 遍历map的所有key,创建各自的类 */
-@each $name, $value in $icons {
- .icon--#{$name} {
- content: $value;
- }
-}
-```
-
-编译之后结果如下:
-
-```css
-/* 遍历map的所有key,创建各自的类 */
-.icon--checkmark {
- content: "a";
-}
-
-.icon--plus {
- content: "b";
-}
-
-.icon--minus {
- content: "c";
-}
-```
-
-这是一种非常高效的方法来输出icons的所有类,还有大量情况也会使用这种方法。
-
-2.如何拿出Maps的多个值
-
-让我们继续,给一个`key`赋予多个`value`也是可以的。多个`value`之间通过`,`来分割。下面的例子能够非常好的输出不同模块的样式。
-
-这里我将定义一系列`buttons`,每一个`key`的第一个`value`是`background-color`,第二个`value`是`font-color`。
-
-然后我将通遍历`keys`赋值给`$colors`对象。通过`nth($colors,1)`(第一个参数是对象的名称,第二个参数是值得位置)拿到第一个`key`。如果你需要拿第二个`value`,那将第二个参数改为`2`。
-
-```javascript
-// _m-buttons.scss
-$buttons: (
- error: (#d82d2d, #666),
- success: (#52bf4a, #fff),
- warning: (#c23435, #fff)
-);
-
-.m-button {
- display: inling-block;
- padding: .5em;
- background: #ccc;
- color: #666;
-
- @each $name, $colors in $buttons {
- $bgcolor: nth($colors, 1);
- $fontcolor: nth($colors, 2);
-
- &--#{$name} {
- background-color: $bgcolor;
- color: $fontcolor;
- }
- }
-}
-```
-
-编译之后结果如下:
-
-```css
-.m-button {
- display: inline-block;
- padding: .5em;
- background: #ccc;
- color: #666;
-}
-
-.m-button--error {
- background-color: #d82d2d;
- color: #666;
-}
-
-.m-button--success {
- background-color: #52bf4a;
- color: #fff;
-}
-
-.m-button--warning {
- background-color: #c23435;
- color: #fff;
-}
-```
-
-3.处理层(z-index)
-
-在某种程度上来说,我还没有见过不跟[z-index](https://webdesign.tutsplus.com/articles/what-you-may-not-know-about-the-z-index-property--webdesign-16892)打交道的前端开发。当你在项目中多个地方需要使用到`z-index`的时候问题通常随之而来,`Sass maps`能够帮我们解决这些问题。
-
-首先我们定义了一个map名称为`$layer`,所有的`key`都应该合理命名以便我们能够知道哪个value是对应哪个element的-比如:`offcanvas`,`lightbox`,`dropdown`等。
-
-```javascript
-// _config.scss
-$layer: (
- offcanvas: 1,
- lightbox: 500,
- dropdown: 10,
- tooltip: 15
-);
-
-// _m-lightboxes.scss
-@function layer($name) {
- @if map-has-key($layer, $name) {
- @return map-get($layer, $name);
- }
-
- @warn "The key #{$name} is not in the map '$layer'";
- @return null;
-};
-
-.m-lightbox {
- z-index: layer(lightbox);
-}
-```
-
-上面我定义了一个方法用来获取特定`key`的`value`,但为什么我要这样做?理由很简单:这样子比每次都写`map-get()`方法要方便快捷。另外一个方面就是你可以创建`错误处理`给开发者一些错误信息当没有输出期望的信息的时候。
-
-编译结果如下:
-
-```css
-.m-lightbox {
- z-index: 500;
-}
-```
-
-4.在项目中为字体创建基本样式
-
-每一个项目都拥有自己的配置文件,用来给全局使用。例如在我的项目中我会定义一些字体属性:字体颜色,可选的字体颜色,字体集或者字体大小。我通常都会为每个属性创建一个变量,但是`map`能够做得更好。
-
-下面是一个简单的例子,先从*旧*的解决方法开始:
-
-```javascript
-$base-font-color: #666;
-$base-font-family: Arial, Heletica, Sans-Serif;
-$base-font-size: 16px;
-$base-line-height: 1.4;
-```
-
-接下来看通过`Sass Map`写的`新`的解决方法:
-
-```javascript
-// _config.scss
-$font: (
- color: #666;
- family: (Arial, Helvetica),
- size: 16px,
- line-height: 1.4
-);
-
-// _presets.scss
-body {
- color: map-get($font, color);
- font-family: map-get($font, family);
- font-size: map-get($font, size);
- line-height: map-get($font, line-height);
-}
-```
-
-5.Breakpoints < 3
-
-我很喜欢这个使用案例。在你的整个项目中拥有一块专门用来处理断点是非常好的。所以,像这一节中关于处理`z-index`,你就已经用到了断点。当你改变值得时候,整个项目的行为也随之改变,这多么令人惊讶。
-
-那就先让我们通过一个`map`名称为`$breakpoints`开始吧。
-
-我们的目标就是在一个元素中使用断点通过易懂的名字替代那些`pixel`值,所以需要一个`mixin`方法来实现占位`name`,我把mixin命名为`respond-to`以及传入`$brakpoint`参数。通过`$value`我就能得到期望的断点然后后面在`媒体查询`中使用。
-
-```javascript
-// Map with much breakpoints
-$breakpoints: (
- small: 320px,
- medium: 600px,
- large: 768px
-);
-
-// Respond-To Mixin
-@mixin respond-to($breakpoint) {
- @if map-has-key($breakpoints, $breakpoint) {
- $value: map-get($breakpoints, $breakpoint);
-
- @media screen and (min-width: $value) {
- @content;
- }
- }
-
- @warning "Unknown `#{$breakpoint}` in $breakpoints";
-}
-```
-
-示例:
-
-```javascript
-// Sass
-.m-tabs {
- background-color: #f2f2f2;
-
- @include reponse-to(medium) {
- background-color: #666;
- }
-}
-
-// Output
-.m-tabs {
- background-color: #f2f2f2;
-}
-@media screen and (min-width: 600px) {
- background-color: #666;
-}
-```
-
-这种使用案例是我最喜欢之一!
-
-6.颜色的高级使用
-
-现在事情变得有一点点困难了,让我们看看通过不同色调定义的颜色计划。
-
-我们的`Sass map`在这个例子中定义了一个`$colorscheme`同时里面定义了很多对象拥有`keys`跟`values`。项目中拥有不同的灰色调,但我们不想为每一个都声明一个变量。所以我们增加了一个对象`gray`,然后通过键值对分割。
-
-下面开始这个Map:
-
-```javascript
-// Scheme of colors
-$colorscheme: (
- gray: (
- base: #ccc,
- light: #f2f2f2,
- dark: #666
- ),
- brown: (
- base: #ab906b,
- light: #ecdac3,
- dark: #5e421c
- )
-);
-```
-
-现在让我们加入`setcolor`方法来获取颜色的不同选择。第一个参数是Sass map的对象(`$scheme`)-在这个例子中可能是`gray`或者`brown`,第二个参数就是你想要的颜色(`$tone`),默认值是`base`。
-
-```javascript
-@function setcolor($scheme, $tone: base) {
- @return map-get(map-get($colorscheme, $scheme), $tone);
-}
-```
-
-最后,这里给出了一个例子能够让你从这个map中获取不同颜色,比你想象中的还要简单(也许)!
-
-```javascript
-// Sass
-.element {
- color: setcolor(brown);
-}
-.element--light {
- color: setcolor(brown, light);
-}
-
-// Output
-.element {
- color: #ab906b;
-}
-.element--light {
- color: #ecdac3;
-}
-```
-
-你会完成上面的挑战的,现在你能够创建一组色调而不需要通过为每一种颜色创建一个变量。
-
-这个方法我是受到了[Tom Davies](http://erskinedesign.com/blog/friendlier-colour-names-sass-maps/)的启发,同时我也建议你看看他这篇文章。
-
-
-## 通过Classes定制主题
-
-这是为高级Sass用户准备的。在项目中会经常需要通过一些基础代码创建多套主题,所以这里给出一个建议:在文档的最开始就定义一个 *主题类* 来满足特定的工作。我们需要一个对象以便能够处理不同名字的主题,同时给出不同的样式模块。
-
-### 定义themes
-
-最开始,在你的项目中通过Sass map全局定义themes,`value`就是主题名字,同时这个类必须附在`body`元素。在这个例子中我创建了一个map`$themes`,里面有两个主题:`theme-light`和`theme-dark`。
-
-```javascript
-// _config.scss
-$themes: (
- theme1: theme-light;
- theme2: theme-dark;
-);
-```
-
-### 获取值(捷径)
-
-现在我们需要一个方法来快速获取模块的值,这是一个简单的方法包括三个变量如下:
-
-- `$map`: 定义map的名字确定values是从哪里来的
-- `$object`: 在这里例子中就是theme的key
-- `$style`: 需要的样式属性值
-
-```javascript
-// _functions.scss
-@function setStyle($map, $object, $style) {
- @if map-has-key($map, $object) {
- @return map-get(map-get($map, $object), $style);
- }
- @warn "The key `#{$object}` is not available in the map.";
- @return null;
-}
-```
-
-### 生成模块
-
-现在我们创建新的`Sass Map`名称为`$config`,每一个主题都是一个对象同时名字必须是`$themes`中的`key`:不然将会报错。
-
-```javascript
-// _m-buttons.scss
-// 1.Config
-$config: (
- theme1: (
- background: #f2f2f2,
- color: #000
- ),
- theme2: (
- background: #666,
- color: #fff
- )
-);
-```
-
-### 遍历主题
-
-最后一部分会使用一点点技巧。开始的地方我们定义了一个模块`.m-button`然后我们期望在每个主题下面外观是不一样的。所以我们使用`@each`方法遍历Map`$themes`拿到`$key`跟`$value`。遍历之后就能够为不同主题创建map。
-
-在这一节的开始我提到了`keys`在每个map里面必须是一样的(`$themes`跟`$config`)。因此我们必须检查map`$config`的key是否都来自map`$themes`,这里使用到了`map-has-key()`方法。如果包含了key那就继续往下执行,否则抛出错误给开发者。
-
-```javascript
-// _m-buttons.scss
-// 2.Base
-.m-button {
- @each $key, $value in $themes {
- @if map-has-key($config, $key) {
- .#{$value} & {
- background: setStyle($config, $key, background);
- color: setStyle($config, $key, color);
- }
- } @else {
- @warn "The key `#{$key} isn't defined in the map $config`"
- }
- }
-}
-```
-
-通过上面的代码,让我们看看输出的结果。这是非常好的,保证了配置区域跟模块解耦。
-
-```css
-.theme-light .m-button {
- background: #f2f2f2;
- color: #000;
-}
-.theme-dark .m-button {
- background: #666;
- color: #fff;
-}
-```
-
-最后你可以自己试试上面的代码看能不能运行出结果。也许对于你来说这个方案并不是最好的,你会寻求另外的方案,但是我依然希望这能够帮助你维持代码。
-
-## 最后思考
-
-在我看来 `Sass Maps`是Sass 3.3最值得介绍的特性。理由是我认为它给出了非常好的方式来创建健壮的结构,这只需要少量的配置。Sass maps使得我们可以在不影响整个项目的基础逻辑代码基础上改变值。开始使用它吧,你的伙伴将会感激你!
-
-如果你已经开始使用`Sass maps`了,让我知道你如何在你的项目中使用它!
-
-
-- 注1: 截至译文的Sass最新版本是3.4.19
diff --git a/source/_posts/2015-12-18-etymology-of-foobar.md b/source/_posts/2015-12-18-etymology-of-foobar.md
deleted file mode 100644
index 6fe2727254..0000000000
--- a/source/_posts/2015-12-18-etymology-of-foobar.md
+++ /dev/null
@@ -1,98 +0,0 @@
-title: What Does the Foo Mean
-subtitle: "以前在不少编程书里经常看到 “foo”、“bar” 这对 couple,一直不知道他们的具体含义,于是默默去 google 搜了一下,发现结果还挺有意思"
-date: 2015-12-18 21:22:23
-cover: //img10.360buyimg.com/ling/jfs/t1/44093/38/6846/97087/5d073b90E016f0811/3ea9fb9a5477d516.png
-categories: 生活玩乐
-tags:
-- Foo
-author:
- nick: 贴脸ADC
- github_name: mihanX
-
----
-
-今天在 WebKit 看了 CSS 伪类的文章,其中对 `:matches()` 的介绍出现了 `foo` 和 `bar`:
-
- :matches(.foo, .bar) {
- background-color: green;
- }
-
-随即想起,以前在不少编程书里经常看到 `foo`、`bar` 这对 couple,一直不知道他们的具体含义,于是默默去 google 搜了一下,发现结果都几有意思。
-
-首先在 *Quora* 里发现一位名为 *Thom Parkin* 的网友回答:
-
-> "foo" has been (until very recently) always used as part of a pair (with "bar") when representing arbitrary names in computer science. This is primarily in the instance of examples.
->
-> Much like the "Hello World" is a standard for examples in computer programming the use of "foo" and "bar" had grown in popularity.
->
-> The origin comes from a common phrase much older than computers and computer programming.
->
-> The choice of "foo" coupled with "bar" is derived from the coloquial acronym FUBAR (pronounced FOO-bar).
->
-> Legendarily from the military world, it represents the phrase:
-> "Fucked Up Beyond All Recognition" (in 'mixed company' the first word could be "Fouled").
-
-大概的意思是说:
-
-在计算计领域里,“foo” 和 “bar” 通常会成对出现,在举例的时候用作没有明确意义的命名,就好像 “Hellow World” 例子在计算机编程里面作为标准的例子一样,“foo” 和 “bar” 的使用已经变得很流行。
-
-而该词在常用的习语里面出现的时间远比在计算机或计算机编程里面出现的早,“foo” 和 “bar” 成对出现则起源于口语 “FUBAR” 一词(发音和 Foo-bar 一样)。
-
-来自军事世界的传说中,“FooBar” 的含义则是 “Fucked Up Beyond All Recognition,全句意思是 “糟糕糟到面目全非/真是混乱不堪” ?
-
-看完 *Thom Parkin* 的解释,隐隐约约觉得此词来头不小,但是啊 *Thom* 的介绍又不够详细,然后继续 search 一下,发现万能 Wiki Sir 对此有更详细的描述。
-
-Wiki Sir 直接就来一句 “Not to be confused with FUBAR”,心里只想说:666666
-
-Wiki 对 “Foobar” 一词的定义是这样的:
-
-> The terms foobar (/ˈfuːbɑr/), fubar, or foo, bar, baz and qux (alternatively, quux) and sometimes norf[1][2][3][4] and many others[5][6] are sometimes used as placeholder names (also referred to as metasyntactic variables) in computer programming or computer-related documentation.[7] They have been used to name entities such as variables, functions, and commands whose exact identity is unimportant and serve only to demonstrate a concept. The words themselves have no meaning in this usage. Foobar is sometimes used alone; foo, bar, and baz are sometimes used, when multiple entities are needed.
-
-大概意思是:
-
-* Foobar 还有一群兄弟姐妹,例如 “fubar” 、“baz”、“qux”、“quux”、“norf”,他们很多时候都会作为占位名(或者作为伪变量)被应用在计算机编程或与计算机相关的文档中。
-
-* 他们被用作变量命名、函数命名、和命令命名,这些命名基本都是不重要的,仅仅作为某个概念阐述的示例,他们本身并没有什么具体含义
-
-* Foobar有时候单独使用,而当多个这种用法出现的时候, “foo”,“bar”,“baz” 会组合使用。
-
-嗯~~ 原来是这样~~
-
-那么出处呢?Wiki Sir 介绍得比较详细,有兴趣的同学自己 [Click Here](https://en.wikipedia.org/wiki/Foobar#History_and_etymology) 去看看原文,在下也试下意译到本文
-
-*Foo* 一词起源于 20 世纪 30 年代的一个并没有任何意义的词(nonsense word)和 20 世界 40 年代军事术语里面的 “FUBAR” 以及大约在 20 世纪 60 年代麻省理工学院铁路模型技术俱乐部(TMRC)在一个程序上下文用到的词汇。然而,这些词汇之间明确的联系仍然不清晰,从而使得一些有趣的理论学说进一步去定义他们。
-
-*Foo* 在文献 《Internet Engineering Task Force (IETF) [RFC 3092](https://tools.ietf.org/html/rfc3092)》里有定义(文献标题为 Etymology of "Foo"),文献给出了 *foo* 最早的使用记录,就是出现在 20 世纪 30 年代由美国 *Bill Holman* 创作的连载漫画 *Smokey Stover*,*foo* 被用作没有具体含义的词,如下图的 “foomobile”:
-
-
-
-*(Smokey Stover driving a "foomobile")*
-
-作者 *Holman* 说使用这个词是因为他在旧金山唐人街看到一尊中国玉雕像底部的“福”字,*foo* 大概是 *福(fu)* 的音译。而当时像 “福祿壽”、“福满处”等象征上帝的虚构形象在中国非常流行。
-
-*Smokey Stover* 从 1935 连载到 1973,期间一直重点保留着 “foo” 的特征,就好像上面 “foomobile” 的插图。这个词在 20 世纪 30 年代非常流行,除了在 *Smokey Stover* 出现,还在其它卡通和连载漫画里出现,如由 *Bob Clampett* 创办的 *Looney Tunes(兔巴哥)*卡通系列里的 *The Daffy Doc* 和 *Porky in Wackyland* 以及漫画 *Pogo*
-
-接着,*Foo* 走进了军事俚语 “FUBAR”(Fucked Up Beyond All Recognition)一词中,合并到词里的 “FU”。在第二次世界大战里盟军飞行员用词汇 “foo fighter” 描述各种各样的 UFO 或者一些神秘的空中现象
-
-*Foo* 第一次在正式的程序类印刷品作为较为人知的词汇出现于 1965 年 TMRC 的一版印刷品,关于紧急开关(scram switches)方面的内容:
-
-在复杂的模型系统中,一些紧急开关被安装在许多场所附近可以利用的空间里,这些场所有可能会发生突发的不幸事故,如全速前进的火车遇到障碍物。这种模型系统的另一个特性就是调试模拟盘上的数码时钟。当有人按下紧急开关,数码时钟就停止工作,显示屏上亦随之换成 “FOO” 这个词。在 TMRC 里面,紧急开关也因此称作 “Foo开关”(Foo switches)。正因为这样,“foo” 一词录入了 TMRC 语言字典。
-
-有一本书描述了 MIT(麻省理工学院) 列车室靠门侧的两个分别标上 “foo” 和 “bar” 标签的按钮。在那时期,这两个词通常应用到各种按钮上;当 MIT 的黑客们有新奇想法的时候也会反复使用他们。因此,*foo* 和 *bar* 被广泛用作变化不定的命名。在 TMRC 语言字典精简版中有这样的描述:
-
-> Multiflush: stop-all-trains-button. Next best thing to the red door button. Also called FOO. Displays "FOO" on the clock when used.
-
-Multiflush(不知道叫啥):停下所有列车按钮,门边的红色按钮,也叫做 “FOO”,当使用后,时钟上会显示 "FOO"。
-
-好了,现在终于知道 *foo*、*bar* 是什么了,简单总结下就是:
-
-1. 20 世纪 30 年代,一位美国漫画达人在一尊中国玉雕像上看到一个中国字 -- “福” ,然后就将其音译成 “foo”,并应用到他自己的漫画上
-
-2. 漫画大叔将 “foo” 发扬光大不久,唯恐不乱的军事世界将 “foo” 放到了俚语 “FUBAR” 里面,演变成了 “Foobar”
-
-3. 之后 MIT 人才在介绍一项 “complex model system” 的紧急开关中引入了 “foo” 一词,并发表出去,于是乎 MIT 的黑客们一有新奇想法就用 “foo” 一词,并用上了瘾,久而久之大家就对 “foo” 和 “bar” 认识达成了共识
-
-一句话概括就是:*Foo*、*Bar* 什么鬼都不是却能代表一切,FUBAR!
-
-The End
-
diff --git a/source/_posts/2015-12-23-building-command-line-tools-with-node-js.md b/source/_posts/2015-12-23-building-command-line-tools-with-node-js.md
deleted file mode 100644
index 1ffff5e997..0000000000
--- a/source/_posts/2015-12-23-building-command-line-tools-with-node-js.md
+++ /dev/null
@@ -1,393 +0,0 @@
-title: 【译】使用Node.js创建命令行脚本工具
-subtitle: 通过本文将一步步带领你利用Node.js来创建命令行脚本工具
-cover: //img30.360buyimg.com/ling/jfs/t1/70696/17/2087/34217/5d073bc3E9ff38592/60e9bc7581e6d754.jpg
-categories: NodeJS
-tags:
- - NodeJS
- - CMD
-author:
- nick: SkyCai
- github_name: cnt1992
-date: 2015-12-23 13:19:07
----
-
-> 本文译自 [Building command line tools with Node.js](https://developer.atlassian.com/blog/2015/11/scripting-with-node/),介绍了如何通过Node.js来创建命令行脚本工具,介绍了很多实用的`npm`包等。翻译水平有限,敬请指正~
-
-
-
-在我的职业生涯中已经写过了上百个 `Bash` 脚本,但我的 `Bash` 依然写得很糟糕,每一次我都不得不去查一些简单逻辑结构的语法。如果我想通过 `curl` 或者 `sed` 来做一些事情,我也必须去查找 `man` 文档。
-
-然后,有一天,我看到六个字母的语言[译者注:这里指NodeJS] — 一门在过去十年里我几乎 *每一天* 都在使用的语言,这才让我幡然醒悟。结果是你可以使用 `JavaScript` 来写脚本!
-
-在这篇教程中,我将会在使用 `Node.js` 和 `npm` 创建一个脚本或者命令行工具方面给你一些我的想法。特别地我们将会包括以下内容:
-
-- 使用 `npm` 封装一个新的 `shell` 命令
-- 解析命令行参数
-- 从输入流中读取文本和密码
-- 发送 snippet
-- 输出错误与代码
-- 终端输出彩色化
-- 渲染 `ACSII` 进度条
-
-我热衷于已经可以工作的例子,所以为了解释这些概念我们将会创建一个新的 `shell` 命令,它的名字为 `snippet` ,可以在我们本地磁盘的文件创建一个 [Bitbucket Snippet](https://confluence.atlassian.com/bitbucket/snippets-719095082.html)。
-
-这是我们的最终目标成果:
-
-
-
-## 封装 shell 命令
-
-`npm` 不单单用来管理你的应用和网页的依赖,你还能用它来封装和分发新的 `shell` 命令。
-
-第一步就是通过 `npm init` [译者注:可以通过 `npm init -f`直接快速生成一个`package.json`]来创建一个新的 `npm` 项目:
-
-```bash
-$ npm init
-name: bitbucket-snippet
-version: 0.0.1
-description: A command-line tool for creating Bitbucket snippets.
-entry point: index.js
-license: Apache-2.0
-```
-
-这会在我们的项目中创建一个新的 `package.json` 文件,那时我们将需要创建一个 `JS` 文件包含我们的脚本。让我们根据Node.js的传统命名为 `index.js`。
-
-```javascript
-#!/usr/bin/env node
-console.log('Hello, world!');
-```
-
-注意我们必须加一些 `东西` 来告诉我们的 `shell` 如何处理我们的脚本。
-
-接下来我们需要在我们 `package.json` 里面的最顶级增加 `bin` 部分。设置的属性(在我们的例子中是 `snippet`)将会变成用户在他们的终端处理脚本使用的命令,属性值就是相对于 `package.json` 的脚本位置。
-
-```json
-...
- "author": "Tim Pettersen",
- "license": "Apache-2.0",
- "bin": {
- "snippet": "./index.js"
- }
-```
-
-现在我们已经有一个可以工作的 `shell` 命令了!让我们安装它并且测试结果。
-
-```bash
-$ npm install -g
-$ snippet
-Hello, world!
-```
-
-真整洁! `npm install -g` 实际上是将我们脚本链接到 `path` 变量的位置,所以我们能够在任何地方使用它。
-
-```bash
-$ which snippet
-/usr/local/bin/snippet
-$ readlink /usr/local/bin/snippet
-../lib/node_modules/bitbucket-snippet/index.js
-```
-
-在开发环境中我们实际上使用 `npm link` 便利地将我们的 `index.js` 软链接到 `path` 变量的位置。
-
-```bash
-$ npm link
-/usr/local/bin/snippet -> /usr/local/lib/node_modules/bitbucket-snippet/index.js
-/usr/local/lib/node_modules/bitbucket-snippet -> /Users/kannonboy/src/bitbucket-snippet
-```
-
-当我们开发完成的时候,我们可以通过 `npm publish` 将我们的脚本发布到公共 `npm` 仓库,然后任何人都可以下载安装到他们的机器上:
-
-```bash
-$ npm install -g bitbucket-snippet
-```
-
-但是让我们先让我们的脚本能够工作先!
-
-## 解析命令行参数
-
-我们的脚本现在需要一些用户的输入:他们的Bitbucket名字,他们的密码,还有作为 `snippet`上传的文件位置。典型的方法就是通过命令的参数传输这些值。
-
-你可以通过 `process.argv` 拿到序列化的参数,但有很多 `npm` 包在解析参数还有选项方面提供了很好的抽象给你。我最喜欢的就是 [commander](https://www.npmjs.com/package/commander),来自 `Ruby gem`同一个名字的灵感。
-
-一个简单的命令安装它:
-
-```bash
-$ npm install --save commander
-```
-
-上面命令将会把最新版的 `commander` 加入 `package.json`。我们这时可以通过简单声明式的方式定义我们的选项:
-
-```javascript
-#!/usr/bin/env node
-- console.log('Hello, world!');
-+ var program = require('commander');
-+
-+ program
-+ .arguments('')
-+ .option('-u, --username ', 'The user to authenticate as')
-+ .option('-p, --password ', 'The user\'s password')
-+ .action(function(file) {
-+ console.log('user: %s pass: %s file: %s',
-+ program.username, program.password, file);
-+ })
-+ .parse(process.argv);
-```
-
-上面代码可读性很强。事实上,这是一个保守的说法。相对于那些我们需要通过 `switch` 来控制的像 `Bash`,这是一个艺术品。至少,我写的 `Bash` 是这样子的。
-
-让我们快速测试:
-
-```bash
-$ snippet -u kannonboy -p correcthorsebatterystaple file
-user: kannonboy pass: correcthorsebatterystaple file: file
-```
-
-很棒!`commander` 还提供一些简单的帮助输出给我们,基于我们上面提供的配置。
-
-```bash
-$ snippet --help
-
- Usage: snippet [options]
-
- Options:
-
- -h, --help output usage information
- -u, --username The user to authenticate as
- -p, --password The user's password
-```
-
-所以我们已经拿到了参数了。但是,让用户在空白的地方输入他们的密码作为选项有一点难用。让我们解决它。
-
-## 从输入流中读取文本和密码
-
-另一种通用的取回用户的内容的脚本方式是从标准输入流中读。这可以通过 `process.stdin` 实现,但是再说一次,已经有很多 `npm` 包提供了非常好的 API 给我们使用。很多都是基于 `callback` 或者 `promises`,但是我们将使用 [co-prompt](https://www.npmjs.com/package/co-prompt) (基于 [co](https://www.npmjs.com/package/co)),因此我们可以利用 ES6 的 `yield` 关键词。这让我们写异步的代码而不需要 `callbacks` ,看起来更加脚本化。
-
-```bash
-$ npm install --save co co-prompt
-```
-
-为了组合使用 `yield` 和 `co-prompt` ,我们需要通过一些 `co` 的魔法来包裹我们的代码:
-
-```javascript
-+ var co = require('co');
-+ var prompt = require('co-prompt');
- var program = require('commander');
-...
- .option('-u, --username ', 'The user to authenticate as')
- .option('-p, --password ', 'The user\'s password')
- .action(function(file) {
-+ co(function *() {
-+ var username = yield prompt('username: ');
-+ var password = yield prompt.password('password: ');
- console.log('user: %s pass: %s file: %s',
-- program.username, program.password, file);
-+ username, password, file);
-+ });
- })
-...
-```
-
-现在快速测试一下。
-
-```bash
-$ snippet my_awesome_file
-username: kannonboy
-password: *************************
-user: kannonboy pass: correcthorsebatterystaple file: my_awesome_file
-```
-
-很棒!唯一的窍门就是ES6的 `yield`,所以这只能在用户运行在 node 4.0.0+上面。但是我们可以通过加入 `--harmony` 标志让 0.11.2 版本的也可以正常使用。
-
-```javascript
-- #!/usr/bin/env node
-+ #!/usr/bin/env node --harmony
- var co = require('co');
- var prompt = require('co-prompt');
-...
-```
-
-## 发送 snippet
-
-Bitbucket拥有一套非常漂亮的 [API](https://confluence.atlassian.com/display/BITBUCKET/Snippets+endpoint)。在这个例子中我将关注传输单一的文件,但我们可以发送整个目录,改变我们的入口配置,加一些代码等,如果我们需要的话。我最喜欢的node HTTP 客户端是 [superagent](https://www.npmjs.com/package/superagent) ,所以让我们把它加入项目中。
-
-```bash
-$ npm install --save superagent
-```
-
-现在就让我们将从用户收集到的数据发送给服务器。 `superagent` 其中一个优点就是在它在处理文件上拥有非常好的API。
-
-```javascript
-+ var request = require('superagent');
- var co = require('co');
- var prompt = require('co-prompt');
-...
- .action(function(file) {
- co(function *() {
- var username = yield prompt('username: ');
- var password = yield prompt.password('password: ');
-- console.log('user: %s pass: %s file: %s',
-- file, username, password);
-+ request
-+ .post('https://api.bitbucket.org/2.0/snippets/')
-+ .auth(username, password)
-+ .attach('file', file)
-+ .set('Accept', 'application/json')
-+ .end(function (err, res) {
-+ var link = res.body.links.html.href;
-+ console.log('Snippet created: %s', link);
-+ });
- });
- });
-...
-```
-
-现在让我们测试一下。
-
-```bash
-$ snippet my_awesome_file
-username: kannonboy
-password: *************************
-Snippet created: https://bitbucket.org/snippets/kannonboy/yq7r8
-```
-
-我们的 snippet 已经发送了!\o/
-
-## 输出错误与代码
-
-到现在为止我们已经处理了一切正确的情况,但是如果我们上传失败或者用户输入错误的信息呢?`UNIX-y`的方法来处理错误就是将标准的错误信息输出并且以非0的状态码结束程序,所以我们也这样子做。
-
-```javascript
-...
- request
- .post('https://api.bitbucket.org/2.0/snippets/')
- .auth(username, password)
- .attach('file', filename, file)
- .set('Accept', 'application/json')
- .end(function (err, res) {
-+ if (!err && res.ok) {
- var link = res.body.links.html.href;
- console.log('Snippet created: %s', link);
-+ process.exit(0);
-+ }
-+
-+ var errorMessage;
-+ if (res && res.status === 401) {
-+ errorMessage = "Authentication failed! Bad username/password?";
-+ } else if (err) {
-+ errorMessage = err;
-+ } else {
-+ errorMessage = res.text;
-+ }
-+ console.error(errorMessage);
-+ process.exit(1);
- });
-```
-
-这样子就可以处理错误了。
-
-## 终端输出彩色化
-
-如果你的用户是在使用体面的 `shell` ,这里也有一些包提供给你使用让你方便彩色化的输出。我喜欢 [chalk](https://www.npmjs.com/package/chalk) ,因为它拥有干净可链式的API以及自动检测用户的 `shell` 支持的颜色。这是有益的提示如果你想将你的脚本分享给 windows 用户的话。
-
-```bash
-$ npm install --save chalk
-```
-
-`chalk` 的命令能够彩色输出同时还能方便跟常规字符串串联起来。
-
-```javascript
-+ var chalk = require('chalk');
- var request = require('superagent');
- var co = require('co');
-...
- .set('Accept', 'application/json')
- .end(function (err, res) {
- if (!err && res.ok) {
- var link = res.body.links.html.href;
-- console.log('Snippet created: %s', link);
-+ console.log(chalk.bold.cyan('Snippet created: ') + link);
- process.exit(0);
- }
-
- var errorMessage;
- if (res && res.status === 401) {
- errorMessage = "Authentication failed! Bad username/password?";
- } else if (err) {
- errorMessage = err;
- } else {
- errorMessage = res.text;
- }
-- console.error(errorMessage);
-+ console.error(chalk.red(errorMessage));
- process.exit(1);
- });
-```
-
-让我们旋转一下(这里我使用了截图,以便你能看到极好的颜色)。
-
-
-
-
-## 渲染 `ACSII` 进度条
-
-`snippets`的API实际上支持任何类型的文件(最多10MB),但是当文件比较大或者网速特别慢的时候就需要在命令行界面显示上传文件进度了。命令行解决方案就是优雅的 `ASCII` 进度条。
-
-[progress](https://www.npmjs.com/package/progress) 是现在最常用的 `npm` 包用来渲染进度条。
-
-```bash
-$ npm install --save progress
-```
-
-`progress`的API非常简单而且可扩展,唯一的问题就是 `superagent` 当前node版本没有事件能够订阅我们上传的进度。
-
-我们可以通过创建一个 [可读的流](https://nodejs.org/api/stream.html#stream_class_stream_readable) 并且增加一个事件来触发请求。然后我们初始化进度条为0,当事件触发的时候不断增加。
-
-```javascript
-+ var fs = require('fs');
-+ var ProgressBar = require('progress');
- var chalk = require('chalk');
- var request = require('superagent');
-...
- var username = yield prompt('username: ');
- var password = yield prompt.password('password: ');
-
-+ var fileSize = fs.statSync(file).size;
-+ var fileStream = fs.createReadStream(file);
-+ var barOpts = {
-+ width: 20,
-+ total: fileSize,
-+ clear: true
-+ };
-+ var bar = new ProgressBar(' uploading [:bar] :percent :etas', barOpts);
-+
-+ fileStream.on('data', function (chunk) {
-+ bar.tick(chunk.length);
-+ });
-
- request
- .post('https://api.bitbucket.org/2.0/snippets/')
- .auth(username, password)
-- .attach('file', file)
-+ .attach('file', fileStream)
- .set('Accept', 'application/json')
-...
-```
-
-下面是一个比较快的网速下上传大约6MB的文件的截图:
-
-
-
-很棒!用户现在就能够看到他们上传的进度并且知道什么时候上传完成。
-
-## 总结
-
-我们只不过接触了用Node开发命令行脚本的冰山一角。在每一期的 [Atwood's Law](http://blog.codinghorror.com/the-principle-of-least-power/) 都有很多 `npm` 包优雅地处理标准输入、管理并行任务、监听文件、管道流、压缩、ssh、git、还有任何你能用 `Bash` 做到的。更多地,还有非常好的API来处理子进程如果你需要其他shell脚本处理(当JavaScript处理不了的时候)。
-
-我们上面例子的源码是在 [available on Bitbucket](https://bitbucket.org/tpettersen/bitbucket-snippet) 的license下,并且已经发布到 [npm仓库](https://npmjs.org/package/bitbucket-snippet)。我这里也提一些上面没有讲到的概念,比如 `OAuth` ,这样子你就不需要每次都输入用户名跟密码。如果你想自己简单体验一下:
-
-```bash
-$ npm install -g bitbucket-snippet
-$ snippet --help
-```
-
-如果你觉得本教程有帮助,发现了bug或者有其他更酷的Node.js脚本建议,可以在Twiiter私信我。(我是 [@kannonboy](https://twitter.com/kannonboy))
diff --git a/source/_posts/2015-12-23-new-safari-9.md b/source/_posts/2015-12-23-new-safari-9.md
deleted file mode 100644
index af8a7907e5..0000000000
--- a/source/_posts/2015-12-23-new-safari-9.md
+++ /dev/null
@@ -1,795 +0,0 @@
-title: Safari 9.0的新特性
-subtitle: 苹果的 OS 在不断发展,Safari 亦越变强大性感,在最新的 9.0 版本当中,Safari 增加了不少新的特性,这里主要介绍一下和 Web 前端密切相关的。
-cover: https://img14.360buyimg.com/ling/jfs/t1/64776/36/2173/532908/5d08dd44E233bc1d0/d9d93651314a6f50.png
-categories: 体验报告
-tags:
- - Safari 9.0
- - iOS
- - OS X
-author:
- nick: 贴脸ADC
- github_name: mihanX
-date: 2015-12-23 21:42:19
----
-
-苹果的 OS 在不断发展,Safari 亦越变强大性感,在最新的 9.0 版本当中,Safari 增加了不少新的特性,这里主要介绍一下和 Web 前端密切相关的。
-
-
-
-## Viewport Changes
-
-关于新 Safari 对 Viewport 的影响我们先看下面一段引自苹果开发者官方文档的说明:
-
-> Viewport meta tags using "width = content-width" cause the page to scale down to fit content that overflows the viewport bounds. You can override this behavior by adding "shrink-to-fit = no" to your meta tag as shown below. The added value will prevent the page from scaling to fit the viewport.
-
-可以看到 Safari 将会对有内容溢出 Viewport 区域的页面进行缩放适配,使溢出的内容完整展示而不出现滚动条,而在 Viewport 设置中引入了一个新属性 `shrink-to-fit = no`,该属性可以禁止这种缩放行为的发生。
-
-下面我们具体看一下该体贴行为对页面的影响。
-
-在 Safari 9.0 之前的版本,当 viewport meta 标签的 content 属性有设置的时候,**如果页面内容溢出 viewport 的定义区域**,那么页面将会出现滚动条,如下面的页面,该页面的 viewport 设置为:
-
-```
-
-```
-
-[NotFixed](http://missoy.me/mihan/h5/shop/index_nofit.html)
-
-截图如下:
-
-
-
-然而在 Safari 9.0 的版本,即使 viewport 设置了 `initial-scale=1.0` 和 `user-scalable=no`,Safari 不仅重置了设定好的最小缩放值限制,而且还重新恢复了用户对页面进行缩放的操作权限,[上述页面](http://missoy.me/mihan/h5/shop/index_nofit.html)在 Safari 9.0 中的截图如下:
-
-
-
-从上面的截图可以看到,Safari的缩放行为对页面视觉破坏性还是比较厉害的,如果溢出的内容很多的话,页面就会被缩得更小了。
-
-在 viewport 设置添加 `shrink-to-fit = no` 这个属性后,设置如下:
-
-```
-
-```
-
-Safari 就不会再对页面进行缩放处理,恢复之前版本的处理方式,
-
-[Fixed](http://missoy.me/mihan/h5/shop/index_fit.html)
-
-截图如下:
-
-
-
-在日常的需求中,尽管内容溢出页面的情况不会太常见,但为了增强页面的容错能力,保证页面视觉的正常显示,在 viewport 设置中应该加上 `shrink-to-fit = no` 新属性。
-
-## Safari内容拦截扩展
-
-Safari 9.0 新增了内容拦截扩展,该扩展程序能够便捷高效地拦截 cookies、图片、资源文件、弹窗等内容,不仅可以在 OS X 上使用,在 iOS 上也同样适用。
-
-### iOS
-
-内容拦截扩展程序负责提供一个 JSON 文件给 Safari,这个 JSON 文件包含了一个数组,数组里面可以配置相关规则(主要由 triggers 和 actions 组成 )拦截指定的内容,Safari 会将该 JSON 文件转换成字节代码,转换后的字节代码被应用到所有加载资源,有效地避免了用户浏览器的信息泄露到扩展程序。
-
-内容拦截扩展程序的核心就是通过 JSON 文件的配置和传送,Safari 接收到之后就可以根据 JSON 的配置对相应的加载资源进行适配完成拦截。
-
-Xcode内设有内容拦截应用模版(Content Blocker App Extension template),里面有一个 `blockerList.json` JSON 文件,默认设置是这样的:
-
-```
-[
- {
- "action": {
- "type": "block"
- },
- "trigger": {
- "url-filter": "webkit.org/images/icon-gold.png"
- }
- }
-]
-```
-表示对站点 webkit.org 的一张名为 icon-gold.png 的图片进行拦截。
-
-除了可以从加载资源上拦截外,还可以通过 CSS 选择器对元素进行隐藏,如下面的配置会将站点所有 class 名为 "ads" 的 div 进行 `display: none !important;` 样式处理。
-
-```
-[
- {
- "action": {
- "selector": "div.ads",
- "type": "css-display-none"
- },
- "trigger": {
- "url-filter": ".*"
- }
- }
-]
-
-```
-
-** 注意:由于 32 位架构的设备性能限制,iOS上的内容拦截扩展只适用在 64 位架构的设备上,苹果从 A7 处理器开始采用 64位架构,因此 iPhone 5s + 的机器才可能使用此扩展应用 **
-
-关于参数 action 和 trigger 的更多介绍可以参阅:
-
-
-
-[Introduction to WebKit Content Blockers](https://webkit.org/blog/3476/content-blockers-first-look/)
-
-[Safari Content Blocking in iOS 9: a tutorial by example](https://www.hackingwithswift.com/safari-content-blocking-ios9)
-
-
-
-#### 一个简单的内容拦截扩展应用
-
-实现一个拦截扩展应用很简单,现在我们以 [拍拍小店首页](http://missoy.me/mihan/h5/shop/index.html) 为例,拦截顶部广告区域:
-
-
-
-Update Xcode 到最新版本,打开 Xcode,新建立一个 iOS Single View Application 项目(blocker-demo),如图所示:
-
-
-
-然后新建立一个 Target,在 Application Extension 模版中选中 Content Blocker Extension:
-
-
-
-完成之后,就可以在项目中看到刚才新增的 Target 文件夹(blocker),可以找到一个名为 `blockerList.json`的 JSON 文件,在里面就可以配置需要拦截内容的规则了,如图所示:
-
-
-
-(顶部广告区域的 class 名为 `mod_ad `, 例子中的配置将会将顶部广告区域隐藏。)
-
-然后以整个项目为编译对象,选择需要测试的模块器(这里选择了 iPhone6)运行程序 ,** 切记不要选中 content blocker 的 Target 为编译对象运行,在模拟器上不能生效 **。
-
-运行后我们看到白茫茫的一片,模拟器默认打开了刚才新建立的应用,这时候我们需要回到主界面(command + shift + h)进入系统设置界面, 到 Safari >Content Blockers 里面启动内容拦截扩展,如图所示:
-
-
-
-启动 Safari,打开[拍拍小店首页](http://missoy.me/mihan/h5/shop/index.html),这时候我们可以看到,启动内容拦截扩展之后,顶部的广告区域被隐藏了
-
-
-
-用 Safari 的 Web 检查器看了一下页面,发现用户样式表里针对顶部广告区域多了一个 `display: none !important;`样式
-
-
-
-最后需要将程序打包,才能在真机运行,貌似需要 688RMB 的开发者帐号,土豪们可以尽情试一试。
-
-
-
-### OS X
-
-在 OS X Safari 的扩展创建器(Extension Builder)加入拦截 JSON 文件(如下图)或者在 Safari 扩展对象中使用新增的 setContentBlocker API 就可以实现内容拦截功能了
-
-
-
-** 需要注意的是,用于拦截内容的 onbeforeload 事件和 canLoad 信息已被弃用 **
-
-
-更多有关 Safari 内容拦截扩展介绍:
-
-[Safari Content Blocking in iOS 9: a tutorial by example](https://www.hackingwithswift.com/safari-content-blocking-ios9)
-
-[iOS 9之Safari广告拦截器(Content Blocker)](http://www.cnblogs.com/CocoonJin/p/4701050.html)
-
-
-## System Font Support
-
-### -apple-system
-
-苹果操作系统会从两种不同外观和大小的字体进行自动转换去调节系统新字体 “San Francisco”,可以通过 CSS 规则
-
- font-family: -apple-system, sans-serif;
-
-让系统智能选择适配操作系统的字体。
-
-可以看一下下面两张在系统 OS X 10.11.1 下的对比图:
-
-没有添加 `-apple-system` 属性值:
-
-
-
-添加了 `-apple-system` 属性值:
-
-
-
-可以看到添加了 `-apple-system`,字体变得更圆润锐利
-
-**建议:在 `font-family` 属性加上 `-apple-system` 属性值。**
-
-图片看不出差别的同学请用 OS X Safari 9.0 打开以下链接:
-
-
-
-[System Font Support](http://missoy.me/mihan/demo/sys-font.html)
-
-
-
-更多关于 System Font Support 介绍 :[Using the System Font in Web Content](https://webkit.org/blog/3709/using-the-system-font-in-web-content/)
-
-附:[《在吐槽iOS 9的新字体之前,你应该了解这些》](http://www.jiemian.com/article/392197.html)
-
-
-### iOS text-style keywords
-
-Safari 9.0除了支持 `-apple-system` 新字体特性之外,在 iOS 平台提供了更丰富更具活力的文本样式,该文本样式不仅仅是特定的字体,包括所有的 `font` 样式,如字重和字号,因此只能以 `font` 来定义:
-
-* font: -apple-system-body;
-* font: -apple-system-headline;
-* font: -apple-system-subheadline;
-* font: -apple-system-caption1;
-* font: -apple-system-caption2;
-* font: -apple-system-footnote;
-* font: -apple-system-short-body;
-* font: -apple-system-short-headline;
-* font: -apple-system-short-subheadline;
-* font: -apple-system-short-caption1;
-* font: -apple-system-short-footnote;
-* font: -apple-system-tall-body;
-
-加上这些属性在 iOS 上会有不同的表现:
-
-
-
-有兴趣的同事去 [Demo](http://missoy.me/mihan/demo/sys-font.html) 页看一下:
-
-
-
-## CSS Scroll Snapping
-
-2015年3月26日,W3C的CSS工作组发布了CSS滚动界限点模块(CSS Scroll Snap Points Level 1)的首份工作草案(First Public Working Draft)。在浏览可以连续上下滚动或左右滚动的连续页面或一组图片时,通过触摸屏的触摸滑动或鼠标滚轴的滚动操作可以获得较好用户体验。
-
-Safari 9.0 的新特性支持强大的 CSS Scroll Snap,利用这个特性,我们可以用CSS轻松实现网站常见的轮播图滚动特效
-
-我们先看一下 [Demo](http://missoy.me/mihan/demo/scroll-snap.html) 感受一下 ,请用 Safari 9.0 打开
-
-
-
-使用 Scroll Snap 需要的结构包含装载滚动元素的容器和需要滚动的元素:
-
-
-
-Scroll Snap 一共有5个CSS属性可使用,分别是
-
-* scroll-snap-type:定义滚动界限的类型,有三个属性值可选, `none` | `mandatory` | `proximity`,初始值为 `none`,**目前 WebKit 只支持 `mandatory`**。
-
-* scroll-snap-points-x:定义滚动容器 X 轴方向的 scroll sanp 点,有两个属性值可选,`none`| `repeat()`,初始值为 `none`
-
-* scroll-snap-points-y:定义滚动容器 Y 轴方向的 scroll sanp 点,有两个属性值可选,`none` | `repeat()`,初始值为 `none`
-
-* scroll-snap-destination:定义滚动元素在滚动容器的对齐坐标点,属性值为 ``,初始值为:`0px 0px`
-
-* scroll-snap-coordinate:定义滚动元素与滚动容器对齐点重合的坐标点,属性值为 `none` | ``,初始值为 `none`
-
-属性 *scroll-snap-type* 、*scroll-snap-points-x*、*scroll-snap-points-y* 和 *scroll-snap-destination* 应用在容器元素
-
-属性 *scroll-snap-coordinate* 应用在滚动元素
-
-滚动容器 scroll snap 坐标点 和 滚动元素 scroll snap 坐标点分别如下图红色十字和黄色十字所示:
-
-
-
-此时的设置是:
-
-```
-.scroll_container{
- -webkit-scroll-snap-type: mandatory;
- -webkit-scroll-snap-destination: 50% 50%;
-}
-
-.scroll_elements{
- -webkit-scroll-snap-coordinate: 50% 50%;
-}
-```
-
-属性详细使用情况请参阅 [CSS Scroll Snap Points Module Level 1](http://www.w3.org/TR/css-snappoints-1/)
-
-### 需要注意的
-
-
-* 该草案还在不断修进改进,WebKit 目前只支持带 -webkit- 前辍的写法
-
-* 要启用 scroll snap 效果,滚动容器必须具有非 `none` 值的属性 `scroll-snap-type`
-
-* 滚动容器 `scroll-snap-points-x` 和 `scroll-snap-points-y` 的属性设置会忽略滚动元素 `scroll-snap-coordinate` 属性设置
-
-* 滚动容器 `scroll-snap-destination` 属性与滚动元素 `scroll-snap-coordinate` 总是成对出现的
-
-* 滚动内容发生改变(如滚动容器大小、滚动元素大小、节点的改变等)使得滚动元素的 scroll snap 点不在滚动容器的 scroll snap 点的时候,滚动偏移值会发生改变。
-
-* 不同尺寸的滚动元素混合在一起发生滚动的时候,在 X 或 Y 轴方向上离滚动容器 scroll snap 点最近的滚动元素 scroll snap 点方向轴将会与滚动容器 scroll snap 点的方向轴重合(存在滚动区域的时候)。
-
-更多关于 scroll-snap 属性 Demo 可查看 [Scroll Snapping with CSS Snap Points](https://www.webkit.org/blog/4017/scroll-snapping-with-css-snap-points/)
-
-
-## Initial Letter Support
-
-Safari 9.0 支持 CSS `initial-letter`(要带 -webkit- 前辍) 属性了,以前我们通过伪元素 `::first-letter `实现首字下沉的效果,但是局限性比较多:
-
-* 首字母的高度需要通过调整字号大小实现,比较难精确到需要设置的高度
-
-* 段落字号改变的时候,首字母字号并不能自适应改变,因此并不能自适应实现对齐
-
-
-
-CSS `initial-letter` 属性能很好的解决这些问题,我们先看一下它的属性值:
-
-* normal -- 初始值
-
-* [<number> <integer>] -- 定义首字母的大小和下沉位置
-
- - <number> 首字母的大小,大小值为正数值,字高占据的行数为单位,如 “2” 表示首字母高大小占据段落两行
-
- - <integer> 首字母下沉的位置,大小值为不为0的整数,若缺省,则以第一个参数 <number>数值为准
-
-`initial-letter`属性应用在伪元素 `::first-letter ` 或容器第一个行内子元素
-
-[w3文档介绍](http://dev.w3.org/csswg/css-inline/#initial-letter-styling)的 EXAMPLE 截图引用如下:
-
-> 
-
-实验 [Demo](http://missoy.me/mihan/demo/initial-letter.html) 如下:
-
-
-
-## Backdrop Filters
-
-CSS背景滤镜属性 `backdrop-filter` 可以让元素的背景或元素层级以下的元素加上滤镜效果,以下的属性值在 Safari 9.0 得到了全面支持:
-
-* `blur()`:模糊,原始效果值为 `0px`,不接受负值
-
-* `brightness([ | ])`:亮度,原始效果值为 `1` 或 `100%`,不接受负值
-
-* `contrast([ | ])`:对比度,原始效果值为 `1` 或 `100%`,不接受负值
-
-* `drop-shadow( {2,3} ?)`:投影,原始效果值为所有长度值为 `0`,长度值至少2个,最多3个,**注意:不支持投影扩展值和混合投影**
-
-* `grayscale([ | ] )`:灰度,原始效果值为 `0`,最大值为 `1` 或 `100%`,不接受负值
-
-* `hue-rotate( )`:相位,原始效果值为 `0deg`
-
-* `invert( [ | ])`:反相,原始效果值为 `0`,最大值为 `1` 或 `100%`,不接受负值
-
-* `opacity([ | ] )`:透明度,原始效果值为 `1`,最大值为 `1` 或 `100%`,不接受负值
-
-* `saturate([ | ])`:饱和度,原始效果值为 `1`,不接受负值
-
-* `sepia([ | ])`:乌贼墨,原始效果值为 `0`,最大值为 `1` 或 `100%`,不接受负值
-
-滤镜属性 `filter` 同样具有以上的属性值,与背景滤镜`backdrop-filter` 不同的是,`filter` 作用于元素本身(文本、背景等)以其子元素,而 `backdrop-filter` 只作用于元素本身的背景(文本及其子元素不受影响)以及其层级下面的其它元素,具体的测试参考下面的 [Demo](http://missoy.me/mihan/demo/filter.html)
-
-
-
-
-
-更多关于 `backdrop-filter`
-
-WebKit.org:[Introducing Backdrop Filters](https://webkit.org/blog/3632/introducing-backdrop-filters/)
-
-w3c文档:[typedef-filter-function-list](https://drafts.fxtf.org/filters/#typedef-filter-function-list)
-
-
-## CSS3 Feature Queries
-
-Safari 9.0 支持了 CSS3 功能查询 `@supports`,可以对 CSS 属性(包括但不限于带前辍的属性,如 -webkit-,-moz- 等)进行检测
-
-### 单个条件查询
-
-```
-/* 检测是否支持 display:flexbox,如果支持侧执行中括号的内容 */
-@supports ( display: flexbox ) {
- .selector{
- ...
- }
-}
-```
-
-### 多个单件查询
-
-可以使用逻辑关键字 `not`、`and`、`or` 进行多个单件查询
-
-```
-@supports ( box-shadow: 2px 2px 2px black ) or
- ( -moz-box-shadow: 2px 2px 2px black ) or
- ( -webkit-box-shadow: 2px 2px 2px black ) or
- ( -o-box-shadow: 2px 2px 2px black ) {
- .selector{
- ...
- }
-}
-```
-
-### 需要注意的地方
-
-* `@supports` 后面总是跟着一个空格符和一个括号,`逻辑关键字`前后总有一个空格符。因此,写查询条件的时候
-
- ```
- /* 错误的写法 */
- @supports display: flexbox {
- // ...
- }
-
- @supports(display: flexbox){
- // ...
- }
-
- @supports (display: flexbox)and(-webkit-scroll-snap-type:mandatory) {
- // ...
- }
-
- /* 正确的写法 */
- @supports (display: flexbox) {
- //...
- }
- @supports (display: flexbox) and (-webkit-scroll-snap-type:mandatory) {
- // ...
- }
- ```
-* 多个单件查询,当有多个逻辑关键字混合使用的时候,查询语句最外层最多只有一个逻辑关键字:
-
- ```
- /* 错误的写法 */
- @supports (A) or (B) and (C) {
- //...
- }
-
- /* 正确的写法 */
- @supports (A) or ((B) and (C)) {
- //...
- }
- @supports ((A) or (B)) and (C) {
- //...
- }
- ```
-`@supports` 更详细说明可参考:[at-supports](http://www.w3.org/TR/css3-conditional/#at-supports)。
-
-[Demo测试](http://missoy.me/mihan/demo/@supports.html)
-
-
-## CSS4 Selectors
-
-以下 CSS4 选择器在 Safari 9.0 完全支持了:
-
-* 属性选择器忽略大小写标识(Case-insensitive attribute selectors)
-* `:any-link`
-* `:lang`
-* `:matches`
-* `:not`
-* `:nth-child`
-* `:placeholder-shown`
-
-
-### Case-insensitive
-
-一般情况下,选择符中属性名和值的大小写敏感性取决于文档语言的敏感性,为了使其匹配忽略大小写敏感性以及其文档语言的敏感性,可以在属性选择器的关闭符`]`前加上标识符 `i`,这样不管在什么文档,都能忽略大小写敏感性,如以下例子:
-
-结构:
-
- Box
-
-样式:
-
-```
-/* .box初始背景色为白色 */
-.box{
- width: 100px;
- height: 100px;
- margin: 10px;
- color: #fff;
- text-align: center;
- line-height: 100px;
- word-break: break-all;
- word-wrap: break-word;
- background: #fff;
-}
-
-/* 属性值大小写敏感,完全匹配,.box背景变黑色 */
-.box[title="BOX"]{
- background: #000;
-}
-
-/* 用了 CSS4 的 Case-insensitive 属性选择器,若浏览器支持,大小写不再敏感,能完成匹配,.box背景生效变为灰色 */
-.box[title="box" i]{
- background: #ccc;
-}
-```
-
-关于 Case-insensitive 更详细介绍:[w3介绍文档 - Case-insensitive](http://www.w3.org/TR/selectors4/#attribute-case)
-
-测试 [Demo](http://missoy.me/mihan/demo/css4_selector.html)
-
-
-
-### 伪类 :any-link
-
-w3文档介绍大概的描述是这样的:
-
-> 如果元素有定义伪类 `:link `或 `:visited` ,`:any-link `将会对其进行匹配。
-
-于是写了 Demo 验证了一下
-
-HTML:
-
- 凹凸Team链接
-
-CSS:
-
-```
-.lk{
- display: block;
- width: 100px;
- height: 30px;
- line-height: 30px;
- text-align: center;
-}
-
-/* 黑色背景 */
-.lk:link{
- background: #000;
- color: #fff;
-}
-
-/* 黄色背景 */
-.lk:visited{
- background: #ff0;
- color: #333;
-}
-
-/* 红色背景 */
-.lk:any-link{
- background: #ff3737;
- color: #fff;
-}
-
-/* 白色背景 */
-.lk:hover{
- background: #fff;
- color: #333;
-}
-
-/* 灰色背景 */
-.lk:active{
- background: #ccc;
- color: #333;
-}
-```
-
-结果发现:
-
-* `:any-link` Safari 9.0 生效了,Chrome、Firefox 并没有生效。
-
-* 伪类 `:any-link` 的确会对已定义有的伪类`:link` 和 `:visited`匹配,并重新覆盖元素相同的CSS属性, 而 `:hover` 和 `:active` 并没有匹配成功,`:hover` 和 `:active` 依然生效
-
-* CSS代码解析的时候渲染 `:any-link` 前就渲染了 `:link` 和 `:visited`,因此匹配成功了,而 `:hover` 和 `:active` 出现在 `:any-link` 后面,并不能匹配成功
-
-若加上 `-webkit-` 前辍,Chrome 亦能生效。
-
-如果将 `:any-link` 出现位置改变,`:any-link` 始终匹配出现在他之前的 Link 相关伪类,有兴趣的同学可以试一下。
-
-小小总结了一下:
-
-* `:any-link` Safari 9.0 不需要加前辍,Chrome、Firefox 浏览器需要加 `-webkit-`、`-moz-` 前辍。
-
-* `:any-link` 匹配有效性和书写顺序有关,`:any-link` 只对出现在其之前的 Link 伪类匹配生效。
-
-#### 建议
-
-**写 a 标签样式的时候,在 `:hover` 和 `:active` 前应该加上 `:any-link` 伪类样式,覆盖系统默认的 `:link` 和 `:visited`伪类样式。如下所示:**
-
-```
-a{
- ...
-}
-
-a:-webkit-any-link{
- ...
-}
-
-a:-moz-any-link{
- ...
-}
-
-a:any-link{
- ...
-}
-
-a:hover{
- ...
-}
-
-a:active{
- ...
-}
-```
-
-关于 `:any-link` 更详细介绍: [w3介绍文档 - :any-link](http://www.w3.org/TR/selectors4/#the-any-link-pseudo)
-
-实验 [Demo](http://missoy.me/mihan/demo/css4_selector.html)
-
-
-
-### 伪类 :matches()
-
-`:matches()` 是一种类似函数的伪类,可以将不同的选择器以数组形式混合形成一个选择器组,我们可以将之看作是CSS的一种语法糖,请看下面的例子:
-
- :matches(section, article, aside, nav) h1 {
- color: #BADA55;
- }
-
- /* 相当于下面的代码 */
- section h1,
- article h1,
- aside h1,
- nav h1 {
- color: #BADA55;
- }
-
-更方便书写一些复杂的选择器,如:
-
- :matches(section, article, aside, nav) :matches(h1, h2, h3, h4, h5, h6) {
- color: #BADA55;
- }
-
- /* 相当于下面的代码 */
- section h1, section h2, section h3, section h4, section h5, section h6,
- article h1, article h2, article h3, article h4, article h5, article h6,
- aside h1, aside h2, aside h3, aside h4, aside h5, aside h6,
- nav h1, nav h2, nav h3, nav h4, nav h5, nav h6 {
- color: #BADA55;
- }
-
-减少重复的书写:
-
- .links:matches(:hover, :focus, :active) {
- color: #BADA55;
- }
-
- /* 相当于下面的代码 */
- .links:hover, .links:focus, .links:active {
- color: #BADA55;
- }
-
-**注意:`:matches()`不能嵌套而且不能与 `:not()` 一起使用**,以下的写法都是不允许的:
-
- /* Doesn't work */
- :matches(:not(...))
-
- /* Doesn't work */
- :not(:matches(...))
-
- /* Doesn't work */
- :matches(:matches(...))
-
-更多关于 `:matches()` 可参考
-
-CSS-tricks :[:matches()](https://css-tricks.com/almanac/selectors/m/matches/)
-
-W3文档:[matches](http://www.w3.org/TR/selectors4/#matches)
-
-### 伪类 :placeholder-shown
-
-如果元素 E 设置了属性 `placeholder`,属性值不为空并出现在页面的时候,那么`E:placeholder-shown` 就能匹配到该元素,当 `placeholder` 文本在页面消失的时候,匹配到的相应样式也会消失,如以下 [Demo](http://missoy.me/mihan/demo/css4_selector.html) 所示:
-
-
-
-### 伪类 :nth-child,:not,:lang
-
-详细用法有兴趣的同学可以到 w3文档 查阅:
-
-[:lang - #the-lang-pseudo](http://www.w3.org/TR/selectors4/#the-lang-pseudo)
-
-[:not - #negation](http://www.w3.org/TR/selectors4/#negation)
-
-[:nth-child - #the-nth-child-pseudo](http://www.w3.org/TR/selectors4/#the-nth-child-pseudo)
-
-
-
-
-
-## Unprefixed CSS Properties
-
-以下CSS属性在 Safari 9.0 已完全支持,不用再带 `-webkit-` 前辍:
-
-* transition
-* transition-delay
-* transition-duration
-* transition-property
-* transition-timing-function
-* animation
-* cursor: zoom-in
-* cursor: zoom-out
-* perspective
-* perspective-origin
-* transform
-* transform-origin
-* transform-style
-* @keyframes
-* animation-name
-* animation-duration
-* animation-timing-function
-* animation-iteration-count
-* animation-direction
-* animation-play-state
-* animation-delay
-* animation-fill-mode
-* order
-* align-content
-* align-items
-* align-self
-* justify-content
-* flex
-* flex-basis
-* flex-direction
-* flex-flow
-* flex-grow
-* flex-shrink
-* flex-wrap
-* break-after
-* break-before
-* break-inside
-* columns
-* column-count
-* column-fill
-* column-gap
-* column-rule
-* column-rule-color
-* column-rule-style
-* column-rule-width
-* column-span
-* column-width
-* alt
-
-## Responsive Design Mode
-
-Safari 9.0 推出了响应式设计模式,command + option + R 或在“开发 -- 进入响应式设计模式”可以进入,界面如下图:
-
-
-
-这里有:
-
-* 现主流 iPhone/iPad 机型尺寸
-* iOS8.1系统模拟(iphone、ipad、ipod touch)
-* 苹果系主流分辨率
-* Safari 9.0.1 Mac
-* Chrome -- Mac/Windows
-* FireFox -- Mac/Windows
-* IE7 - IE10 --Windows( 好样的!)
-* 页面精度
-
-点击选中的机型图标还可以以不同的方式展示,如 iPhone 的横屏,iPad 的分屏等
-
-响应式设计模式 Chrome 浏览器早早就有,但单从苹果产品的调试去看,个人更喜欢 Safari 的响应式设计模式,无论从外观、体验以及专注度,都要优于 Chrome,Safari一直在进步,从不怀疑 Apple Developer 的级数。
-
-
-
-
-## Web Inspector Redesign
-
-之前所了解到的 Web Inspector 版本:
-
-
-
-(从苹果开发者文档介绍了解到的,没使用过,目测是 Safari 4.0 or 之前的)
-
-
-
-(直接 google 图片了解到的,没使用过,目测是 Safari 6.0 重新设计那款)
-
-Safari 9.0 的 Web 检查器经过了重新设计,更直观易用,用户体验更棒。
-
-开发任务 Tab 切换更简易快捷,新的渲染时间线框架更容易更细致检测到页面渲染的情况
-
-
-
-元素查看,样式修改调试方便,直接点光标直接处于编辑状态了,不明白 Chrome 的为什么点了默认全选,编辑态还有一个输入框的形态,Apple 的极简设计理念无处不在,处处体现着苹果 Design 的基因
-
-
-
-断点调试器也哗啦啦地好看易用:
-
-
-
-更多的内容有兴趣的同学去体验一下吧,这里就不一一烧图了。
-
-如果说 Chrome Web Inspector 是一名角斗士,那么 Safari Web Inspector 就是一名会写诗的角斗士
diff --git a/source/_posts/2015-12-29-ae.md b/source/_posts/2015-12-29-ae.md
deleted file mode 100644
index 503cc3361c..0000000000
--- a/source/_posts/2015-12-29-ae.md
+++ /dev/null
@@ -1,137 +0,0 @@
-title: 初识Adobe After Effects效果制作
-subtitle: "Adobe After Effects简称“AE”是Adobe公司推出的一款图形视频处理软件,用于高端视频特效系统的专业特效合成。"
-cover: https://img20.360buyimg.com/ling/jfs/t1/50610/33/2767/950806/5d09d46bEc4a39715/c44fb8ed20918cfa.png
-categories: Web开发
-tags:
- - Adobe After Effects
- - AE
- - AE movie
-author:
- nick: 高大师
- github_name: pfan123
-date: 2015-12-29 22:05:18
----
-
-Adobe After Effects简称“AE”是Adobe公司推出的一款图形视频处理软件,用于高端视频特效系统的专业特效合成。随着h5页面动效的越来越复杂以及h5效果视频化趋势,AE这款软件也渐渐成为了我们制作绚丽动效的必备神器。
-
-
-### 那我们通过尝试制做简单手机天气动效,来了解AE的特效吧
-
-
-### 制作程序流程
-> 1.工具:`After Effects` 、`Photoshop`
-> 2.设计流程:`After Effects` 在一个合成中创建转场效果,另外一个合成中创建展示效果,导出到PS。
-> 3.进行帧处理,优化导出`GIF`
-
-### 接下来,我们开始一步一步开始吧
-### 素材
-#### 1.伦敦背景图
-
-#### 2.手机透视效果模板
-
-
-### 基本构建
-
-#### 创建背景转场效果合成
-#### 步骤1
- 打开AE,合成>新建合成(Cmd+N),尺寸为`518*715`,帧数`29`,持续`6s`
-
-
-
-
-#### 步骤2
- 导入伦敦背景图像,将图像丢入合成1,调整背景图像尺寸,使其适合画布
-
-
-#### 步骤3
- 创建3个蓝色框(用形状图层),这些蓝色框将从屏幕上方下落到屏幕底部,宽度`172`、`174`、`172px`(在AE中,尺寸特别不好确定,我们可以COM+R打开标尺去匹配),色值`#063857`、`#145071`、`#416C8D`。三个方框上方的方框宽度640px,输入相应文本。
-
-
-#### 步骤4
- 用钢笔勾勒出简单云朵和6片雪花空心圆(或者去找素材,这里的云朵,就是找的png图片)
-
-
-#### 创建手机展示效果合成
-#### 步骤1
- 创建合成2,尺寸`1280 x 720`帧数`29`,时间`6s`
-#### 步骤2
- 导入iPhone背景,调整尺寸,增加背景层扩展。
-
-#### 步骤3
- 把合成1拖到合成2里面,选中合成1,在效果面板,选择效果>扭曲>边角定位,让合成1的4个角对上模板中屏幕的4个角,变成如下形式。
-
-
-
-以上基本的合成构建都已经做完了,那接下来,我们开始实现动效
-### 动效制作
-#### 动效制作预想
-- 3个蓝色方框变长,不同时的落下,然后回弹缩小。
-- 透明框从底部往上移动,自始至终宽度不变。
-- 4个框抵达目的地后,文字开始出现,蓝色框文字是比例扩大+从不透明变透明,透明框中得文字是从不透明变透明。
-- 云朵图标,同时伴随雪花。
-- Snowy文字出现。
-
-### 动效实现
- 在实现动效之前,我们先说说,AE里面如何实现动效,两种方案,一种是效果菜单下的效果动效,另一种就是AE对图层的变换处理包含:锚点、位置、缩放、旋转、不透明度,通过改变激活这几个按钮,改变图层的参数形成关键帧,从而形成动画。
-
-
-#### 三个蓝色框特效
- 打开背景合成,选中三个色块
-
-备注
- 1.这里应用了位置和缩放,来实现动效。
- 2.位置上,三个蓝色的框,通过缩放`scale 0-100%`,从上到下,不同延迟。
-
-#### 透明框
- 透明框的运动,从下到上缓慢的位移。
-
-#### 底部文字
- 1.三个蓝色框,当蓝色框触及到底部时,文字快速弹出,不透明度从`0`->`100%`,比例从`0`->`100%`
- 2.透明框中的文字随透明框一起运动(位置设置可以参考透明框),但是,左侧的文字先到,右侧的-4度后到,注意时间轴中得设置。
-
-#### 云朵
- 透明框的文本开始出现时,云朵出现,先是透明度从0-100%;而比例开始时是60%,当透明度到了`100%`时,从`60%`->`100%`
-
-#### 雪花小圆点
- 当云朵动效完成后,雪花小圆点开始逐个出现。
- 1.注意小圆点会错落的向右移动,然后弹回,注意运动顺序的调节
- 2.注意小圆点逐个出现,因此透明度的变化要在时间轴上依次设置。
-
-
-#### Snowy文字效果
- 这里运用了蒙版运动,来打造Snowy文本逐渐出现的效果,注意Snowy不透明度也要变化(蒙版,通过图层点击右键添加蒙层,然后在蒙层中选择alpha蒙层)
-
-
-#### 切换到合成手机导出效果
- AE文件可以导出多种形式文件,主菜单合成渲染(主要合成导出序列帧相关)和导出菜单(文件->创建->创建代理)就可以设置需要的格式,常见的格式有:
-> 3GP MP4 MP3 MOV GIF SWF PNG序列帧图片
-
-
-
- 这里呢,我做完动效后,是导出`.mov`文件,然后把`.mov`文件导入到`ps`,`COM+OPTION+SHIFT+S`导出`gif`文件,效果如下(记得要选择循环播放额,不然只会播放一次)。
-
-
-到此,这个小例子我们就实现了,效果就是初始的`GIF`效果图,源文件`下载` [weather](http://doc.pfan123.com/public/weather.zip)
-
-
-最后,对比一下H5中`AE`视频动画、`GIF`动画、`Canvas`动画之间的差异
-
-## 三者对比
-这里将本例,分别用了3种形式做`H5`动画,[`AE`动画效果](http://jdc.jd.com/fd/promote/201512/ae/video.html)(AE效果可能要注意一下,由于没有找到比较好的视频压缩工具,初始动画有点卡,循环播放是很流畅的)、[`Canvas`动画效果](http://jdc.jd.com/fd/promote/201512/ae/canvas.html)、[`GIF`动画效果](http://jdc.jd.com/fd/promote/201512/ae/index.html),看看三者之间的差异,二维码如下:
-
-##### 备注:请在wifi的环境下体验,由于动画帧数比较多173帧,体验可能比较慢,请耐心等待
-
-- `AE动画效果`,动效整体还原度比较好,支持流媒体加载,但是`Android`与`IOS`展现形式不一样;`IOS`支持格式比`Android`多,如`.mov格式`;`IOS`可以隐藏播放器控制条,`Android`无法解决;初始效果与文件大小影响比较大。
-
-- `Canvas动画效果`,动画还原度无法达到`GIF`、`AE`的效果,复合动画帧比较多,图片比较大,对做雪碧图影响较大,做出的动画会出现闪烁低端`Android`出现明显卡顿。
-
-- `GIF动画效果`,帧比较多,在部分低端`Android`表现卡顿,`GIF`格式图片,无法很好压缩。
-
-
-
-## 小结
- AE制做动画特效的神器,还有很多很多好玩的特效等待我们去学习思考,以及结合到平时的工作中。在移动端h5开发中,经常会遇到比较复杂的交互特效帧比较多,可能很多时候大家会选择`GIF`,帧动画,`Canvas`动画来实现效果,可是往往做出来的动画展示效果,无法达到预想的效果,或多或少的导致设备卡顿,加载过慢等现象。在我们了解了这些之后,可以通过`AE`换一种尝试,做更有趣的动画效果。
-
-#### 学习资料:
-[videocopilot](http://www.videocopilot.net/)
-[newcger](http://www.newcger.com/)
diff --git a/source/_posts/2016-01-02-3D-panorama.md b/source/_posts/2016-01-02-3D-panorama.md
deleted file mode 100644
index 9daeca6632..0000000000
--- a/source/_posts/2016-01-02-3D-panorama.md
+++ /dev/null
@@ -1,142 +0,0 @@
-title: 使用ThreeJS在浏览器中展示全景图
-subtitle:
-cover: https://img11.360buyimg.com/ling/jfs/t1/56003/20/2801/105288/5d09d5a7E933ccc52/54108a15271fc569.png
-date: 2016-01-02 20:06:45
-categories: Web开发
-tags:
- - three.js
- - panorama
-author:
- nick: Littly
- github_name: Littly
----
-在浏览器中实现全景浏览, 听起来是很玄的事情. 但如果你清楚它的原理, 这事就简单多了.
-
-
-## 前言
-在之前的一段时间, 朋友圈中出现了一批使用全景图浏览技术的H5页面. 比如探班吴亦凡系列, 或者是探访京东总部大楼找优惠券页面. 在当时, 这几个页面取得了不错的宣传效果. 那么, 这种新奇的全景效果到底是怎样实现的呢?
-
-## 基础
-现在的智能手机一般都自带全景图拍摄功能. 就算没有, 通过安装一些第三方软件也可以拥有这个功能, 但通过这些软件拍出来的只是一个非常宽的照片, 还无法达到360随意转动观看的效果. 要制作像上面那样的360全景观看页面, 我们需要从最基础的开始. 首先, 什么是全景图?
-
->360度全景图也称为三维全景图、全景环视图。360度全景技术是一种运用数码相机对现有场景进行多角度环视拍摄之后,再利用计算机进行后期缝合,并加载播放程序来完成的一种三维虚拟展示技术。 -- [360度全景图_百度百科](http://baike.baidu.com/link?url=qsNK14ZSsECIkmQN6asaJDDNmCjS2cYwqldh_I4GRzuqb5CH7lrZ9ic34mQuJE7WtaiWaz7OXxwXQDZQ0kqNHK)
-
-也就是说, 我们可以使用拍到的全景图, **使用计算机进行后期缝合**, 并加载播放程序来完成三维显示. 具体到使用ThreeJS实现全景图这个场景, 我们需要做什么呢?
-
-其实, 粗略一想也可以想到, 如果我们将拍摄到的全景图贴在一个圆柱的侧面上, 我们站在圆柱中心朝四周看的话, 应该就有全景观察的效果. 不过这样做也有坏处, 也就是我们的头顶跟脚底都是无法看到的区域. 我们需要使用其他的方式来实现. 在这之前, 我们需要了解一下ThreeJS中的相机.
-
-## ThreeJS世界中的相机
-在ThreeJS中, 相机还分为CubeCamera(立方体相机), PerspectiveCamera(透视相机)以及OrthographicCamera(正交相机). 其中, CubeCamera是创建动态贴图用的, OrthographicCamera创建的照相机不具有透视效果. 在这里, 我们用到的是PerspectiveCamera.
-
-定义一个透视相机只需要一句话:
-
-```javascript
-var camera = new THREE.PerspectiveCamera(
- fov,
- aspect,
- near,
- far
-);
-```
-
-在这一段代码中, fov代表相机的视角, 即视野上平面与下平面的角度, aspect是相机的宽高比, near是视野近平面的距离, far是远平面的距离.
-然而, 在3D的世界中, 仅凭上面这几个参数, 我们只能确定一个照相机的自身基本属性, 却无法确定这台照相机究竟位于什么位置, 是什么样的角度. ThreeJS中, camera.position属性是一个三维向量, 我们可以用这个属性定义相机相对于原点的位置. camera.lookAt(Vector3)函数可以定义照相机的观察方向, 参数同样是一个三维向量. 对于照相机而言, 还有一个参数显得非常重要, 这就是相机的上方向. 同样的空间位置, 朝向同一个方向, 照相机还可以是横着, 也可以竖着, 最后看到的效果也不会一样. 所以camera还有一个up属性, 定义照相机的上方向. 如上图蓝色空心箭头所示.
-
-## 动手做全景展示1
-要让人产生全景的视觉效果, 很关键的一点是, 要让人看见他当前姿态所应当看见的景观. 如果将人眼比作一台照相机, 我们很容易想到, 我们如果将全景图贴在一个球形的内表面, 那么人眼这台照相机所看到的景象就是上下左右360无死角的全景.
-
-想想总是美如画的. 我们不妨实践一下. 首先, 去google搜索关键字'全景图 360', 随意下载一个全景图. 接下来, 我们需要将这个全景图贴到球形的表面. 这一步, 我们再一次用到了Blender.
-
-首先, 新建一个工程, 然后往场景中添加一个经纬球.
-
-
-我们希望使用之前下载到的全景图作为这个球体的贴图. 所以, 我们需要首先对这个球体做uv展开. 对这个球使用球面投射, 方向选择对齐到物体, 选上缩放至边界框, 接着我们看到UV展开图是这样的:
-
-
-这个UV展开图非常不规则, 就算有了全景图, 我们也没法往上贴. 这是因为上下两个顶点处汇集了所有的经线, 使得Blender也无法准确得知我们想要怎样的贴图. 这种时候, 我们需要将球体的南北两个极点删除. 这样的话, 球体的上下两个顶点就成为了两个空心的圆圈. 然而, 模型空了两个洞不太好. 接下来, 使用Extude工具推挤出新的纬圈, 酌情缩小一些.
-
-
-重新进行UV展开, 会看到这次的UV展开非常平整.
-
-
-将新的纬圈设定scale为0, 再删除重叠的节点, 南北极就可以重新汇聚到一个点了. 接下来我们把全景图贴上, 一个全景球就这样诞生了.
-
-
-我们将这个全景球通过io_three插件导出为json. 新建一个页面, 引入three.js. 核心代码大概是这样子:
-
-```javascript
-objloader = new THREE.ObjectLoader();
-objloader.load(
- 'js/360.json',
- function (obj) {
- scene = obj;
- //scene.add(new THREE.AmbientLight(0xffffff));
- //material = scene.children[0].material;
- //material.side = THREE.BackSide;
- //material.emissive = 0x000000;
- animate();
- }
-);
-```
-这里需要注意, 如果将注释部分的代码删去, 我们将会发现视野中一片黑. 这是因为Blender导出的模型默认使用的是遵守Phong光照模型的材质, 这种材质在没有配置自发光, 又没有外界光照的情况下就是一坨黑色. 所以我们还需要手动配置一下. blender导出的json是scene本身. scene是一个树状的结构, 在它的children属性中有所有的对象信息. 在这里, 我们需要配置一下贴图的方向以及自发光, 接下来就可以看到效果了.
-
-
-## 动手做全景展示2
-上面这样的实现其实也有一个弊端. 球状模型的顶点与面的数量十分逆天. 这些元素的数量越多, 耗费的浏览器资源就会越多. 那么有没有更加节能环保的方法呢?
-
-
-答案是肯定的. 既然我们的人眼可以被类比为照相机, 那么如果摆多几台照相机, 将拍到的照片无重叠地拼在一起, 一样可以获得全景视觉.
-
-这里, 我们使用6台90度视角, 纵宽比1的照相机, 从球体中心分别朝向立方体六个面的方向.
-
-
-将6个渲染图分别保存下来.
-
-
-接下来新建页面, 将这六张图片分别贴到立方体的六个面就大功告成了. 核心代码:
-```javascript
-loader = new THREE.TextureLoader();
-/*
- 虽然使用THREE.ImageUtils.loadTexture也没问题
- 不过估计是为了适应Javascript的异步式编程
- ThreeJS也逐步将一些会阻塞的api转换为异步回调的模式
- 原有的老api会被标记为deprecated
-*/
-
-gardenMaterials = [
- 'garden/px.png',
- 'garden/nx.png',
- 'garden/py.png',
- 'garden/ny.png',
- 'garden/pz.png',
- 'garden/nz.png'
-];
-
-Promise.all(gardenMaterials.map(function (val) {
- //加载图片, 新建材质, 传给下一个步骤.
- return new Promise(function (resolve, reject) {
- loader.load(val, function (texture) {
- resolve(new THREE.MeshBasicMaterial({
- map: texture,
- side: THREE.BackSide
- }));
- });
- });
-})).then(function (materials) {
- //将材质贴到正方体的6个面.
- geometry = new THREE.BoxGeometry(60, 60, 60);
- cube = new THREE.Mesh(
- geometry,
- new THREE.MeshFaceMaterial(materials)
- );
- scene.add(cube);
- animate();
-});
-```
-渲染出来的效果, 其实是完全一样的.
-
-
-## 小结
-使用这两种方法做出来的全景展示其实还会有一些小问题, 比如展示空间的底部与顶部会有聚焦在一点的现象:
-
-这种情况单靠一个全景图是无法解决的, 只能通过对底部与顶部多拍一个照片来补救. 目前, 全景展示的技术已经有许多应用, 比如谷歌地图百度地图的街景展示, 或者是上面提到的几个H5页面中也有用到. 作为一名前端工程师, 懂得其中的原理并付诸实践, 这是非常重要的.
diff --git a/source/_posts/2016-01-04-css3-animation.md b/source/_posts/2016-01-04-css3-animation.md
deleted file mode 100644
index b56528566d..0000000000
--- a/source/_posts/2016-01-04-css3-animation.md
+++ /dev/null
@@ -1,248 +0,0 @@
-title: CSS3动画实践
-subtitle: 总结CSS3动画实现的方法,并进一步提出润色与优化的方案。
-date: 2016-01-04 15:58:00
-cover: https://img14.360buyimg.com/ling/jfs/t1/45738/18/2829/20308/5d09e79aE77f0d085/a1cf43293d914e15.png
-categories: Web开发
-tags:
- - CSS3
- - animation
-author:
- nick: 燕婷
- github_name: Yettyzyt
----
-## 需求中常见的css3动画
-需求中常见的css3动画一般有**补间动画(又叫“关键帧动画”)**和**逐帧动画**两种,下面分别介绍:
-1. 补间动画/关键帧动画:
- 常用于实现位移、颜色(透明度)、大小、旋转、倾斜等变化。一般有`Transitions`和`Keyframes animation`两种方法实现补间动画。
- **Transitions:**用于实现简单的动画,只有起始两帧过渡。多用于页面的交互操作,使交互效果更生动活泼。
-> CSS的`transition`允许CSS的属性值在一定的时间区间内平滑地过渡。
-> 这种效果可以在鼠标单击、获得焦点、被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值。
-
- **Keyframes animation:**用于实现较为复杂的动画,一般关键帧较多。
-> 设置动画的关键帧规则。
-> `animation`的`timing-function`设置为`ease`、`linear`或`cubic-bezier`,它会在每个关键帧之间插入补间动画,产生具有连贯性的动画。
-2. 逐帧动画:
- > animation的`timing-function`默认值为`ease`,它会在每个关键帧之间插入补间动画,所以动画效果是连贯性的。
- > 除了`ease`、`linear`、`cubic-bezier`之类的过渡函数都会为其插入补间。
- > 有些效果不需要补间,只需要关键帧之间的跳跃,这时应该使用`steps`过渡方式。
-
- 更多详细用法请查看:[《深入理解CSS3 Animation 帧动画》](http://www.cnblogs.com/aaronjs/p/4642015.html)。
- 逐帧动画可用于**loading动画**,但更多的用于**Sprite精灵动画(人物运动)**。精灵动画把所有帧都放在一起,通过CSS3的`animation`控制`background-position`。
-
- 下面看一个精灵动画的例子:
- 
- (案例:拍拍无聊者联盟宣传页)
-
- steps的参数有几个坑,需要特别留意:
- 第一个参数`number`为指定的间隔数,指的是把**两个关键帧之间的动画分为n步阶段性展示**,而不是`keyframes`写的变化次数。
- 我们将上述案例中hand部分作为例子:由雪碧图可知,手部的摆动一种有两种状态,故`keyframes`需要写两帧:
- ```css
- @-webkit-keyframes wave{
- 0%{background-position:0 0;}
- 50%{background-position:100% 0;}
- }
- ```
- 设置不同的number值:
- ```css
- /*将`number`设置为2*/
- .active.share3 .hand{
- -webkit-animation: wave steps(2,end) 2s forwards infinite;
- }
- ```
- ```css
- /*将`number`设置为1*/
- .active.share3 .hand{
- -webkit-animation: wave steps(1,end) 2s forwards infinite;
- }
- ```
- 
- (左图:`number`为2;右图:`number`为1)
-
- 第二个参数可选,接受`start`和`end`两个值:指定在每个间隔的**起点**或是**终点**发生阶跃变化。通过[W3C](http://www.w3.org/)中的一张step的工作机制图可以理解:
- (图片来源:[W3C](http://www.w3.org/TR/css3-transitions/))
-
- TIPS:
-> `step-start`等同于`steps(1,start)`:动画执行时为开始左侧端点的部分为开始;
-> `step-end`等同于`steps(1,end)`:动画执行时以结尾端点为开始,默认值为end。
-
- 最后安利一个计算帧数的工具:[CSS3动画帧数计算器](http://tid.tenpay.com/labs/css3_keyframes_calculator.html)
-
-## CSS动画的优缺点
-1. 优点:
-> 简单、高效
-> 声明式的
-> 不依赖于主线程,采用硬件加速(GPU)
-> 简单的控制keyframe animation播放和暂停
-2. 缺点:
-> 不能动态修改或定义动画内容
-> 不同的动画无法实现同步
-> 多个动画彼此无法堆叠
-
-
-## 简单做动画:
-总结一下在之前做动画需求时的经验,归纳为以下7个步骤。以此需求为例:
- (案例:iphone6s推广游戏)
-
-1. **观察**——哪些元素可以动?元素可以怎么动?
-
- 根据视觉稿,分析标题、按钮、人物、背景都可以适当加动画元素。
-
-2. **沟通**——了解设计师的想法,并提出自己的想法。
-
- 这是设计师给出的大致动画过程,具体的过渡及动效没有明确给出,因此可以根据自己的想法与设计师进行沟通。
- 
-
-3. **分析**——分析动画元素的层次(出现顺序);画出动画时间轴;根据时间轴写出CSS动画时间轴。
- 分析该页面动画的出现可以分为四个层次:
- 
- 根据前面的分析画出动画时间轴:
- 
- 根据时间轴写出CSS动画时间轴:
- **方法一:**将所有动画元素放在一个时间轴上(适合于元素较少的情况)。
- ```css
- a0{-webkit-animation: a0 2s forwards;}
- @-webkit-keyframes a0{
- 0%{……}
- 30%{……}
- }
- a1{-webkit-animation: a1 2s forwards;}
- @-webkit-keyframes a1{
- 0%,30%{……}
- 50%{……}
- }
- a2{-webkit-animation: a2 2s forwards;}
- @-webkit-keyframes a2{
- 0%,50%{……}
- 75%{……}
- }
- a3{-webkit-animation: a3 2s forwards;}
- @-webkit-keyframes a3{
- 0%,75%{……}
- 100%{……}
- }
- ```
- **方法二:**同一阶段的动画元素放在一个时间轴上。
- ```css
- a0{-webkit-animation: a0 0.6s forwards;}
- @-webkit-keyframes a0{
- 0%{……}
- 100%{……}
- }
- a1{-webkit-animation: a1 0.4s 0.6s forwards;}
- @-webkit-keyframes a1{
- 0%{……}
- 100%{……}
- }
- a2{-webkit-animation: a2 0.5s 1s forwards;}
- @-webkit-keyframes a2{
- 0%{……}
- 100%{……}
- }
- a3{-webkit-animation: a3 0.5s 1.5s forwards;}
- @-webkit-keyframes a3{
- 0%{……}
- 100%{……}
- }
- ```
-
-4. **切图**——PS CC 2015修改组/图层名为“***.png”,生成图像资源。
- 使用PS CSS 2015切图具体步骤如下:
- 
-
-5. **定位**——适当使用绝对定位;适当使用rem。
- 安利一款sublime插件:[PX转REM插件](https://github.com/youing/PxRemTranslate)。
-
-6. **实现**
-
- 从无到有:
- - 透明度—opacity
- - 位移—translate
- - 宽度—width(少用)
-
- 动起来:
- - 2/3D转换—transform
- - 其他属性
-
-7. ** 润色**
- 后文介绍
-
-TIPS:不要在before,after里加动画!
-
-## 不止于“动”:
-1. **惯性**
-
- 物体没有停在本应该停止的位置上而是靠惯性**继续摆动一段时间然后反方向摆回来**。
- 惯性在日常的动画需求中应用相当普遍,元素的高速进入都涉及惯性。
- - 示例:标题快速从左侧划入屏幕中,标题本应停在屏幕左右居中位置,由于惯性的作用,标题到达居中位置后又向右滑行一小段,再反方向滑回。
-  (案例:618 APP返场页H5)
-
-2. **透视**
-
- 物体与观察者的距离远近在静态时通过**物体的大小**来体现。
- 当物体运动时,通过**远近物体不同的运动速度**来体现,从而形成层次感。**近处的物体运动快,远处的物体运动慢**。
- 
- (透视原理图)
- - 示例:云朵与观察者的距离有远近之分(不可能所有的云都在一个平面上),设置云朵的飘动动画时,可根据云朵的大小(远近)设置不同的运动速度,近处的云朵飘动的速度比远处的快,从而形成透视。
- ```
- .cover_clouds .c1,
- .cover_clouds .c2,
- .cover_clouds .c4,
- .cover_clouds .c6
- {
- -webkit-animation: cloudFloat linear 6s infinite;
- }
- .cover_clouds .c3,
- .cover_clouds .c5,
- .cover_clouds .c7
- {
- -webkit-animation: cloudFloat linear 10s infinite;
- }
- ```
-  (案例:iphone6s推广游戏)
-
-3. **节奏**
-
- 善用**曲线**和**缓动**可使效果更生动。
- **多个元素保持相同节奏**,保证画面的动画不过分凌乱。
- - 示例:匀速的呼吸与缓动的呼吸。
- ```
- .breath{
- -webkit-animation:
- breath 6s linear infinite;
- }
- ```
- ```
- .breath{
- -webkit-animation:
- breath 6s cubic-bezier(.2,.73,.71,.44) infinite;
- }
- ```
- 
- (左图:匀速呼吸效果图;右图:缓动呼吸效果图)
- 跟随动画进行呼吸,可以明显感觉到缓动的呼吸更贴近我们实际的呼吸情况。呼吸函数如下:
- 
- (图片来源:[让界面动画更自然——ISUX](http://isux.tencent.com/animation-factor.html))
-
-4. **跟随**
-
- 跟随动作是将物体的各部位拆解,通常是**没有骨架**的部位较容易产生跟随的动作。例如:一个奔跑的人突然停下,他的衣服头发等可能仍会运动。其中,人是“主体”,衣服头发等是“附属物”。
- 附属物的动作取决于:**主体的动作**,**附属物本身的重量和质地**,以及**空气的阻力**。
- **主体与附属物之间动作的重叠和追随**,就是鉴定动作流畅性与自然度好坏的标准。
- - 示例:首页主体人物动作触发后,进行小范围的四向运动以模拟人物身体颤动的效果。人物头饰(花及骨头)与运动主体(人)并非一体,属于附属物。附属物的运动受主体的运动影响出现同向、延时的运动。
-  (案例:拍拍七夕活动页—七叻个夕)
-
-## 优化
-1. 不用left/right/width/height/margin-top等
-2. 少用color/background等
-3. 使用translate/opacity
-4. 适当开启GPU加速
-5. 适当使用will-change
-
-
-## 参考文章
-1. [CSS3 transition 属性过渡效果 详解,Techzero ,2014-04-1](http://www.itechzero.com/css3-transition-property-transition-effect-explain.html)
-2. [深入理解CSS3 Animation 帧动画,Aaron,2015-07-13](http://www.cnblogs.com/aaronjs/p/4642015.html)
-3. [CSS3 timing-function: steps() 详解,那个傻瓜瓜,2014-12-30](http://www.tuicool.com/articles/neqMVr)
-4. [主流动画实现方式总结,Benjamin,2015-01-25](http://www.zuojj.com/archives/1292.html)
-5. [Animation Principles for the Web](https://cssanimation.rocks/principles/)
-6. [12 basic principles of animation](https://en.wikipedia.org/wiki/12_basic_principles_of_animation)
diff --git a/source/_posts/2016-01-07-auto-deploy-website-by-webhooks-of-github.md b/source/_posts/2016-01-07-auto-deploy-website-by-webhooks-of-github.md
deleted file mode 100644
index a4e3dd00ad..0000000000
--- a/source/_posts/2016-01-07-auto-deploy-website-by-webhooks-of-github.md
+++ /dev/null
@@ -1,188 +0,0 @@
-title: 使用Github的webhooks进行网站自动化部署
-subtitle: 本文介绍Github的高级功能webhooks,并通过实例帮助我们如何使用它进行网站的自动化部署
-cover: //img20.360buyimg.com/ling/jfs/t1/42436/36/6777/23242/5d073c46Ec32bbcdd/ae3edeb82083683a.jpg
-date: 2016-01-07 17:05:05
-categories: Web开发
-tags:
- - Github
- - webhooks
-author:
- nick: SkyCai
- github_name: cnt1992
----
-
-相信很多码农都玩过了`Git`,如果对`Git`只是一知半解,可以移步`LV`写的 [GIT常用操作总结](http://aotu.io/notes/2015/11/17/Git-Commands/),下面介绍到的一些关于 `Git` 的概念就不再赘述。
-
-为啥想写这篇文章?主要是因为部门服务器因为安全性原因不允许`SCP`上传文件进行应用部署,然后有一些应用是放在Github上的,然后部署应用的步骤就变成:
-
-1.git clone github项目 本地目录
-2.配置一下应用的pm2.json并reload
-3.Nginx配置一下反向代理并restart
-
-当然如果只是一次性部署上去就不再修改的话并没啥问题,但是要是项目持续性修改迭代的话,就比较麻烦了,我们就在不断的重复着上面的步骤。作为一个码农,怎么允许不断的重复同样的工作,于是`Github webhooks`闪亮登场。
-
-
-
-## 关于Github webhooks
-
-让我们看看 [官方](https://developer.github.com/webhooks/) 关于Github webhooks的解释:
-
-> Webhooks allow you to build or set up integrations which subscribe to certain events on GitHub.com.
-
-提炼出来几个点:
-
-- 必须是Github上面的项目
-- 订阅了确定的事件(包括push/pull等命令)
-- 自动触发
-
-刚好符合了这几个条件,那接下来就看看如何进行`网站自动化部署`,主要会从下面几点来讲解:
-
-1.自动化`shell`脚本
-2.服务端实现
-3.配置`github webhooks`
-
-## 自动化脚本
-
-我之前翻译过一篇文章 [使用Node.JS创建命令行脚本工具](http://aotu.io/notes/2015/12/23/building-command-line-tools-with-node-js/),但是我们现在的自动化脚本直接用 `shell` 来实现,假设名称为`auto_build.sh`:
-
-```sh
-#! /bin/bash
-
-SITE_PATH='/export/Data/aotu.jd.com/index/cnt1992.github.io'
-USER='admin'
-USERGROUP='admin'
-
-cd $SITE_PATH
-git reset --hard origin/master
-git clean -f
-git pull
-git checkout master
-chown -R $USER:$USERGROUP $SITE_PATH
-```
-
-**Note:** 在执行上面`shell`脚本之前我们必须第一次手动`git clone`项目进去,例如:
-
-```
-git clone github远程项目 /export/Data/aotu.jd.com/index/cnt1992.github.io
-```
-
-> shell脚本其实就跟直接在终端运行命令一样,类似于windows下面的BAT批处理命令,更多详细可以查阅资料。
-
-## 服务端实现
-
-`Github webhooks`需要跟我们的服务器进行通信,确保是可以推送到我们的服务器,所以会发送一个带有`X-Hub-Signature`的`POST`请求,为了方便我们直接用第三方的库[github-webhook-handler](https://github.com/rvagg/github-webhook-handler)来接收参数并且做监听事件的处理等工作。
-
-现在我们可以在`shell`脚本的同级目录下面执行下面命令初始化一个`package.json`:
-
-```bash
-npm init -f
-```
-
-然后执行下面命令安装上面提到的第三方库:
-
-```bash
-npm i -S github-webhook-handler
-```
-
-接下来创建我们的服务主入口文件`index.js`:
-
-```bash
-touch index.js
-```
-
-紧接着参考`github-webhook-handler`的`demo`编辑我们的`index.js`:
-
-```javascript
-var http = require('http');
-var spawn = require('child_process').spawn;
-var createHandler = require('github-webhook-handler');
-
-// 下面填写的myscrect跟github webhooks配置一样,下一步会说;path是我们访问的路径
-var handler = createHandler({ path: '/auto_build', secret: '' });
-
-http.createServer(function (req, res) {
- handler(req, res, function (err) {
- res.statusCode = 404;
- res.end('no such location');
- })
-}).listen(6666);
-
-handler.on('error', function (err) {
- console.error('Error:', err.message)
-});
-
-// 监听到push事件的时候执行我们的自动化脚本
-handler.on('push', function (event) {
- console.log('Received a push event for %s to %s',
- event.payload.repository.name,
- event.payload.ref);
-
- runCommand('sh', ['./auto_build.sh'], function( txt ){
- console.log(txt);
- });
-});
-
-function runCommand( cmd, args, callback ){
- var child = spawn( cmd, args );
- var response = '';
- child.stdout.on('data', function( buffer ){ resp += buffer.toString(); });
- child.stdout.on('end', function(){ callback( resp ) });
-}
-
-// 由于我们不需要监听issues,所以下面代码注释掉
-// handler.on('issues', function (event) {
-// console.log('Received an issue event for %s action=%s: #%d %s',
-// event.payload.repository.name,
-// event.payload.action,
-// event.payload.issue.number,
-// event.payload.issue.title)
-});
-```
-
-然后利用node管理工具跑起来服务,这里使用了`pm2`:
-
-```bash
-pm2 start index.js
-```
-
-到这一步服务已经跑起来了,但是对外网并不能直接访问到,所以还需要配置一下`Nginx`做一下反向代理:
-
-```javascript
-···
-server {
- listen 80;
- server_name aotu.jd.com;
-
- ···
- location /auto_build {
- proxy_pass http://127.0.0.1:6666;
- }
- ···
-}
-```
-
-OK,到这里整个服务已经搭建完成,下一步就只需要配置`Github webhooks`。
-
-## 配置`github webhooks`
-
-我们可以在我们的`Github`上面最右边有一个`Settings`的Tab,找到`Webhooks & services`,如下图:
-
-
-
-然后点击新建,输入`Payload URL`跟`Secret`,确定即可。
-
-## 验证
-
-绑定成功之后,我们可以试试提交一下代码,然后来到`Github`看看是否自动触发了接口,如下图:
-
-
-
-然后随便选择一个点击一下,可以看到`200`的响应:
-
-
-
-## 小结
-
-上面就是利用`Github webhooks`进行网站自动化部署的全部内容了,不难发现其实这项技术还是有局限性的,那就是依赖于`github`,一般我们选择的都是免费github账号,所有项目都对外,一些敏感项目是不适合放置上去的。
-
-这个时候就考虑这个组里同事推荐的 [backup](http://backup.github.io/backup/v4/),自己还没试用,有兴趣可以了解了解。
diff --git a/source/_posts/2016-01-07-debug-webapp-with-chrome-devtools.md b/source/_posts/2016-01-07-debug-webapp-with-chrome-devtools.md
deleted file mode 100644
index 08d4f6ceda..0000000000
--- a/source/_posts/2016-01-07-debug-webapp-with-chrome-devtools.md
+++ /dev/null
@@ -1,119 +0,0 @@
-title: 使用Chrome开发工具优化Web应用
-subtitle: 本文主要介绍如何使用Chrome开发工具的Timeline功能来监控Web应用的性能,找出问题,并由此延伸出一些优化Web应用性能的思路。
-cover: //img12.360buyimg.com/ling/jfs/t1/48480/21/2613/390171/5d073cd4E94c39266/3a75d838191fbb7b.png
-categories: 性能优化
-tags:
- - chrome
- - DevTool
-author:
- nick: Simba
- github_name: Simbachen
-date: 2016-01-07 17:05:05
----
-
-当我们写了一组炫(fu)酷(za)的H5动效后,发现在移动端上会卡顿,该怎么办?
-目前市场上大多数设备的屏幕刷新频率是60Hz,想要用户滑动页面或者播放动画没有卡顿,浏览器的渲染速率就要和屏幕刷新的频率同步,达到60fps。
-
-Chrome开发工具的Timeline面板监控了web应用运行时所有活动情况,不过它的功能很多,对于英文不好的童鞋,有点无从下手,下面直接上手来使用。
-
-## 首先,审查一个页面,切换到Timeline面板。
-
-
-图中红框标出的部分是功能栏:从45到47版本,Timeline工具连续都有更新,当前截图的版本号是47.0;
-
->* 开始/停止记录,打开Timeline面板时刷新页面会自动开始记录
-* 清除已有记录
-* 过滤内容
-* 强制垃圾回收
-* 视图模式,最新版本中点击切换两种视图模式
-* 捕获内容选项,选中最后一项截屏的话会保留每帧的截图,记录数据的buffer空间会和快被占满
-
-## 接下来记录一段时间线状态。
-
-
-图中没被标出的部分是整个监控过程中的数据概览;红框标出的部分有两栏,上面是选中的时间段内每一帧的情况,下面是内存占用的变化。
-
-浏览器渲染的速率达到60帧/秒,那么每一帧只有1000ms / 60 = 16.67ms的时间来响应,其中浏览器在每一帧还要做一些额外的事情,因为我们要保证每一帧的CPU time在12ms左右。
-
-有红色三角形角标标出的表示当前帧消耗过多时间
-
-
-点击选中一帧可以看到当前帧的详细情况,图中显示,当前帧的渲染消耗了30.8ms,可能会造成卡顿。
-饼图中可能会有五个颜色:
-
->* 蓝色: 加载
-* 黄色: 脚本执行
-* 紫色: 渲染
-* 绿色: 绘制
-* 灰色: DevTools不感知的活动
-
-图中帧因为没有加载活动,没有蓝色区域。可以看出脚本执行和帧绘制占据了大部分面积,不过问题并不在这里,因为它们总共才花费7.82s。
-在Chrome的45.0版本中,饼图里还有一种颜色:白色,表示刷新周期里空闲的时间。在这段时间里,一直在等待用户的响应,直到一个交互事件触发了页面视图的变化。最新的更新里在饼图中去掉了白色,区分为CPU time和帧的Duration,更加合理。这里引起视图渲染和绘制可能有:
-1. 用户的交互行为
-2. 定时器触发
-
-使用requestAnimationFrame这个函数,将脚本执行和渲染流程联系起来,以避免在某一帧的中间突然执行脚本导致重新渲染和绘制而整个过程不能在16ms内完成。
-
-
-## 分析一个问题帧
-
-
-这一帧比较极端,从图上看就是紫色部分花费掉了大量时间,我们就可以从这里入手来优化代码,在此之前先得了解一下浏览器绘制帧的整个过程。实际导致绘制帧卡顿可能是其中任何一个环节。
-
-
-
-
->* Javascript: 除了使用Javascrit来实现视觉变化,还有CSS Animations、 Transitions。
-* Style: 根据CSS选择器,对每个DOM元素匹配对应的CSS样式。
-* Layout: 在上一步确定了每个DOM元素的样式规则后,这一步就是具体计算每个DOM元素最终在屏幕上显示的大小和位置。web页面中元素的布局是相对的,因此一个元素的布局发生变化,会联动地引发其他元素的布局发生变化。例如父元素的宽度变化引发子元素宽度变化,又联动的引发孙子元素的宽度变化。
-* Painting: 绘制,本质上就是填充像素的过程。包括绘制文字、颜色、图像、边框和阴影等,也就是一个DOM元素所有的可视效果。一般来说,这个绘制过程是在多个层上完成的。
-* Composite: 上一步的绘制是在多个层上进行的,在这一步,浏览器会将所有层按照合理的顺序合并成一个图层,然后显示在屏幕上。
-
-
-说明,上述过程的解释总结或直接引用自谷歌开发者文档。
-
-在以上5个过程里:
-
-1. 修改DOM元素的“layout”(宽、高、位置)属性,浏览器会检查哪些元素需要重新布局,然后对页面激发一个reflow过程完成重新布局。被reflow的元素,接下来也会激发绘制过程,最后激发渲染层合并过程,生成最后的画面。
-2. DOM元素有一些“paint only”属性,例如背景图片、文字颜色、阴影,这些属性不会影响页面的布局,因此浏览器会在完成样式计算之后,跳过布局过程,只做绘制和渲染层合并过程。
-3. 还有一些CSS属性既不需要重新布局也不需要重新绘制,例如,transform、opacity(目前,只有这两个属性),浏览器会在完成样式计算之后,直接做渲染层合并。
-4. 用translateZ(0)属性把动画元素提升到单独的渲染层中(我们常说的启用3D加速)。
-
-对于滚屏和动画,最理想的就是只使用transform和opacity来实现视觉变化效果,并且遵循第四点。
-
-
-## 点击切换视图模式,找到问题所在。
-
-
-
-这是一个知名线上网站的首页,这里发生了滚屏触发加载内容,导致DOM结构变化,引发了大量内容的重绘和渲染,并且页面旧的内容没有回收,节点较多,明显的感觉到滚屏的时候有卡顿感。对于这个应用按照上述的思路来优化,在优化的过程中,我们也许会遇到下面这个问题。
-
-
-
-这是另一个demo页面,有数千个节点组成,用以模拟无限懒加载数据的情况,其中只有一个节点上应用了循环的css3动画。其它的都不会改变。为了将有动画的节点独立到一个单独的渲染层中,我对它应用了translateZ(0)。本以为大功告成,结果在滚屏的时候发现非常卡顿。于是就有了上图,平均每帧的渲染都消耗掉了200ms左右,从Timeline监控数据中可以看到,其中Composite Layers这个过程耗费了大量时间。那么直接查看layer状态:
-
-
-
-再看官方文档的提示:由于每个渲染层的纹理都需要上传到GPU处理,过多的渲染层来带的开销而对页面渲染性能产生的影响,甚至远远超过了它在性能改善上带来的好处。
-
-实际上页面里并没有主动通过translateZ属性来独立更多的层,我们可以认为这是触发了浏览器的一个“bug”,最新版本的chrome仍然会触发这个问题,不过最新版本的ios里Safari已经不会触发这个问题了。至于什么情况会触发浏览器去创建一个独立层来渲染元素,例如拥有3DCSS属性的元素、使用加速视频解码的元素等,对这个问题这里就不再详述。
-
-如果手动的将大量的层独立出来渲染,导致GPU罢工,或是任由他们导致CPU罢工,都会造成性能问题,不过有了Timeline工具,我们就能找到问题所在,一一去分析解决了。
-
-
-
-
-
-## 参考文档:
-https://developers.google.com/web/fundamentals/performance
-https://developer.chrome.com/devtools/docs/timeline
-
-
-
-
-
-
-
-
-
-
diff --git a/source/_posts/2016-01-08-promise.md b/source/_posts/2016-01-08-promise.md
deleted file mode 100644
index 27b8ae1896..0000000000
--- a/source/_posts/2016-01-08-promise.md
+++ /dev/null
@@ -1,280 +0,0 @@
-title: Promise 实战
-subtitle: 本文适合对Promise已有一定了解的同学,如果你还不知道Promise是什么,可以移步这里Promise API的使用方法,掌握基础的Promise使用方法后,再阅读本文。
-
-cover: //img13.360buyimg.com/ling/jfs/t1/45903/37/2685/28858/5d0771c8Ef0b6254f/387020907a5d5f7b.jpg
-category: Web开发
-tags:
- - ES6
- - Promise
-author:
- nick: AdamChuan
- github_name: AdamChuan
-date: 2016-01-08 17:05:05
----
-
-## Promise 是什么 ##
-
-Promise 是抽象异步处理对象以及对其进行各种操作的组件。 通俗点讲,Promise能解决由于回调嵌套带来的流程控制与可读性问题。
-promise 已经是成为我们解决回调炼狱的常用方案,而且已经得到官方标准支持,如果你刚刚开始使用Promise,本文将帮助你了解几个常见的Promise的使用场景。
-
-
-## Promise 的历史 ##
-
-[早在1976年就有人提出Promise 的概念](https://en.wikipedia.org/wiki/Futures_and_promises)。之后的计算机语言发展中,很多语言都提供了与 Promise 相关的特性。而对于Javascript语言来说,最早让大家广泛接触的 Promise 相关的库是由 `jQuery.Deferred()` 对象实现的。随着 Promise/A+ 标准规定了一系列 API,实现该标准的库如雨后春笋版涌现了出来,在最新的ECMAScript 2015中已经提供了Promise的内置对象,成为了基础库。
-
-## 一些Promise的使用场景 ##
-
-### 1.原生API函数的Promise化 ###
-大部分原生的API函数并不支持Promise,还是基于回调来使用的,所以需要把一些方法改为返回一个 Promise 对象,这个过程被称为函数的 Promise 化。
-下面一个例子将对定时器`setTimeout` Promise 化。
-```js
-function timer(fn,time){
- return function(){
- return new Promise( (resolve,reject)=>{
- setTimeout(function(){
- fn();
- resolve();
- },time);
- });
- }
-}
-
-Promise.resolve()
- .then(
- timer(function () {
- console.log('1')
- }, 1000)
- )
- .then(() => {
- console.log('2');
- });
-/*
-输出结果
-1
-2
-*/
-```
-Promise化本质上都属于一种Curry化。Curry化是指,将需要传递多参数的函数生成一个新的函数,如上代码先通过执行 timer得到一个新的函数,该函数会返回一个Promise,这样就完成了Promise化。将一些基础的函数进行Promise化,可以
-大大减少不必要的代码。
-下面的代码,将会体现这种优势:
-```js
- var promise_timer = timer(function () {
- console.log('1')
- }, 1000)
-
- function promise_timer2(){
- return new Promise( (resolve,reject)=>{
- setTimeout(function(){
- console.log('1');
- resolve();
- },1000);
- });
- }
-```
-变量`promise_timer`赋予的函数,与函数`promise_timer2`是等价的。 可以看出 `setTimeout` Promise 化之后,代码程序可读性更强,代码量也变少了。
-
-### 2.Promise.all解决并行任务 ###
-
-当某个函数需要在 N 个回调都完成时才执行,这个时候就可以使用`Promise.all`来改善你的代码。
-
-以下是一个图片并行加载的例子,当所有图片加载完成后,再将所有图片一起展示。
-
-```js
-
-function loadImg(src){
- return new Promise( (resolve,reject)=> {
- var img = document.createElement("img");
- img.src = src;
- img.onload = function(){
- resolve(img);
- }
- img.onerror = function(err){
- reject(err);
- }
- });
-}
-
-function showImgs(imgs){
- imgs.forEach(function(img){
- document.body.appendChild(img);
- });
-}
-
-Promise.all([
- loadImg('1.png'), //加载图片
- loadImg('2.png'),
- loadImg('3.png'),
- ...
-]).then(showImgs); //显示图片
-
-
-```
-
-
-需要注意的是,`Promise.all`中传入的 Promise 数组,各自 resolve 之后得到的值,将合并成一个数组传入到 then 中的方法,且数组中 resolve 值的顺序,与 Promise 数组的顺序一致。
-
-
-### 3.Promise.then 的链式调用 ###
-
-在许多Promise示例中都可以看到类似如下的链式调用的代码。
-
-```js
-
-function getUserInfo(){
- console.log('getUserInfo start');
- return new Promise((resolve,reject)=>{
- setTimeout(()=>{
- var userInfo = {
- name : 'adamchuan'
- };
- resolve(userinfo);
- console.log('getUserInfo end');
- },1000);
- });
-}
-function getGroupInfo(userinfo){
- console.log('getGroupInfo start');
- return new Promise((resolve,reject)=>{
- setTimeout(()=>{
- var groupInfo = {
- name : 'jdc'
- }
- console.log('getGroupInfo end');
- resolve(groupInfo,userinfo);
- },1000);
- });
-}
-
-function getTaskInfo(groupInfo,userinfo){
- console.log('getTaskInfo start');
- return new Promise((resolve,reject)=>{
- setTimeout(()=>{
- var taskInfo = {
- name : 'rebuild'
- };
- console.log('getTaskInfo end');
- resolve();
- },1000);
- });
-}
-
-var p = Promise.resolve();
- p.then(getUserInfo)
- .then(getGroupInfo)
- .then(getTaskInfo);
-
-/* 输出结果
- getUserInfo start
- getUserInfo end
- getGroupInfo start
- getGroupInfo end
- getTaskInfo start
- getTaskInfo end
-*/
-```
-如上面代码所示,我们可以很清楚的理解到程序执行的顺序是
-
-
-
-1. 得到userInfo
-2. 得到groupInfo
-3. 得到taskInfo
-
-但是如果我们对代码进行一点小的改造,将 then 中的方法不再返回 Promise ,那么执行的代码将会变成这样:
-
-``` js
-var p = Promise.resolve();
- p.then(getUserInfo)
- .then(getGroupInfo)
- .then(getTaskInfo)
- ...
-
-function getUserInfo(){
- console.log('1');
- new Promise((resolve,reject)=>{
- setTimeout(()=>{
- console.log('2');
- resolve();
- },1000);
- });
-}
-
-function getGroupInfo(){
- console.log('3');
- new Promise((resolve,reject)=>{
- setTimeout(()=>{
- console.log('4');
- resolve();
- },1000);
- });
-}
-
-function getTaskInfo(){
- console.log('5');
- new Promise((resolve,reject)=>{
- setTimeout(()=>{
- console.log('6');
- resolve();
- },1000);
- });
-}
-
-/* 输出结果
- getUserInfo start
- getGroupInfo start
- getTaskInfo start
- getUserInfo end
- getGroupInfo end
- getTaskInfo end
-*/
-```
-这是为什么呢?
-因为每次调用 then 都会返回一个新的 Promise ,如果 then 中的申明的方法没有返回一个 Promise ,那么会默认返回一个新的
-处于 fulfilled 的 Promise ,之后添加的 then 中的方法都会立即执行,所以执行的顺序就变成这样了:
-
-
-*当要在使用链式 Promise 时,请务必在then传入的方法中返回一个新的 Promise。*
-
-另外一个需要注意的是,resolve 传递给下个 then 方法的值只能有一个,上面 getTaskInfo 方法中是无法获取到 userInfo 的值,所以如果有多个值需要放在一个数据集合( Array , Object , Map , Set )中传入下个方法。
-```js
-function getTaskInfo(groupInfo,userInfo){ /* userInfo为undefined */
- console.log(groupInfo); // { name : 'jdc'}
- console.log(userInfo); // undefined
-}
-```
-
-### 4.中断或取消 Promise 链 ###
-Promise 标准的API 中并没有提供相应的方法来 中断或者取消 Promise 链的执行,一些库中提供了类似`Promise.break`或者 `Promise.fail`的方法来中断或取消 Promise 链。利用`Promise.catch`的特性来中断 promise链。
-
-```js
-/** 用于中断的信号 */
-class BreakSignal { }
-
-Promise
- .then(() => {
- // 开始.
- })
- .then(() => {
- if (wantToBreakHere) {
- // 抛出中断信号.
- throw new BreakSignal();
- }
- })
- .then(() => {
- // 需要跳过的部分.
- })
- // 接住中断信号.
- .catch(BreakSignal, () => { });
-```
-只要在 Promise 执行过程中抛出异常,都会直接跳转到 catch 中。但是这样的做法有一个缺点,无法区分程序本身的异常,还是手动抛出的异常。所以需要手动设置一个标识标量,来区分是为了中断执行还是本身的程序异常。
-
-## 小结 ##
-合理的利用 Promise ,可以让代码脉络更加的清晰易懂,流程控制,异常捕获也更加准确。当然为了使用 Promise 也要编写很多额外代码,
-想要真正的解决回调问题还得期待ES7的 `async` `await` 关键字的到来,不过在此之前,Promise 都将是解决程序流程控制的最优选择之一。
-
-## 参考文章
-1. [Promise A+](http://www.zuojj.com/archives/1292.html)
-2. [Promise迷你书](http://liubin.org/promises-book/)
-3. [Promise的前世今生](http://alinode.aliyun.com/blog/5)
-4. [jQuery的deferred对象详解](http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html)
-
diff --git a/source/_posts/2016-01-14-introduction-to-JS-game-development.md b/source/_posts/2016-01-14-introduction-to-JS-game-development.md
deleted file mode 100644
index 91002f81fd..0000000000
--- a/source/_posts/2016-01-14-introduction-to-JS-game-development.md
+++ /dev/null
@@ -1,257 +0,0 @@
-title: js游戏开发初级入门
-subtitle: 凹凸实验室水灵通透软妹子-暖暖,手把手教你用js开发五子棋游戏!
-cover: //img11.360buyimg.com/ling/jfs/t1/82905/29/2165/48213/5d0773d6E2da7396e/49b273d509671025.jpg
-categories: Web开发
-tags:
- - js
- - 游戏
- - 五子棋
-author:
- nick: 暖暖
- github_name: Newcandy
-date: 2016-01-14 09:20:39
----
-万事开头难,js一直没有进步?跟着这篇文章来编写五子棋游戏吧!
-
-
-## 1 游戏开发方法
-
-### 1.1 小规模游戏
-小规模游戏一般由一人或两人完成,不需要详细的产品说明等资料,直接进入代码的编写,然后在浏览器中解释并运行。有时候出现错误,重新编辑再回到浏览器解释运行,就是一个简单的编辑-解释-运行的重复工作模式。
-
-### 1.2 大规模游戏
-大规模游戏一般由两人以上完成,一共分为三个阶段:设计阶段、说明阶段、实现阶段。首先是设计阶段:设计什么游戏,游戏的主体用户是谁,游戏的目的等。然后是说明阶段:清楚游戏需要的类和类中需要的方法,分别做一个规划,保证编写代码时思路清晰,以及代码的整洁性。最后是实现阶段,其实就是进入编辑-解释-运行的工作模式。也就是说,大规模游戏比小规模游戏多了两大阶段即设计阶段和说明阶段而已。
-
-## 2 了解游戏规则
-
-* 对局双方各执一色棋子。
-* 空棋盘开局
-* 黑先、白后,交替下子,每次只能下一子。
-* 棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
-* 黑方的第一枚棋子可下在棋盘任意交叉点上。
-
-
-## 3 五子棋游戏的主要方法
-
-### 3.1 画棋盘
-
-#### 3.1.1 画棋盘思路
-```javascript
-// 确定棋盘大小 15*15 即n = 15
-
-function drawGobang(n) {
-// 动态生成dom元素
-// 通过添加类控制棋盘样式,尤其注意边缘的棋子的样式控制
-}
-```
-
-#### 3.1.2 画棋盘代码
-```javascript
-// 画棋盘格子
-function drawGobang(n) {
-
- for(var i=0;i body -> html(ie5.5-跳过) -> document -> window(ie9,fx,chrome,safari)。
-
-因此我不需要给棋盘的每个格子绑定事件,只需要绑定棋盘(格子的父元素)即可。代码如下:
-```javascript
-var gobang = document.getElementById("gobang_main"); // 获取棋盘
-EventUtil.addHandler(gobang,"click",drawPiece); // 点击棋盘,进行下棋
-```
-
-#### 3.2.2 事件委托的问题
-
-由于在父元素中绑定事件,我们知道,事件目标是被单击的单个五子棋格子。因此,需要检测 id属性或其他属性 来决定采取适当的操作。
-
-如果不检测是否是我们想要的事件目标,可能导致错误。
-代码如下,如果targetID不是我们的事件目标,可能i,j的数据则不正确,从而导致访问对应的五子棋格子gobangArr[i][j]出错:
-```javascript
-// 格子的id格式为"block_"+ i + "_" + j;
-// targetId为当前目标的id,前面加运算符+是为了转换类型
-// i和j代表第i行第j列
-i = +targetId.split("_")[1];
-j = +targetId.split("_")[2];
-```
-
-#### 3.2.3 已下过的棋盘位置
-
-* 画当前棋子,通过添加类 active 和 代表颜色的white或black
-* target.className.indexOf("active")<0,意思是当前位置的类若含有active类,则不执行画棋子。
-* 误区:通过 棋盘数据gobangArr[i][j]是否为空来判断是否下过棋子。不可通过棋盘数据gobangArr[i][j] 是否为空来判断,因为数组可能存在冗余数据。除非初始化时重置了数组为空。
-
-#### 3.2.4 其他
-
-* 一旦下一个棋子就需要判断是否赢了:chessWin(i,j,color);
-* 需要切换棋子颜色:color = color=="black"? "white":"black";
-* 其中一方赢了的话,不可再下棋,必须重新来一局,即移除画棋子的方法。
-
-### 3.3 判断输赢
-#### 3.3.1 判断输赢算法
-首先设置count = 1。count的值代表在同一个方向连续在一起的棋子总数,达到5个则该方赢。
-如水平方向按照如下顺序执行判断,其他方向雷同:
-1. 按顺序遍历当前位置(i,j)棋子的前四个位置是否含相同颜色的棋子,若相同则count++,同时检测是否count == 5 。
-2. 一旦不相同退出循环,
-3. 继续按顺序遍历(i,j)棋子的后四个位置是否含相同颜色的棋子,若相同,count++以及检测是否count == 5 。
-如下图所示,红色虚线为即将要下的棋子,计算count为1,向左判断使得count最后为3,遇到红色交叉的地方没有黑色棋子,则退出循环;从红色虚线的右边继续判断,最后count为5,因此判断黑棋赢:
-
-
-
-代码如下,一共检测四个方向:
-```javascript
-function chessWin(i,j,color) {
-// 垂直方向
-// 重置count = 1
-// 水平方向
-// 重置count = 1
-// 45°方向
-// 重置count = 1
-// 135°方向
-// 重置count = 1
-}
-```
-
-### 3.4 重置游戏
-主要是清除棋子以及棋子数组,另外设置默认数据:默认黑棋先下,重置提示语,重新给棋盘绑定方法。一方赢了的话,默认移除画棋子方法的,所以需要重新给棋盘绑定方法。如果理解了文章上面讲述的方法的话,重置游戏是比较简单的,因此不再赘述。
-
-## 4 五子棋测试
-* 检测特殊值。如检测棋盘边缘是否可以正常画棋子。
-* 测试范围。判断五子棋的四个方向即垂直方向、水平方向、45度方向、135度方向,是否可以判断输赢正确。
-
-
-## 5 JS事件
-最后根据五子棋的主要方法,总结一下js事件。
-### 5.1 事件处理程序:响应某个事件的函数
-#### 5.1.1 html事件处理程序
-即直接在HTML代码中添加事件处理程序。不推荐使用,原因如下:
-html事件处理程序缺点:时差问题、代码紧密耦合、扩展事件处理程序的作用域链在不同浏览器中导致不同结果。
-
-#### 5.1.2 DOM0级事件处理程序
-类似onclick等事件处理程序属性,通常全部小写。
-```javascript
-var btn = document.getElementById("myBtn");
-btn.onclick = function(){ }; // 绑定
-btn.onclick = null; // 解绑
-```
-
-#### 5.1.3 DOM2级事件处理程序
-DOM2:可添加多个事件处理程序,按顺序触发。
-使用方法:
- 绑定函数addEventListener() 与 解绑函数removeEventListener():参数为事件名(如click)、作为事件处理程序的函数、布尔值。布尔值为true时代表捕获,false代表冒泡阶段调用事件处理程序,一般为false。
- 注意:若第二个参数为匿名函数,即使用removeEventListener()传入相同的匿名函数也无法解绑。
-
-```javascript
-btn.addEventListener("click",myGod,false);
-function myGod() {
- alert("oh,my god!");
-}
-btn.removeEventListener("click",myGod,false);
-```
-
-#### 5.1.4 IE事件处理程序
-可添加多个事件处理程序,按相反的顺序触发。只有IE和opera支持。
-在DOM0级中,this为所属元素的作用域内运行;但是在使用attachEvent()方法时,事件处理程序在全局作用域中运行,即this===window!!!
-使用方法:
-绑定函数attachEvent() 和 解绑函数detachEvent() : 参数为 事件处理程序名称(如 onclick )与函数。如:
-```javascript
-btn.attachEvent("onclick",function(){} );
-```
-
-#### 5.1.5 跨浏览器
-```javascript
-var EventUtil = {
- addHandler: function(element, type, handler){
- if (element.addEventListener){ // DOM2级
- element.addEventListener(type, handler, false);
- } else if (element.attachEvent){ // IE
- element.attachEvent("on" + type, handler);
- } else { // DOM0级
- element["on" + type] = handler;
- }
- }
-}
-```
-
-### 5.2 事件对象event
-
-* DOM0级或DOM2级都会传入event对象。
-* ie访问event有几种方式,取决于指定事件处理程序的方法。
- DOM0:window.event
- attachEvent():window.event或event
-* 跨浏览器方案如下:
-``` javascript
-var EventUtil = {
- getEvent: function(event){
- return event ? event : window.event;
- }
-}
-```
-
-### 5.3 事件目标
-
-* 对象this始终等于currentTarget,而target则只包含事件的实际目标。
-例子:
-``` javascript
- document.body.onclick = function(event){
- alert(event.currentTarget === document.body); //true
- alert(this === document.body); //true
- alert(event.target === document.getElementById("myBtn")); //true
- };
-```
-* 跨浏览器解决方案如下:
-``` javascript
- var EventUtil = {
- getTarget: function(event){
- return event.target || event.srcElement;
- }
-}
-```
-
-## 6 五子棋源码以及参考
-
-在线地址: http://labs.qiang.it/qqpai/test/wcn/gobang/gobang.html
-github地址:https://github.com/Newcandy/gobang
-参考书籍:《Javascript高级程序设计》
diff --git a/source/_posts/2016-01-16-UFT.md b/source/_posts/2016-01-16-UFT.md
deleted file mode 100644
index 5dd2c1d362..0000000000
--- a/source/_posts/2016-01-16-UFT.md
+++ /dev/null
@@ -1,216 +0,0 @@
-title: UFT 需求提报平台回顾
-subtitle: 展现需求提交平台从无到有的过程,及分享实践中的经验。
-date: 2016-01-16 16:44:00
-cover: //img30.360buyimg.com/ling/jfs/t1/59147/30/2564/39781/5d07745aE941719d4/a5f3c71683743262.png
-categories: 项目总结
-tags:
- - uft
- - angular
- - kendo
- - node-mysql
- - express
-author:
- nick: 张小振
- github_name: Manjiz
----
-最初它的名字为 BugHound,主要功能是 bug 提交,EC 同学已经造出了它最初的样子,它最初的目标用户是移动用户,能在提 bug 的同时收集设备的相关信息。主要用到的技术点:
-
-- php
-- mongodb
-
-我开始熟悉原代码并尝试在此基础上进行迭代开发,但是由于功能上有较大的变更,而我没有用过 Mongodb 和 php,这时我更倾向于使用我熟悉的 MySql 和 Nodejs,在得到 EC 同学的允许后,我决定从零开始搭建系统。本文选择其中几点进行阐述。
-
-## 数据设计
-
-第一步是建表,下图是最初的表设计,基本上按照原 mongodb 中的数据关系进行定义,设计好数据表,再把它们写进**数据字典**,最后才开始建表。
-
-*(数据字典对开发和协作的作用非常大,它能让你和别人知道表中有哪些字段,某字段代表什么等信息,在接下来的编码工作中还会经常去查看它。)*
-
-
-
-随着开发的深入,数据不断拓展,有些字段被淘汰或被拆分到新表,有些字段新加进来,比如代表“文件”的数据,原来以字符串的形式写在 demand 表的 files 字段,作为经常被读写的数据,以字符串的形式保存显然不正确,我们需要把每个文件当作一个数据元,于是把 files 字段拆分成新表 demandfiles,并增加了上传人、上传时间和下载次数这些信息。
-
-为了让数据库设计更加合理,使用了外键约束,确保在删除修改数据的同时能级联删除修改,外键统一命名为 `fk_table_field` 的形式。修改后的 ER 图如下所示:
-
-
-## 技术实践
-
-1. **第一阶段**
-
- 起初,项目后端使用了 `ejs` 模板引擎,拆分头尾在后端渲染模板后发回给前端,前端用 jQuery 进行逻辑的处理。
-2. **第二阶段**
-
- 前端开始使用 Angular 替代 jQuery,但是 ejs 跟 Angular 好像有点格格不入,前者意在后端渲染数据,后者通常在前端通过 $http 获取数据来填充,这时的 ejs 的存在主要是为了组装拆分出来的头尾,不好去掉它。但是,接着发现了 `ng-include`,这让组装头尾的工作交给了前端,从而摒弃掉了 ejs。
-3. **第三阶段**
-
- 接着,切换页面的时候头部闪烁的问题引起了注意,原来是 Angular 使用方式不对,我的每个页面都是一个单独的 Angular app,每次切换页面时都引入一次头尾导致闪烁,于是引入 ui-router 把系统修改成一个单页面应用,更新 `ui-view` 即可切换页面。
-
- 这又引出了一个新的问题,所有页面的入口都是 index.html,也就是说不能再简单地在后端通过路由来控制页面的访问权限了,这样另一个概念就登场了——本地身份验证。简单点说,就是在进入应用主入口 index.html 的时候,从服务器请求身份信息,身份信息将保存在 `service` 中(类似 session storage),然后在状态(页面)切换事件 `stateChangeStart` 或 `stateChangeSuccess` 中,对页面请求进行拦截或重定向等操作。
-
- 然而,网络请求都有一定的延迟,在身份信息返回来之前,某些页面的内容不应该被呈现出来,所以要在获取到身份信息后通知到页面,于是就加进了事件广播和接收器 `$broadcast` 和 `$on`:获取到身份信息后通过 `$broadcast` 广播一个事件,在子页面中通过 `$on` 接收到该事件后执行相关逻辑。
-
-## 排期表设计
-
-1. **v1 版**
-
- **背景:**需求排期时间不能冲突,排期由排期起始和结束时间决定。
-
- 从服务器获取的源数据形式如下,已按 startDate 排好序,每个用户数据中包含排期数据(data):
-
- ```javascript
- [
- {
- erp:xx,
- name:xx,
- ... ,
- data[
- {demandID:xx, startDate:xx, endDate:xx, ...},
- {demandID:xx, startDate:xx, endDate:xx, ...},
- {demandID:xx, startDate:xx, endDate:xx, ...},
- ...
- ]
- },
- ...
- ]
- ```
- 在前端计算好周起始时间 `ws` 和周结束时间 `we`,对每条排期数据进行判断,如果排期时间跟本周的时间有交集,则计算该排期都出现在了哪几天,比如下图的情形,这里有两个排期:
-
- 
-
- 数据将会按下面的形式(blocks)附加到用户数据中,其中 [0,1,2] 和 [4,5] 的数字就分别表示了两个排期在周排期表中占据的位置。
-
- ```javascript
- [
- {
- erp:xx,
- name:xx,
- ... ,
- data[
- {demandID:xx, startDate:xx, endDate:xx, ...},
- {demandID:xx, startDate:xx, endDate:xx, ...},
- {demandID:xx, startDate:xx, endDate:xx, ...},
- ...
- ],
- blocks:[
- {
- demandID:xx,
- demandName:xx,
- dictator:xx,
- block: [0, 1, 2]
- },
- {
- demandID:xx,
- demandName:xx,
- dictator:xx,
- block: [4, 5]
- },
- ...
- ]
- },
- ...
- ]
- ```
- 接着,处理排期表中的空闲的天,给用户数据附加以下数据:
-
- ```javascript
- schedule: [
- {demandID:xxx, ...}, // blocks[0]
- {date:xxx}, //周三,时间用于点进申请页自动填好时间
- {demandID:xxx, ...}, // blocks[1]
- {date:xxx} //周六,时间用于点进申请页自动填好时间
- ]
- ```
- 然后在页面上由 `schedule` 循环输出 td,blocks[0] 和 blocks[1] 的长度就是 td 横跨的 td 个数。
-
-2. **v2 版**
-
- **背景:**v1 版的排期表设计中,由于排期的最小单位是“天”,而存在数据库中的 startDate 和 endDate 的最小单位却是毫秒,在计算上无疑增加了大量纷繁的计算,受移动组 task 系统的启发,把排期数据改为 startDate 和 days(所需天数),这样可以减少一半的计算,也更好理解。另外较大的改动,排期时间将允许有重叠(即同一天可以排多个需求)。
-
- 从服务器获取的源数据的形式不变,这次我在计算之前把时间都转化成了天(1970-01-01至今的天数)以方便计算,为了解决排期堆叠的问题,添加了两个关键的变量:
-
- ```javascript
- var weekpile = [0,0,0,0,0,0,0]; //记录排期在该天已经堆到第几层了
- var wee = [[], [], [], [], [], [], []]; //数组中的每个数组代表星期里的一天,存储由该天开始的需求,下面有详解
- ```
- weekpile 原理如下图,每个排期排在第几层由它在排期表中的第一天所在层级决定。
-
- 
-
- 层数记录附加到用户数据中,如下:
-
- ```javascript
- blocks: [
- {
- id:xx, demandID:xx, startDate:xx, days:xx, ... ,
- weekdays: [0, 1, 2],
- pilefloor: n // 所在层级
- },
- ...
- ]
- ```
- 另外,上文提到的 `wee` 变量存储的是指向 `blocks` 索引的数字,把它也附加到用户数据中。如图,外层 div 的 `margin-top` 由 `wee` 所指向的第一个排期的 `pilefloor` 决定,比如下图假设这是星期六,那么外层 div 的 `margin-top` 由 `blocks[wee[6][0]].pilefloor` 决定。
-
- 
-
- 因为已知排期的天数 n,给每个排期的宽度设置相应的 n*100% 即可。
-
- 然后在页面上由 `wee` 循环输出 td,blocks[n] 中的 weekdays 的 length 决定了排期的长度。
-
- v2 版排期表如图所示:
-
- 
-
-## 协作
-
-最初 UFT 主要由我进行开发,后来另一个同事加入开发,变成我负责 UFT 的功能开发,她负责 UFT 的 UI 优化,项目源码放到 [github](https://github.com/o2team/UFT) 上了,我们要在 github 共同进行开发,我们两人琢磨了好久,面对冲突问题时开始还采取过删除后重新拉取暴力做法,几经尝试,我们最终探索出两种较好的协作方式:
-
-1. 我们各自拉取分支修改,push 上去后发起合并请求,我负责合并分支;
-2. 在本地修改后,先从服务器上拉取更新合并:
-
- `git fetch origin master`
-
- 然后进行合并
-
- `git merge FETCH_HEAD`
-
- 一般情况下,合并会顺利进行,但难免会有冲突,一旦有冲突,就调用 mergetool 进行合并,或者直接在原文件上手动合并。最后,就是正常的提交过程了。
-
- 关于 mergetool,自从同事分享过一次,回去后自己装了 p4merge,配置如下:
-
- ```
- [diff]
- tool = p4merge
- [difftool "p4merge"]
- cmd = "p4merge $LOCAL $REMOTE"
- [merge]
- tool = p4merge
- [mergetool "p4merge"]
- cmd = "p4merge $BASE $LOCAL $REMOTE $MERGED"
- trustExitCode = true
- keepBackup = false
- ```
-
- 但是,没有冲突是调用不了 mergetool 的。
-
-## 其他
-
-1. **临时文件的处理**
-
- 临时文件指的是异步上传到 temp 文件夹的文件,用户上传文件后如果不打算进一步提交了,这些临时文件就成了“弃儿”,如果不对这些文件进行处理,temp 文件夹会越来越大。于是加进了定期任务,每隔一段时间对临时文件夹中的文件进行清理,为了防止把用户刚上传的文件清理掉了,被清理的文件的最后访问时间要在3天之前。
-
-## 总结
-
-UFT 从无到有,很多东西边学边用:第一次尝试用 Express,配设置、配路由等过程遇到不少坑;第一次用 Angular,用得并不规范,多亏涛哥从中相助,解决我不少困惑;Angular 各种各样插件的学习使用过程,就是不断试错,不断筛选满意插件的过程。
-
-除了知识上吸收,最大的收获是意识到项目规划的重要性。开始接手后就马上开始写代码,需要什么功能就写什么,以至于最后需要经常较大地改动代码,比如,列表之前用 Bootstrap-table 写,然后改成 Angular,又比如将页面合并成单页面 Angular 应用时,需要把大量的插件都换成 Angular 插件,还有项目的结构也几经变换。折腾这几番足见项目前期的规划还是非常重要且必要的。
-
-## 未来规划
-
-UFT 原来的目标是供部门内部使用,用户访问系统需要先经过内部员工帐号的身份认证过程,然而,随着内部推出了新的需求管理平台并推广到部门,UFT 被闲置,为了让 UFT 重新焕发活力,在接下来,把源码开源,并将把 UFT 改造成通用的需求管理平台。目前平台仍有不少可以优化的地方,例如:
-
-* MySql 使用上 View 和 Function 会简化很多工作
-* Models 不是真正的 MVC 中的 M,可以考虑让这部分更远离业务逻辑更接近数据
-* 需求状态的多样化,需求状态变更的系统通知(非邮件)
-* ……
-
-源码地址:[https://github.com/o2team/UFT](https://github.com/o2team/UFT)
diff --git a/source/_posts/2016-01-26-Private-CocoaPods-Specs-Repo.md b/source/_posts/2016-01-26-Private-CocoaPods-Specs-Repo.md
deleted file mode 100644
index 3cfacf9033..0000000000
--- a/source/_posts/2016-01-26-Private-CocoaPods-Specs-Repo.md
+++ /dev/null
@@ -1,296 +0,0 @@
-title: 如何创建私有 CocoaPods 仓库
-subtitle: 本文介绍如何创建私有的 CocoaPods 仓库
-cover: //img11.360buyimg.com/ling/jfs/t1/56047/33/2676/74520/5d07756cEfac0d4c6/381bd1ebdeac83f7.png
-categories: 移动开发
-tags:
- - iOS
- - CocoaPods
- - Swift
-author:
- nick: MarkLin
- github_name: marklin2012
-date: 2016-01-26 11:35:15
----
-
-### 公共 CocoaPods
-
-打开隐藏目录,可以使用命令:
-
-```
-//打开隐藏的命令:
-defaults write com.apple.finder AppleShowAllFiles -bool true
-//关闭隐藏的命令:
-defaults write com.apple.finder AppleShowAllFiles -bool false
-
-```
-
-接着需要重启一下 **Finder**, 可以按住 **option** + 右键 **Finder** 图标选择重启。然后打开隐藏目录 **.cocoapods** (这个目录在你的个人目录底下, `~/.cocoapods` 或 `/Users/[username]/.cocoapods`)
-
-
-
-
-
-
-可以看到上图, **.cocoapods** 目录下的 **repos** 其实是 **repository** (仓库)的缩写。 **repos** 中存放的时仓库的集合。这里的 **master** 就是 **CocoaPods** 官方建立的仓库,也就是我们所谓的公共库。
-
-**specs** 目录下存放的就是所有提交到 **CocoaPods** 的开源库的 **podspec** 文件的集合。
-其结构如下图所示:
-
-
-
-其组成方式:
-
-specName -- version -- specName.podspec
-
-( **master** 里现在是 **specName.podspec.json**,这个 **.json** 文件就是 **podspec** 文件加了个后缀。我们可以采用 `pod ipc spec` 这个命令来将 **spec** 文件转换成 **.json**)
-
-那这个文件夹是如何来得呢?其实,这个文件夹是在你安装了 **CocoaPods** 后,第一次执行 `pod install` 时, **CocoaPods** 通过命令 `pod setup` 来建立的(这条命令会自动执行)。
-
-> 上述是官方的 **repo** ,私有库的话可以看下我们前面的翻译或者查看[官方文档](https://guides.cocoapods.org/making/private-cocoapods.html),但是官方文档有一些过程写的不是特别详细,自己实现的时候遇到了一些坑,特此梳理一下过程,按照官方文档内容实现一个私有的 **spec repo** 。根据官方的原理,我们只需要创建一个和 **master** 相类似结构的目录就可以实现私有的 **spec repo**,当然你可以 **fork** 一个官方的 **repo**,但是它包含了太多没有必要地库在里面,这在编译仓库的时候需要浪费大量的时间,所以我们只要自己重新创建一个就可以了。
-
-### 1.创建一个私有的 **Spec Repo**
-
-在你的 git 服务器上创建一个 **repo**。这里你可以在 **github** 或者你自己的 git 服务器上实现。公司内部使用的话这里推荐大家使用私有的仓库,但是 **github** 的私有仓库是要收费的 **$7/month** (壕请无视 - -!)。大部分公司都是有自己的git服务器,不过一般只能在公司内网使用,或者可以选择[Gitlab](https://gitlab.com),[Coding](https://coding.net), [Bitbucket](https://bitbucket.org/)任意一种。我们以在 **github** 上创建为例:
-
-
-
-如图所示,我们在 **github** 上创建一个空的仓库,命名为 **O2Specs** ,这个仓库是用来存放我们自己所有的私有库的 **spec** 文件,就如同官方的 [**https://github.com/CocoaPods/Specs**](https://github.com/CocoaPods/Specs) 是用来存放所有官方的 **specs** 文件一样。
-
-然后我们就可以执行:
-
-```bash
-pod repo add REPO_NAME SOURCE_URL
-```
-
-其中的 REPO_NAME 是我们要添加的私有 **repo** 的名称(这里我们待会填的是: **O2Specs**),后面是仓库的 git 地址。这里做的其实是创建的工作,也就是在 `~/.cocoapods/repo` 目录下添加了一个以你的私有 **repo** 为名的文件夹,但是并没有添加 **spec** 文件。
-
-在终端执行命令:
-```bash
-pod repo add O2Specs https://github.com/marklin2012/O2Specs.git
-```
-
- 这里用的是 **https** 地址,当然你也可以用 **git** 地址,不过这样有可能失败。如果失败,很大因素是你 **github** 的 **ssh** 在本地没有配置好,配置方法可以看这里:[**Generating SSH keys**](https://help.github.com/articles/generating-ssh-keys/),成功后可以看得到 **.cocoapods** 目录如下图所示:
-
-
-
-至此,我们已经在本地得到我们自己的私有仓库 **O2Specs** ,这是一个空的仓库。
-
-### 2.添加私有的 **Repo** 安装到你的 **CocoaPods** 中
-
-这个步骤需要我们事先完成 **CocoaPods** 依赖库的搭建,具体可以查看我们另外一篇教程:[制作 **CocoaPods** 依赖库](http://www.jianshu.com/p/7a82e977281c)。如果这里你想先看看效果,也可以直接从 **github** 上 clone [示例工程](https://github.com/marklin2012/O2View)继续下面的操作。
-
-让我们进入到上面 clone 的示例工程目录中(或者你自己搭建的依赖库目录中):
-
-
-
-打开工程的 **podspec** 文件:
-
-```ruby
-Pod::Spec.new do |s|
- s.name = "O2View" #名称
- s.version = "0.0.1" #版本号
- s.summary = "Just testing" #简短介绍
- s.description = <<-DESC
- 私有Pods测试
- * Markdown 格式
- DESC
-
- s.homepage = "http://aotu.io/"
- # s.screenshots = "www.example.com/screenshots_1.gif"
- s.license = "MIT" #开源协议
- s.author = { "linyi31" => "linyi@jd.com" }
-
- s.source = { :git => "https://github.com/marklin2012/O2View.git" }
- ## 这里不支持ssh的地址,只支持HTTP和HTTPS,最好使用HTTPS
- ## 正常情况下我们会使用稳定的tag版本来访问,如果是在开发测试的时候,不需要发布release版本,直接指向git地址使用
- ## 待测试通过完成后我们再发布指定release版本,使用如下方式
- #s.source = { :git => "http://EXAMPLE/O2View.git", :tag => s.version }
-
- s.platform = :ios, "9.0" #支持的平台及版本,这里我们呢用swift,直接上9.0
- s.requires_arc = true #是否使用ARC
-
- s.source_files = "O2View/*.swift" #OC可以使用类似这样"Classes/**/*.{h,m}"
-
- s.frameworks = 'UIKit', 'QuartzCore', 'Foundation' #所需的framework,多个用逗号隔开
- s.module_name = 'O2View' #模块名称
-
- # s.dependency "JSONKit", "~> 1.4" #依赖关系,该项目所依赖的其他库,如果有多个可以写多个 s.dependency
-
-end
-```
-这个文件本质上是一个 **ruby** 文件,这是我们事先已经实现好的依赖库的 **podspec** 文件,如果前面步骤都正常的话,也就是说我们认为这个 **podspec** 是合法的话,就可以直接将这些内容 **push** 到我们本地的 **repo** 中。为了避免错误,我们可以再验证一下,命令行输入:
-
-```bash
-pod lib lint
-```
-运行之后可能会得到下面的警告:
-
-```
- -> O2View (0.0.1)
- - WARN | source: Git sources should specify a tag.
-
-[!] O2View did not pass validation, due to 1 warning (but you can use `--allow-warnings` to ignore it) and All results apply only to public specs, but you can use `--private` to ignore them if linting the specification for a private pod..
-You can use the `--no-clean` option to inspect any issue.
-```
-由于我们的示例工程还没有生成正式的 **release** 版本, **github** 上并没有任何 **tag**,所以我们刚才填写 **.podspec** 文件填写 **git** 地址的时候没有填写指定 **tag** (上面文件的注释中有提到),解决方法我们可以先执行忽略警告的命令:
-
-```bash
-pod lib lint --allow-warnings
-```
-
-如果成功会出现如下输出:
-
-```
- -> O2View (0.0.1)
- - WARN | source: Git sources should specify a tag.
-
-O2View passed validation.
-```
-
-到此,我们的 **O2View.podspec** 就符合规范了。
-
-### 3.添加你的 **Podspec** 到你的 **repo**
-
-在前面验证通过的基础上,我们接着执行命令:
-
-```bash
-pod repo push O2Specs O2View.podspec
-```
-
-执行完,如果失败会有相对应的警告和错误提示,只要按照警告和错误的详细信息进行修改和完善即可。成功的情况应该可以在终端看到类似的输出:
-
-```
-Validating spec
- -> O2View (0.0.1)
- - WARN | source: Git sources should specify a tag.
-
-Updating the `O2Specs' repo
-
-Already up-to-date.
-
-Adding the spec to the `O2Specs' repo
-
- - [Add] O2View (0.0.1)
-
-Pushing the `O2Specs' repo
-
-To https://github.com/marklin2012/O2Specs.git
- 9f32092..8d0ced5 master -> master
-```
-
-再进入到 **.cocoapods** 的目录中,可以看到已经发生了变化:
-
-
-
-同时,我们还发现 **O2Specs** 的 **github** 仓库也已经发生了变化:
-
-
-
-按照平时使用 **CocoaPods** 的习惯,我们添加依赖库之前会先搜索一下库,让我们执行一下命令:
-
-```bash
-pod search O2View
-```
-
-哈哈,可以看到已经建立成功了!
-
-```
--> O2View (0.0.1)
- Just testing
- pod 'O2View', '~> 0.0.1'
- - Homepage: http://aotu.io/
- - Source: https://github.com/marklin2012/O2View.git
- - Versions: 0.0.1 [O2Specs repo]
-```
-
-### 4.测试私有 pod
-
-看到前面的搜索结果,小伙伴们是不是开始有点激动了?让我们建立一个普通的工程,命名为 **TestPodDemo**,然后在终端 **cd** 到其目录路径下,添加一个 **Podfile** 文件:
-
-```bash
-pod init
-```
-
-建立后修改 **Podfile** 文件内容如下:
-
-```
-use_frameworks!
-
-target 'TestPodDemo' do
-
-pod ‘O2View’
-
-end
-```
-
-执行:
-
-```bash
-pod install
-```
-
-我们得到如下提示:
-
-```
-Updating local specs repositories
-Analyzing dependencies
-[!] Unable to find a specification for `O2View`
-
-[!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.
-```
-找不到 **O2View** ? 额- -!。。。刚才 **search** 明明可以找到这个依赖库的,为什么现在找不到了呢?
-
-别着急!其实原因是你在 **Podfile** 中没有指定路径,当你执行 `pod install` 的时候,**CocoaPods** 默认只会在 **master** 下搜索,而我们的 **spec** 是存在我们私有的 **O2Specs** 目录下的。所以解决方式很简单,就是引入搜索地址即可,在 **Podfile** 的顶部添加如下两行代码:
-
-```
-source 'https://github.com/CocoaPods/Specs.git' #官方仓库地址
-source ‘https://github.com/marklin2012/O2Specs.git’ #私有仓库地址
-```
-
-这里必须添加两个地址,默认情况下,你如果不添加 **source** ,系统会默认使用官方仓库地址,但是当你添加了 **source** 之后,系统就不会自动搜索官方地址,所以这两句都必须添加,否则其他基于官方的依赖库都不能使用了。
-
-再次执行 `pod install` ,我们就可以看到很顺利的安装成功了:
-
-```
-Updating local specs repositories
-Analyzing dependencies
-Downloading dependencies
-Using O2View (0.0.1)
-Generating Pods project
-Integrating client project
-Sending stats
-Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
-```
-恭喜!这样一来我们就可以使用这个私有库了!
-
-### 发布稳定的依赖库版本
-
-前面我们提到过,我们的这个实例依赖库 **O2View** 没有生成稳定的 **release** 版本。当我们调试完内容之后,一般都是要发布稳定版本的,更新之后再继续发布新版本。我们可以使用命令行或者在 **github** 页面手动生成,这里为了方便我们使用命令行,首先在终端中 **cd** 到之前的依赖库 **O2View** 的目录中,然后输入如下命令:
-
-```
-git tag '0.0.1'
-git push --tags
-git push origin master
-```
-这样我们就得到了一个稳定的 **release** 版本 **0.0.1**:
-
-
-
-> 这里我用的版本号是 **0.0.1** 基于研发版本,关于版本号的一些规范可以参考:[语义化版本 2.0.0](http://semver.org/lang/zh-CN/)
-
-对于我们的 **podspec** 文件,我们也需要将 `s.source` 做一下小小的改动:
-
-```
-s.source = { :git => "https://github.com/marklin2012/O2View.git", :tag => version }
-
-```
-
-这样我们使用这个依赖库的时候就能对应上版本号,并且知道在 **github** 中使用稳定的 **release** 版本代码。太棒了!
-
-最后只需要再重复 `push` 一下我们的 **Podfile** 就可以!
-
-### 接下来做什么?
-
-好了,到这里我们已经完全掌握如何创建一个本地私有的 **CocoaPods** 了!我们完全可以把我们项目中得代码拆出来封装成一些 **pods**, 好好使用这个黑魔法!
-
-祝大家玩得愉快!
diff --git a/source/_posts/2016-01-27-how-to-make-cocoapods.md b/source/_posts/2016-01-27-how-to-make-cocoapods.md
deleted file mode 100644
index 2ab9fbdda1..0000000000
--- a/source/_posts/2016-01-27-how-to-make-cocoapods.md
+++ /dev/null
@@ -1,205 +0,0 @@
-title: 如何制作cocoaPods依赖库
-subtitle: 本文介绍如何制作cocoaPods依赖库
-cover: //img13.360buyimg.com/ling/jfs/t1/54904/26/2664/29459/5d084b01E67d36bf9/59effde2bf59a4f7.png
-date: 2016-01-27 19:40:49
-categories: 移动开发
-tags:
- - iOS
- - CocoaPods
-author:
- nick: MarkLin
- github_name: marklin2012
-
----
-
-学会使用别人的 **Pods** 依赖库以后, 你一定对创建自己的依赖库很有兴趣吧,现在我们就来尝试一下,以一个简单 **O2View** 为例自己创建一个 **Pods** 依赖库,这里我会使用 **Swift 2.0** 来写这个例子。
-
-
-
-### 1.创建自己的 **github** 仓库
-
-[**CocoaPods**](https://github.com/CocoaPods) 是托管在 **github** 上的,所有的 **Pods** 也都是托管在 **github** 上,因此我们首先需要创建一个属于自己的 github 仓库,如下图所示:
-
-
-
-上图中标识出了6处地方
-
-1. **Repository name:** 仓库名称,这里写上我们的依赖库名字 **O2View** ,必填。
-2. **Description:** 仓库的描述信息,可选。
-3. **Public or Private:** 仓库的公开性,开源的话选 **Public** 。 如果是公司内部使用的话这里推荐大家使用私有的仓库,但是 **github** 的私有仓库是要收费的 **$7/month** (壕请无视 - -!)。大部分公司都是有自己的git服务器,不过一般只能在公司内网使用,或者可以选择[Gitlab](https://gitlab.com),[Coding](https://coding.net), [Bitbucket](https://bitbucket.org/)任意一种。
-4. **Initialize:** 是否默认创建一个 **README** 文档,一个完整的库都会有这个说明文档,这里最好勾选一下。不过如果忘记的话也不要紧,后面手动创建也是可以的。
-5. **.gitignore:** 忽略项文件,记录一些想忽略的文件类型,凡是该文件包含的文件类型, git 都不会将其纳入到版本管理中。看需要选择就行。
-6. **license:** 正规的仓库都有一个 **license** 文件, **Pods** 依赖库对这个文件要求比较严格,需要有这个文件。这里最好让 **github** 自动创建一个,不过后续手动创建也行。我们这次先使用 **MIT** 类型的 **license**。
-
-上面各项根据大家需要填写完毕后,点击 **Create repository** 按钮即可,创建成功后如下所示:
-
-
-
-### 2.clone 仓库到本地
-为了方便向仓库中删减内容,需要将仓库 **clone** 到本地,这里有多种操作方式,可以选择你喜欢的一种,但是为了方便这边选择使用命令行。首先需要切换到你想在本地存储的目录,然后再 **clone** ,假设你放在用户的根目录上:
-
-``` bash
-cd ~
-git clone https://github.com/marklin2012/O2View.git
-```
-完成后,我们进入到 `~/O2View` 目录中应该可以看到目录结构如下:
-
-```
-|____LICENSE
-|____README.md
-
-```
-
-其实还有一个隐藏的 **.git** 文件,后续我们的所有文件都在这个目录底下进行。
-
-### 3.向本地仓库中添加创建 Pods 依赖库所需的文件
-
-#### 1)主类文件
-
-创建 **Pods** 依赖库就是为了方便别人使用我们的成果,比如我想共享给大家的O2View类,那这个类自然必不可少,我们把这个类放入一个 **O2View** 的目录中:
-
-
-
-顺便看看 **O2View.swift** 主要内容:
-
-```swift
-import UIKit
-
-public class O2View: UIView {
-
- public override init(frame: CGRect) {
- super.init(frame: frame)
- backgroundColor = UIColor.redColor()
- }
-
- required public init?(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
-}
-```
-
-#### 2).podspec 文件
-
-每个 **Pods** 依赖库必须有且仅有一个名称和依赖库名保持一致,后缀名为 **.podspec** 的描述文件。这里我们依赖库的描述文件名称应该为 `O2View.podspec`。
-
-创建这个文件有两种途径:
-
-1. 复制已有的 **podspec** 文件然后修改对应的参数。
-2. 执行命令行创建。
-
-我们使用命令行:
-
-```bash
-pod spec create O2View
-```
-创建出 **O2View.podspec** 文件后,我们打开可以发现,该文件是 **ruby** 文件,里面有很多的内容,但是大多数都是我们不需要的,所以我们只需要根据项目的情况保留关键的一些内容就行:
-
-```ruby
-Pod::Spec.new do |s|
- s.name = "O2View" #名称
- s.version = "0.0.1" #版本号
- s.summary = "Just testing" #简短介绍
- s.description = <<-DESC
- 私有Pods测试
- * Markdown 格式
- DESC
-
- s.homepage = "http://aoto.io/"
- # s.screenshots = "www.example.com/screenshots_1.gif"
- s.license = "MIT" #开源协议
- s.author = { "linyi31" => "linyi@jd.com" }
-
- s.source = { :git => "https://github.com/marklin2012/O2View.git" }
- ## 这里不支持ssh的地址,只支持HTTP和HTTPS,最好使用HTTPS
- ## 正常情况下我们会使用稳定的tag版本来访问,如果是在开发测试的时候,不需要发布release版本,直接指向git地址使用
- ## 待测试通过完成后我们再发布指定release版本,使用如下方式
- #s.source = { :git => "http://EXAMPLE/O2View.git", :tag => version }
-
- s.platform = :ios, "9.0" #支持的平台及版本,这里我们呢用swift,直接上9.0
- s.requires_arc = true #是否使用ARC
-
- s.source_files = "O2View/*.swift" #OC可以使用类似这样"Classes/**/*.{h,m}"
-
- s.frameworks = 'UIKit', 'QuartzCore', 'Foundation' #所需的framework,多个用逗号隔开
- s.module_name = 'O2View' #模块名称
-
- # s.dependency "JSONKit", "~> 1.4" #依赖关系,该项目所依赖的其他库,如果有多个可以写多个 s.dependency
-
-end
-```
-
-#### 3)Demo 工程
-
-为了快速教会别人使用我们的 **Pods** 依赖库,通常需要提供一个 demo 工程。我们创建了一个名为 **O2ViewDemo** 的工程来演示 **O2View** 的使用,如下图所示:
-
-
-
-
-
-#### 4)README.md
-
-使用 **github** 的人应该都熟悉这个文件,它使一个成功的 **github** 仓库必不可少的一部分,使用 **markdown** 对仓库进行详细说明。
-
-#### 5)LICENSE 文件
-
-**CocoaPods** 强制要求所有的 **Pods** 依赖库都必须有 **license** 文件,否则验证不会通过。 **license** 文件有很多中,详情可以参考 [tldrlegal](https://tldrlegal.com/)。前面我们已经选择创建了一个 **MIT** 类型的 **license**。
-
-以上的5个文件是创建 **Pods** 依赖库所需的基础文件,当然 **Demo** 工程没有添加也没关系。添加完这些内容后,我们本地仓库目录就变成这个样子:
-
-
-
-### 4.提交修改到 **github**
-
-经过前面步骤,我们已将在本地的 **git** 仓库添加了不少文件,现在我们只要将他们提交到 **github** 上就可以。在此之前我们需要对刚才添加的 **pod** 进行一下验证:
-
-```
-pod lib lint
-```
-运行之后可能会得到下面的警告:
-
-```
- -> O2View (0.0.1)
- - WARN | source: Git sources should specify a tag.
-
-[!] O2View did not pass validation, due to 1 warning (but you can use `--allow-warnings` to ignore it) and All results apply only to public specs, but you can use `--private` to ignore them if linting the specification for a private pod..
-You can use the `--no-clean` option to inspect any issue.
-```
-由于我们现在还没有正式生成 **release** 版本, **github** 上并没有任何 **tag**,所以我们刚才填写 **.podspec** 文件填写 **git** 地址的时候没有填写指定 **tag** (上面文件的注释中有提到),解决方法我们可以先执行忽略警告的命令:
-
-```bash
-pod lib lint --allow-warnings
-```
-
-如果成功会出现如下输出:
-
-```
- -> O2View (0.0.1)
- - WARN | source: Git sources should specify a tag.
-
-O2View passed validation.
-```
-> 当调试完成了之后,我们需要在 **github** 上把我们的代码生成相应稳定的 **release** 版本,到时候我们再回来添加指定 **tag** 发布就 Ok 了。
-
-验证成功之后,我们只要把代码提交到 **github** 仓库,就可以了,参考命令:
-
-```bash
-git add -A && git commit -m "add pod files"
-
-git push origin master
-```
-这里主要是 **git** 的范畴,不做过多叙述。如果前面操作都没有问题的话,**github** 上应该能看到类似如下内容:
-
-
-
-### 5.接下来做什么?
-
-经过前面的步骤,我们的 **CocoaPods** 依赖库就已经准备好了,但是现在你还不能在你的工程中使用它。如果你想成为一个真正可用的依赖库,还需要最后一步操作:将刚才生产的 **podspec** 文件提交到 [官方的 **CocoaPods Specs** ](https://github.com/CocoaPods/Specs)中。
-
-没错,我们平时用的能用 `pod search` 搜到的依赖库都会把它上传到这个仓库中, 也就是说只有将我们的 **podspec** 文件上传到这里,才能成为一个真正的依赖库,别人才能用!
-
-按照 **github** 的规则,要想向别人的库中添加文件,就要先 **fork** 别人的仓库,做相应的修改,再 **pullrequest** 给仓库的原作者,等到作者审核通过,进行 **meger** 之后就可以了!
-
-流程大概就是这个样子,具体可以参考:[CocoaPods Guides](https://guides.cocoapods.org/),我们就先不展开详细的叙述了(后面会添加关于这部分的文章)。
-
-除了官方的 **specs** 之外,我们还可以把 **podspec** 文件提交到私有的仓库中,详见我们博客的另一篇文章:[创建私有的 **CocoaPods repo spec**](http://www.jianshu.com/p/ddc2490bff9f) 。
diff --git a/source/_posts/2016-01-28-3xx-of-http-status.md b/source/_posts/2016-01-28-3xx-of-http-status.md
deleted file mode 100644
index d46a009818..0000000000
--- a/source/_posts/2016-01-28-3xx-of-http-status.md
+++ /dev/null
@@ -1,103 +0,0 @@
-title: 你所知道的3xx状态码
-subtitle: 介绍了3xx系列状态码,以及缓存、网页劫持一些列相关的知识。
-date: 2016-01-28 20:20:00
-cover: //img11.360buyimg.com/ling/jfs/t1/70856/35/2143/15956/5d077c58E9ac45d16/386d94e70935bcb9.png
-categories: Web开发
-tags:
- - http
- - 重定向
- - 缓存
-author:
- nick: WEN
- github_name: wengeek
----
-众所周知,我们都知道300-399这一系列的状态码代表的是重定向状态码。重定向状态码要么告知客户端使用替代位置来访问她们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容。如果资源已被移动,可发送一个重定向状态码和一个可选的Location首部来告知客户端已被移走,以及现在可以在哪里找到它。这样子,浏览器就可以在不打扰用户的情况下,透明地转到新的位置。
-
-那么,接下来,我们从状态码出发,梳理一下3xx状态码(300-307),以及缓存一系列相关的东西。(注:HTTP/1.1版本的内容)
-
-#### 300 Multiple Choices
-
-客户端请求一个实际指向多个资源的URL时会返回这个状态码。
-
-比如说,一个站点提供了中文和英文两个版本,理想情况下,服务器应当向中文用户发送中文版,向英文用户发送英文版。HTTP提供了内容协商方法,允许客户端和服务器作这样的决定。内容协商包含客户端驱动的协商、服务器驱动的协商以及透明协商。
-
-客户端驱动由客户端发起请求,服务器发送可选项的列表,客户端进行选择;服务器驱动是由服务器来检查客户端的请求首部集并决定提供提供哪个版本的页面(q值机制,Vary首部);透明协商是由某个中间设备(通常是缓存代理)代表客户端进行请求协商。
-
-而300 Multiple Choices属于客户端驱动的协商。服务器发送回HTTP/1.1响应时,使用300 Multiple Choices响应代码。客户端浏览器收到这种响应时,可能会弹出对话窗口,让用户选择。
-
-
-#### 301 Moved Permanently
-
-在请求的URL已被移除时使用。响应的Location首部中应该包含资源现在所处的URL。
-
-301重定向是网页更改网址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。比如说,我们将网页a的地址更改为b,采用301重定向,搜索引擎可以肯定网页a永久性改变网址,搜索引擎就会把网页b当做唯一有效目标,同时,网页a积累的页面权重将被传到网页b。(注:传递权重不同的搜索引擎不一样,Google会传递大部分权重,但不是百分之百权重)
-
-#### 302 Found
-
-与301状态码类似,但是客户端应该使用Location首部给出的URL来临时定位资源,将来的请求仍应使用老的URL。
-
-一般302重定向是在一个网站或网页在短时间内临时移到其它位置的情况下使用,这时候就是做临时性的跳转了。
-
-但是302跟网址“劫持”有着莫大的关系。大部分搜索引擎在大部分情况下,当收到302重定向时,一般只要去抓取目标网址即可。但是有时候搜索引擎(以Google为例)并不能总是抓取目标网址,比如说a网址很短,但是它做了302重定向到b网址,而b网址是一个很长的乱七八糟的URL网址,这时候Google很有可能仍显示网址a,这时候就造成了网址劫持的可能性。如果一个居心叵测的人将一个网址a通过302重定向到你的网址b,而Google搜索结果仍然是A,这种情况就是网址劫持。同时,还容易导致网站被降权,所以尽量不用。
-
-#### 303 See Other
-
-用来告知客户端应该使用另一个URL来获取资源,新的URL位于响应报文的Location首部。
-
-303主要目的是允许POST请求的响应将客户端定位到某个资源上。比如说,在文件上传完成后让客户端自动重定向到一个上传成功的结果页面。
-
-#### 304 Not Modified
-
-如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器返回304状态码。304响应不包含消息体,因此以消息头后的第一个空行结尾。
-
-在一条HTTP GET请求中,大致是如下的一个过程
-
-
-
-在查看本地副本是否过期时,通过检查Cache-Control或者Expires首部即可获知。HTTP通过Cache-Control首部和Expires首部向每个文档附加了一个“过期日期”,在缓存文档过期之前,缓存可以以任何频率使用这些副本,而无需与服务器联系。
-
-Expires首部是HTTP/1.0定义的字段,指定的是一个绝对的过期日期。而Cache-Control是HTTP/1.1定义的字段,max-age值定义了文档的最大使用值,是相对时间。因为绝对时间需要依赖于计算机时钟的正确设置,容易存在误差。所以,我们更倾向于使用比较新的Cache-Control首部。当同时存在Expires和Cache-Control:max-age字段时,Cache-Control:max-age字段会覆盖Expires字段。同时存在这两个字段还有一个好处,就是可以兼容HTTP/1.0。
-
-本地缓存过期了并不意味着它和原始服务器上目前处于活跃状态的文档有实际的区别,这时候缓存需要询问原始服务器文档是否发生了改变,跟原始服务器做一次 **新鲜度校验**。
-
-HTTP条件方法可以高效地实现再验证。通过If-Modified-Since或者If-None-Match首部来校验。
-
-**If-Modified-Since:Date再验证**:If-Modified-Since首部可以和Last-Modified服务器响应首部配合工作。原始服务器会将最后的修改日期附加到所提供的文档上去。
-
-**If-None-Match: 实体标签再验证**:有些文档可能被被周期性的重写、有些文档可能被修改了但所做修改不重要等等这类情况下,使用最后修改日期进行再验证是不够的,这时候HTTP允许用户对被称为实体标签ETag的“版本标识符”进行比较。
-
-实体标签和最近修改日期都是缓存验证器,如果服务器回送了一个实体标签,HTTP/1.1客户端就必须使用实体标签验证器。如果只返回了一个Last-Modified值,客户端就可以使用If-Modified-Since验证。如果实体标签和最后修改日期都提供了,客户端就应该使用这两种再验证方案,这样HTTP/1.0和HTTP/1.1缓存就都可以正确响应了。如果HTTP/1.1服务器收到的请求既带有If-Modified-Since,又带有ETag条件首部,那么需要这两个条件都满足时,才能返回304 Not Modified响应。
-
-#### 305 Use Proxy
-
-用来说明必须通过一个代理来访问资源,代理的位置由Location首部给出。
-
-客户端是相对某个特定资源来解析这条响应的,不能假定所有请求,甚至所有对特有所请求资源的服务器的请求都通过这个代理进行。如果客户端错误地让代理介入了某条请求,可能会引发破坏性行为,而且会造成安全漏洞。所以,305这个状态码也较少使用。
-
-#### 306 unused
-
-在HTTP1.1废弃掉了,不再使用,并且此状态码被保留。在HTTP1.1以前的版本中,306 Switch Proxy用于表示随后的请求应该使用指定的代理。
-
-#### 307 Temporary Redirect
-
-请求的资源临时从不同的URI响应请求,客户端应该使用Location首部给出的URL来临时定位资源。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
-
-除非是一个HEAD请求,否则307响应的实体中应当包含指向新的URL的超链接及简短说明。因为部分浏览器不能识别307响应,添加URL超链接以便不能处理307状态码的用户有能力在新URL中发起重定向请求,也就是说,把重定向的页面展示给用户,让用户去点重定向URL链接。
-
-
-
-我们可以看到Chrome对于hsts列表的域名,采用了307进行重定向。
-
-以上内容讲述了301-307的状态码,对于这些状态码以及一些缓存的首部可能还有一些疑惑,以下简单地列出了几点。
-
-#### 1、从上面的状态码中,你可能注意到302、303和307状态码之间存在一些交叉,那么,它们之间存在哪些细微差别?
-
-303和307是HTTP/1.1新增加的状态码,它们是对HTTP1.0中的302状态码的细化。当HTTP/1.0客户端发起一个POST请求,并在响应中收到302重定向状态码时,它会接受Location首部的重定向URL,并向那个URL发起一个GET请求。透过以上的状态码介绍,我们可以发现HTTP/1.1规范使用303状态码来实现同样的行为。为了避开这个问题,对于HTTP/1.1客户端,用307状态码来代替302状态码进行临时重定向。
-
-在HTTP/1.1中,302理论上是可以被303和307代替掉的,但为了兼容HTTP/1.0,依然还在广泛使用。
-
-#### 2、经常可以看到 ***Cache-Control: no-cache*** 这样的首部,那么代表的是不缓存么?
-
-Cache-Control: no-cache 响应实际上是可以存储到本地缓存区中的,只是在与服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用。
-
-如果需要本地彻底不缓存,需要使用Cache-Control: no-store,表示缓存应该尽快从存储器中删除文档的所有痕迹。
diff --git a/source/_posts/2016-02-19-ngrok.md b/source/_posts/2016-02-19-ngrok.md
deleted file mode 100644
index a9930b5505..0000000000
--- a/source/_posts/2016-02-19-ngrok.md
+++ /dev/null
@@ -1,276 +0,0 @@
-title: 手把手教你搭建ngrok服务-轻松外网调试本机站点
-subtitle: "ngrok的核心功能:能够将你本机的HTTP服务(站点)或TCP服务,通过部署有ngrok服务的外网伺服器暴露给外网访问!"
-cover: //img12.360buyimg.com/ling/jfs/t1/58929/24/2535/40665/5d077c39Ebcd1eb57/8855058096a40d86.jpg
-date: 2016-02-19 17:55:35
-categories: Web开发
-tags:
- - ngrok
- - 反向代理
- - 调试
-author:
- nick: LV主唱大人
- github_name: mamboer
----
-
-半年多没用ngrok,然后昨天发现它被墙了,艸~。
-
-
-
-## ngrok是什么鬼?
-
-做前端开发的童鞋或许不会太陌生。
-如果你完全不知道它是什么东西,可以在它的github项目上了解下:https://github.com/inconshreveable/ngrok
-这里只提下它的核心功能:能够将你本机的HTTP服务(站点)或TCP服务,通过部署有ngrok服务的外网伺服器暴露给外网访问!
-
-如上封面图所示,举一个栗子。
-
-1. 橘色屏幕的笔记本是你的工作机器,安装了ngrok客户端
-2. ngrok.com所在的服务器安装了ngrok的服务端(ngrokd)
-3. 利用ngrok 8080命令可以将你本机的8080端口暴露给反向代理至ngrok.com的某个二级域名如:xxx.ngrok.com
-4. 别人通过xxx.ngrok.com就可以访问你本机8080端口上的站点内容了。
-
-由此可见,除了Weinre、browsersync 这些惯用的手段外,借助ngrok,也一样可以解决前端开发过程经常遇到的“本地开发,外网调试”老大难题。
-
-囧的是:ngrok.com被墙了,我们已无法用它官方的服务~
-国内虽然有一些第三方的ngrok服务,但是也无法保证其稳定性。
-还好ngrok是开源的,我们可以通过它的源码在自己的外网服务器上搭建自己的ngrok服务。
-
-前提条件是:一台外网可访问的主机,且有域名解析至该主机上。
-
-## 搭建服务端ngrokd
-
-### 1.安装go语言开发环境
-
-ngrok是利用go语言开发的,所以先要在服务器上安装go语言开发环境。
-以CentOS的服务器示例,安装Go语言很简单的:
-
-```bash
-sudo yum install golang
-```
-
-安装完毕后,利用go version来验证是否安装成功。
-go安装好后,我们再设置下go的环境变量:
-
-在`~/.zshrc`或`~/.bash_profile`文件内,加入以下环境变量配置内容:
-
-```bash
-export GOPATH=$HOME/go
-PATH=$PATH:$HOME/.local/bin:$HOME/bin:$GOPATH/bin
-```
-
-保存后,重新给shell加载下配置文件:`source ~/.zshrc`
-
-最后可通过go env查看是否配置成功。
-
-### 2.安装git
-
-安装过程略。后面我们需要利用git拉取源码。
-
-### 3.fork并拉取ngrok的源码
-
-下面编译过程需要改官方的部分源码,所以最好fork一份源码至自己的github账户。
-
-```bash
-$ mkdir -p ~/go/src/github.com/mamboer
-$ cd ~/go/src/github.com/mamboer
-$ git clone https://github.com/mamboer/ngrok.git
-```
-
-源码拉取下来后,需要修改一个地方:
-打开`src/ngrok/log/logger.go`文件
-将`code.google.com/p/log4go` 修改为:`github.com/alecthomas/log4go`
-
-googlecode已经寿终了,我们将依赖的log4go替换成github的版本。
-
-在编译ngrok的源码之前,我们还需要改下官方源码用到的签名证书。
-
-### 4.生成自签名证书
-
-使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,如果不想买SSL证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。
-
-证书生成过程需要一个NGROK_BASE_DOMAIN。 以ngrok官方随机生成的地址693c358d.ngrok.com为例,其NGROK_BASE_DOMAIN就是"ngrok.com",如果你要 提供服务的地址为"example.ngrok.xxx.com",那NGROK_BASE_DOMAIN就应该 是”ngrok.xxx.com"。
-
-我们这里以NGROK_BASE_DOMAIN=“ngrok.fex.im"为例,生成证书的命令如下:
-
-```bash
-$ cd ngrok
-$ openssl genrsa -out rootCA.key 2048
-$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.fex.im" -days 5000 -out rootCA.pem
-$ openssl genrsa -out device.key 2048
-$ openssl req -new -key device.key -subj "/CN=ngrok.fex.im" -out device.csr
-$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
-```
-执行完以上命令,在ngrok目录下就会新生成6个文件:
-
-```
--rw-rw-r-- 1 lv lv 985 Feb 17 19:04 device.crt
--rw-rw-r-- 1 lv lv 895 Feb 17 19:04 device.csr
--rw-rw-r-- 1 lv lv 1679 Feb 17 19:03 device.key
--rw-rw-r-- 1 lv lv 1675 Feb 17 19:01 rootCA.key
--rw-rw-r-- 1 lv lv 1103 Feb 17 19:03 rootCA.pem
--rw-rw-r-- 1 lv lv 17 Feb 17 19:04 rootCA.srl
-```
-
-ngrok通过bindata将ngrok源码目录下的assets目录(资源文件)打包到可执行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分别存放着用于ngrok和ngrokd的默认证书文件,我们需要将它们替换成我们自己生成的:(因此这一步务必放在编译可执行文件之前)
-
-```bash
-cp rootCA.pem assets/client/tls/ngrokroot.crt
-cp device.crt assets/server/tls/snakeoil.crt
-cp device.key assets/server/tls/snakeoil.key
-```
-
-### 5.编译客户端程序ngrok和服务端程序ngrokd
-
-在ngrok目录下执行如下命令,编译ngrokd:
-
-```bash
-$ make release-server
-```
-类似的,利用以下命令编译ngrok:
-
-```bash
-$ make release-client
-```
-
-成功编译后,会在bin目录下找到`ngrokd`和`ngrok`这两个文件。
-
-我们将ngrokd文件拷贝至`~/go/bin`目录下,以方便在其他目录内也可以直接通过ngrokd来访问该执行程序。
-
-### 6.运行ngrokd服务
-
-```bash
-ngrokd -domain="ngrok.fex.im" -httpAddr=":8088" -httpsAddr=":8089"
-[15:08:52 CST 2016/02/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
-[15:08:52 CST 2016/02/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
-[15:08:52 CST 2016/02/18] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8088
-[15:08:52 CST 2016/02/18] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:8089
-[15:08:52 CST 2016/02/18] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
-```
-
-### 7.为ngrok.fex.im添加dns解析
-
-添加两条A记录:`ngrok.fex.im`和`*.ngrok.fex.im`,指向fex.im所在的服务器ip。
-
-至此为止,我们的ngrokd服务端搭建配置完成,同时我们在CentOS系统的服务器上编译了一份客户端的执行程序-一个ngrok文件。
-如果你的开发机器系统也是CentOS,是可以直接将ngrok这个客户端执行文件拷贝到本地开发机器中来使用的。
-但如果你的机器是Mac 或者windows,我们还需要在自己的电脑中编译一份相同签名文件的客户端程序!
-
-注意:请记得提交已更改的源码至github,一会还要用到。
-
-## 在MAC中编译ngrok客户端
-
-服务器是CentOS,自己的工作电脑是Mac,所以得在自己的电脑中编译一份相同签名文件的客户端程序!
-
-### 1.安装go
-
-与服务器的步骤类似,我们首先要安装go语言环境:
-
-```bash
-brew update
-brew install go
-```
-
-### 2.设置go的环境变量(略)
-### 3.拉取源码并编译客户端(略)
-
-最后将编译好的ngrok文件,拷贝至$GOPATH/bin目录内,以便在命令行内任意目录内均可以直接通过ngrok运行程序。
-
-## 最后的验证
-
-ngrokd服务配置好了,客户端程序也有了,下面测试下ngrok是否能够正常使用。
-
-1. 创建一个ngrok配置文件:ngrok.cfg
-
- ```bash
- server_addr: “ngrok.fex.im:4443"
- trust_host_root_certs: false
- ```
-
-2. 运行客户端,暴露8080端口的站点
-
- ```bash
- $ ngrok -subdomain demo -config=/Users/lv/bin/ngrok.cfg 8080
- ```
-
-3. 在8080端口下建一个测试站点
-
- 方便起见,我们拉取git@github.com:o2team/brand.git做测试:
-
- ```bash
- npm i -g node-static
- git clone git@github.com:o2team/brand.git
- cd brand
- static
- ```
-
-4. 在浏览器中输入demo.ngrok.fex.im:8088
-
- bingo!
-
- 
-
-5. 在浏览器中输入:localhost:4040
-
- 可以查看所有的请求情况!
- 
-
-## 注意事项
-
-客户端ngrok.cfg中server_addr后的值必须严格与-domain以及证书中的`NGROK_BASE_DOMAIN`相同,否则Server端就会出现如下错误日志:
-
-```
-[03/13/15 09:55:46] [INFO] [tun:15dd7522] New connection from 54.149.100.42:38252
-[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Waiting to read message
-[03/13/15 09:55:46] [WARN] [tun:15dd7522] Failed to read message: remote error: bad certificate
-[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Closing
-```
-
-## 参考资料
-
-- 自建ngrok服务
-
-1. http://tonybai.com/2015/03/14/selfhost-ngrok-service/
-2. https://github.com/inconshreveable/ngrok/blob/master/docs/SELFHOSTING.md
-
-- go的安装
-
-1. https://blog.starkandwayne.com/2014/12/04/how-to-install-go-on-digital-ocean/
-
-## 结语
-
-本文主要介绍了ngrok服务的自行搭建。同时为大家免费提供我搭建好的ngrok服务:ngrok.fex.im。
-fex.im所在的机器是digitalocean的一个主机,虽然国内速度慢但是还算稳定。
-
-## 如何使用ngrok.fex.im?
-
-### 安装client
-
-Linux 下载:http://fex.im/files/ngrok
-Mac OSX 下载:https://github.com/mamboer/ngrok/releases/download/1.7.2/ngrok
-
-放在 `/usr/local/bin` 目录下
-
-### 设置所有者
-
-```
-sudo chown $(whoami):staff ngrok
-```
-
-### 设置权限
-
-```
-sudo chmod 777 ngrok
-```
-
-### 运行客户端
-
-```bash
-$ ngrok -subdomain demo -config=/Users/lv/bin/ngrok.cfg 8080
-```
-
-### 配置文件
-
-```bash
-server_addr: “ngrok.fex.im:4443"
-trust_host_root_certs: false
-```
\ No newline at end of file
diff --git a/source/_posts/2016-02-24-node-debug-in-production.md b/source/_posts/2016-02-24-node-debug-in-production.md
deleted file mode 100644
index 97f31b11a9..0000000000
--- a/source/_posts/2016-02-24-node-debug-in-production.md
+++ /dev/null
@@ -1,347 +0,0 @@
-title: Node 生产环境调试
-subtitle: "本文以问答的形式,介绍生产环境中该如何去调试 Node 应用。"
-cover: //img14.360buyimg.com/ling/jfs/t1/34264/4/12462/218564/5d084be1E68db1ff4/fc5bce93df93cc81.png
-date: 2016-02-24 12:25:35
-categories: NodeJS
-tags:
- - node
- - 调试
-author:
- nick: 朱奕腾
- github_name: chuyik
----
-
-本文以问答的形式,介绍生产环境中该如何去调试 Node 应用。
-文章覆盖到了**性能问题**、**崩溃问题**、**内存泄露**的检查和解决手段。
-
-## 随着用户请求数越来越多,Node 请求越来越慢。怎么处理?
-
-每个用户的请求,都会经过这几个阶段:
-
-```
-网络请求 -> Node 中间层 -> 目标接口 -> 返回
-```
-
-前三个过程都会消耗一定的时间,因此我们应该分析每个阶段的耗时,进行针对性优化。
-
-假设你是用 Express 作为 API 服务器,你可以利用 Express 官方的 [response-time](https://github.com/expressjs/response-time) 和 [StatsD](https://github.com/sivy/node-statsd),
-将每个中间层的请求数据都收集并统计起来。
-
-但在 Express 世界之外,还有一个更专注于做 API 服务器的框架,叫 [restify](https://github.com/restify/node-restify)。
-restify 是一个纯 Restful 的框架,它可以结合 DTrace 去记录一个用户请求中,每个环节消耗的时间。
-
-图中高亮的部分是 restify 对于请求耗时的记录:
-
-
-
-此外,restify 还有着更多强大功能,包括请求频率控制、内置 Ajax 错误类型、基于 [bunyan](https://github.com/trentm/node-bunyan) 的日志。
-
-
-## 如何知道线上项目哪个函数消耗更多的 CPU 时间?
-
-参考以下几个步骤,通过可视化的角度,揪出消耗 CPU 的凶手。
-
-1. 确保你线上的 Node 版本是 5.0 以上
-2. 启动 Node 项目时,增加 `--perf-basic-prof-only-functions` 参数,如:
-
- ```sh
- node --perf-basic-prof-only-functions app.js & # Tips: `&`表示后台运行该代码
- ```
-
-3. 用 [perf](https://perf.wiki.kernel.org/index.php/Tutorial) 生成 Node 进程的栈信息文件(stack trace)
- ```sh
- sudo yum install perf # perf 非系统自带,需另外安装
-
- # 获取 Node 的进程 ID,用 30 秒时间记录栈信息并生成 `perf-xxxxx.map` 文件(被保存在 /tmp/)
- sudo perf record -F 99 -p `pgrep -n node` -g -- sleep 30
-
- ls /tmp/*.map # 检查该文件是否存在
- sudo chown root /tmp/perf-xxxxx.map # 该文件设置权限
- sudo perf script > nodestacks # 将该文件转换成可解析的 `nodestacks` 文件
- ```
-4. 下载 FlameGraph 并生成可视化的栈信息火焰图
-
- ```sh
- git clone --depth 1 http://github.com/brendangregg/FlameGraph # 下载 FlameGraph
-
- # 生成火焰图
- cd FlameGraph
- ./stackcollapse-perf.pl < ../nodestacks | ./flamegraph.pl --colors js > ../node-flamegraph.svg
- ```
-
-最后会生成类似这样的图片:
-
-
-
-**解释这种图片的含义:**
- 1. 每个方块为被调用的函数
- 2. X 轴表示 CPU 的消耗时间
- 3. Y 轴表示栈的深度
- 4. 颜色为随机值
-
-如果方块横向越长,说明这个函数消耗的 CPU 时间越多。
-这样,你就可以定位到这个函数,深入代码去定位问题了。
-
-## 如何收集线上的崩溃信息?
-
-可以让 Node 在运行过程中,记录自身的运行状态,并崩溃的时候输出调试信息。
-而这些调试信息被称为 [Core Dump](https://en.wikipedia.org/wiki/Core_dump),会被保存在一个文件中,我们称之为 Core 文件。
-Core 文件记录了进程运行时的一切状态,包括调用栈、内存变量、被调用的函数源码等。
-有了这个文件,我们就可以最大化的还原出当时应用运行的过程。
-
-下面我们利用 [mdb_v8][3] 工具,这个目前最好的 Node 命令行分析工具,结合一个简单案例来演示。
-
-1. 配置 Solaris 环境
-
- 由于 [mdb_v8][3] 只能运行在 Solaris 环境,因此你有两种选择:
-
- - 安装基于 Illumos 的系统,如 OmniOS 虚拟机
- - 使用 Joyent 公司收费的 Manta 服务,请参阅[这里][4]
-
- 笔者使用第一种方式,即通过虚拟机运行 mdb_v8,详见 [Vagrant 安装 OmniOS 指南][2]。
-
-2. 启动 Node 项目时,增加 `--abort-on-uncaught-exception` 参数,让应用在崩溃时输出 Core 文件
-
- 本文用以下会崩溃的代码测试,生成 Core 文件。
-
- ```js
- var obj = {
- myproperty: "Hello World",
- count: 0,
- };
-
- function increment() {
- obj.count++;
-
- if (obj.count === 1000)
- throw new Error("sad trombone"); // 该行会让应用崩溃
-
- setImmediate(increment);
- }
-
- setImmediate(increment);
- ```
-
- ```bash
- # 运行上述代码
- node --abort-on-uncaught-exception throw.js
- ```
-
-3. 将 Core 文件和 Node 二进制程序打包,传到 Vagrant 虚拟机内
-
- ```bash
- # 打包 Core Dump 和 Node 二进制程序
- mkdir debug
- cp core.* debug/
- cp $(which node) debug/
- zip -r debug.zip debug
-
- # 传压缩包到 Vagrant 虚拟机内
- mv debug.zip xxxx # xxxx 表示 Vagrantfile 所在的目录,即你启动虚拟机的目录
-
- # 在虚拟机里解压缩包
- unzip -o /vagrant/debug.zip -d ~
- ```
-
-4. 使用 [mdb_v8][3] 解析 Core 文件
-
- ```bash
- # 下载最新的 mdb_v8 模块
- wget https://us-east.manta.joyent.com/Joyent_Dev/public/mdb_v8/v1.1.2/mdb_v8_amd64.so
-
- # 使用 mdb 工具加载 Core Dump,格式为:mdb [Node 二进制程序] [Core 文件]
- mdb ./node ./core
-
- # 进入 REPL 后, 运行以下代码加载 mdb_v8 模块
- > ::load ./mdb_v8_amd64.so
- ```
-
-5. 分析崩溃原因
-
- 5.1. 使用 mdb_v8 的 [jsstack][9] 指令,查看最后的调用栈情况
-
- ```bash
- > ::jsstack -v
- native: v8::base::OS::Abort+0xd
- native: v8::internal::Isolate::DoThrow+0x381
- native: v8::internal::Isolate::Throw+0x11
- native: v8::internal::Runtime_Throw+0x3d
- (1 internal frame elided)
- js: increment
- file: /export/www/node/mongo-express/throw.js
- posn: line 6
- this: 2ac5150fc3f9 (JSObject: Immediate)
- ( 1 function (exports, require, module, __filename, __dirname) { var obj = {
- 2 myproperty: "Hello World",
- 3 count: 0,
- 4 };
- 5
- 6 function increment() {
- 7 obj.count++;
- 8
- 9 if (obj.count === 1000)
- 10 throw new Error("sad trombone");
- 11
- 12 setImmediate(increment);
- 13 }
- 14
- 15 setImmediate(increment);
- 16
- 17 });
-
- js: processImmediate
- file: timers.js
- posn: line 342
- this: 2d184056ef69 (JSObject: process)
- ...
- ```
-
- 5.2. 从上面信息得知,最后一个被调用的函数是 `increment`,因此可以查下该函数的地址
-
- ```bash
- # 查询 increment 函数地址值
- > ::jsfunctions -n increment
- FUNC #FUNCS NAME FROM
- 2ac51509c7a9 1 increment /export/www/node/mongo-express/throw.js line 6
- ```
-
- 5.3. 查到地址值后,就可以查出函数当时的局部变量
-
- ```bash
- # 查询 increment 函数当时的局部变量
- > 2ac51509c7a9::jsclosure
- "obj": 2ac51509c941: {
- "myproperty": 2ae60c1a3f39: "Hello World",
- "count": 3e800000000: 1000,
- }
- "increment": 2ac51509c7a9: function increment
- ```
-
- 结合代码可知,由于 `count` 数值已经到达 1000,导致应用崩溃。
-
- 5.4. 当然,通过以下命令,还能查到 `count` 属性所在对象的起始状态和结束状态
-
- ```bash
- > ::findjsobjects -p count | ::findjsobjects -l | ::jsprint
- {
- "myproperty": "Hello World",
- "count": 0,
- }
- {
- "myproperty": "Hello World",
- "count": 1000,
- }
- ```
-
- 对于 mdb_v8 更多的 Node 指令,请参阅[这里][5]。
-
-
-## 如何追踪内存泄露问题?
-
-上个问题中,我们用 Node 的 `--abort-on-uncaught-exception` 参数,让应用在崩溃后输出 Core 文件。
-但如果应用一直在运行(即无崩溃),可以用 Linux 自带的 [gcore][6] 命令,导出 Core 文件并分析内存泄露的原因。
-
-1. 本文用以下代码测试,该代码会导致内存泄露
-
- ```js
- var bigData = null;
- var replaceData = function () {
- var originalData = bigData
- bigData = {
- longStr: new Array(1000000).join('*'),
- closure: function () {
- // 这里引用到了 originalData,导致旧的 bigData 没有被释放
- if (originalData)
- console.log(originalData.longStr.length)
- }
- }
-
- bigData.closure()
- }
-
- setInterval(replaceData, 1000)
- console.log('process id: ', process.pid)
- ```
- 用 `node xxx.js` 命令运行代码即可。
-
-2. 每隔一段时间,用 [gcore][6] 对上述代码所在进程进行 Core Dump
-
- ```bash
- # PID 为进程 ID,上面代码会打印出来
- # 文件会被保存为 leak_1.PID
- gcore -o leak_1 PID
-
- # 进程运行一段时间后(如15秒),再 Core Dump 一次
- # 文件会被保存为 leak_2.PID
- gcore -o leak_2 PID
- ```
-
-3. 利用 mdb_v8 提供的工具 [dumpjsobjects][7],提取 Core 文件中的 JS 对象,并输出文件
-
- ```bash
- # 每行命令生成两个文件,分别为 obj_id_x / obj_content_x
- ./dumpjsobjects ./leak_1.PID ./mdb_v8_amd64.so obj_id_1 obj_content_1
- ./dumpjsobjects ./leak_2.PID ./mdb_v8_amd64.so obj_id_2 obj_content_2
- ```
-
-4. 利用 mdb_v8 提供的工具 [mdbv8diff][8],进行 JS 对象对比
-
- 比较两个时期的 JS 对象的异同,即可获得未被释放的对象地址。
-
- ```bash
- # 下载安装 mdbv8diff
- git clone https://github.com/joyent/mdb_v8.git
- cd mdb_v8/tools/mdbv8diff
- npm install
-
- # 对比 Core 文件的 JS 对象
- ./mdbv8diff /path/to/obj_content_1 /path/to/obj_content_2
- ```
-
- 打印出来的结果为:
-
- ```
- 135f38df83d9: only in /Users/edc/Downloads/omnios/du_3
- ```
-
-5. 用 mdb_v8 打印 `135f38df83d9` 内存地址对应的对象
-
- ```bash
- # 打印该地址对象的内容
- > 135f38df83d9::jsprint
- {
- "longStr": "*******....",
- "closure": function (as bigData.closure),
- }
-
- # 找出该对象所有的实例
- > 135f38df83d9::findjsobjects
- 39fac26f83d9
- 39ec3a4f83d9
- 3720c57f83d9
- ...
- ```
-
- 从结果可以发现,该对象的实例一直在内存里未被释放。
-
-## 后语
-本文参考了 Netflix 工程师 [Yunong Xiao](https://twitter.com/YunongX) 的[演讲分享][1],在此感谢。
-希望该文章可以给读者更多解决 Node 生产环境调试的思路。但对于生产环境中面临的各种复杂问题,也许需要更多的手段才能解决。
-
----
-References
-1. http://techblog.netflix.com/2015/12/debugging-nodejs-in-production.html
-2. http://yunong.io/2015/11/23/generating-node-js-flame-graphs/
-3. http://www.slideshare.net/davidapacheco/surge2012
-4. https://www.joyent.com/blog/mdb-and-linux
-5. http://info.meteor.com/blog/an-interesting-kind-of-javascript-memory-leak
-
-[1]: http://techblog.netflix.com/2015/12/debugging-nodejs-in-production.html
-[2]: issues/5
-[3]: https://github.com/joyent/mdb_v8
-[4]: https://www.joyent.com/blog/mdb-and-linux
-[5]: https://github.com/joyent/mdb_v8/blob/master/docs/usage.md#node-specific-mdb-command-reference
-[6]: http://man7.org/linux/man-pages/man1/gcore.1.html
-[7]: https://github.com/joyent/mdb_v8/blob/master/tools/dumpjsobjects
-[8]: https://github.com/joyent/mdb_v8/blob/master/tools%2Fmdbv8diff%2Fmdbv8diff
-[9]: https://github.com/joyent/mdb_v8/blob/master/docs/usage.md#jsstack
diff --git a/source/_posts/2016-02-26-use-npm-script-instead-of-gulp.md b/source/_posts/2016-02-26-use-npm-script-instead-of-gulp.md
deleted file mode 100644
index 8ca4c51f1e..0000000000
--- a/source/_posts/2016-02-26-use-npm-script-instead-of-gulp.md
+++ /dev/null
@@ -1,140 +0,0 @@
-title: 使用npm scripts替代gulp
-subtitle: 利用npm run高效地实现前端自动化任务
-cover: //img20.360buyimg.com/ling/jfs/t1/52619/26/2712/170236/5d084bfcE2ff6a5aa/5676a8dcc47fd7f5.png
-categories: Web开发
-tags:
- - npm
- - gulp
-author:
- nick: SkyCai
- github_name: cnt1992
-date: 2016-02-26 16:06:24
----
-
-
-
-## 为什么要用`npm scripts`替代`gulp`
-
-现在`前端自动化`的配套工具估计都离不开`gulp`或者是`grunt`,有一些或许会用上`webpack`辅助用上最新的`ES6`语法等;但是不知道大家在使用`gulp`众多插件的时候有没有碰到过一些问题,比如:有一些插件你仅仅需要用到其中一点点的API、插件更新速度非常慢、有一些插件碰到bug的时候调试起来非常麻烦等。所以总结一下`gulp`或者`grunt`其实都会有以下问题:
-
-1. 依赖于插件作者
-2. 调试很不方便
-3. 插件文档说明不连贯
-
-而如果直接使用`npm scripts`完全可以避免这些问题,在我们`package.json`里面的`scripts`属性直接定义需要执行的任务,比如`npm start`和`npm test`其实就是`npm run start`和`npm run test`的缩写,我们可以在`scripts`里面定义各种需要的任务,举个最简单的例子(清除dist目录):
-
-```javascript
-# 1.用gulp插件来实现
-var gulp = require('gulp');
-var del = require('del');
-gulp.task('clean', function() {
- del(['./dist/**/*']).then(paths => {
- console.log('Deleted files and folders:\n', paths.join('\n'));
- });
-});
-
-# 2.用npm scripts来实现
-# package.json配置
- ...
- "scripts": {
- clean: "rimraf ./dist"
- },
- "devDependencies": {
- "rimraf": "^2.5.2"
- }
-```
-
-从上面示例代码可以看出明显直接用`npm scripts`实现的同一个功能相对`gulp`要简单得多,当然这个功能比较简单,如果碰到复杂的一些任务肯定就有反对的声音了。那我们将细细将上面三点来阐述。
-
-### 依赖于插件作者
-
-当你需要使用到最新的或者不那么流行的技术时,根本就没有插件给你使用;或者一些插件已经过时了。最新`Babel 6`已经发布,很多API明显修改了,所以很多`gulp`插件根本不适用于最新版本。
-
-这个时候你就必须等待作者来更新插件,或者你自己去`fix`这些问题,这会导致你不能及时用上最新版本的工具。相反,当你直接使用`npm scripts`的时候,你只需要直接找到可以实现的工具即可。这意味着当新版本的`Mocha`、`Babel`、`Webpack`、`Browserify`发布的时候,你就可以马上用上这些版本。
-
-就目前插件数量来说,没有什么可以打败`npm`包:
-
-
-
-### 调试很不方便
-
-由于`gulp`增加了一层抽象,所以会有潜在的`bug`:
-
-1. 是否基础工具崩溃了?
-2. 是否`Grunt`/`Gulp`插件崩溃了?
-3. 是否配置文件出错了?
-4. 是否用了不稳定的版本?
-
-而直接使用`npm scripts`直接避免了第2点跟第3点,而由于不使用那么多插件,那么包相对较少,第4点也很少会碰到。
-
-### 插件文档说明不连贯
-
-相比有用过很多插件的人都知道,一些核心的工具文档写得总比包装起来的`Gulp`插件要清晰得多。举个简单的例子来说,如果我需要用到`gulp-eslint`插件,那么就可能会不断在`gulp-eslint`的文档跟`ESLint`网站切换,必须对比看看两者存在些什么区别。
-
-## 为什么我们总是忽略使用`npm scripts`而更青睐于`Gulp`
-
-`Gulp`和`Grunt`之所以这么流行,主要有下面4个点:
-
-1. 开发者认为`npm scripts`需要能写命令行的技能
-2. 开发者认为`npm scripts`能处理的能力不足够
-3. 开发者觉得`Gulp`的流对于快速构建是很有必要的
-4. 开发者认为`npm scripts`不能跨平台运行
-
-### 开发者认为`npm scripts`需要能写命令行的技能
-
-其实你完全不需要精通于`Unix`或者`Windows`的命令行脚本,比如你不知道在`Unix`下面删除一个目录的命令是:`rm -rf`,这其实没啥问题,你完全可以使用[rimraf](https://www.npmjs.com/package/rimraf),同时它也是跨平台的。在这里推荐一个工具包资源网站:[libraries.io](https://libraries.io/)
-
-### 开发者认为`npm scripts`能处理的能力不足够
-
-`npm scripts`其实比你想象中的要强大,主要依赖于[预处理和后置处理钩子](https://docs.npmjs.com/misc/scripts#description),比如下面例子:
-
-```javascript
-{
- "name": "npm-scripts-demo",
- "version": "1.0.0",
- "description": "npm scripts demo",
- "scripts": {
- "prebuild": "echo I run before the build script",
- "build": "cross-env NODE_ENV=production webpack",
- "postbuild": "echo I run after the build script"
- }
-}
-```
-
-正如上面例子一样,`prebuild`定义的脚本会比`build`任务先执行,而`postbuild`定义的脚本会比`build`任务后执行,因为相对于`build`来说,增加了一个前缀`pre`和`post`,所以当我执行`npm run build`的时候会自动地顺序执行`prebuild -> build -> postbuild`。
-
-同时你可以将一个大的任务不断拆分成小的任务,比如:
-
-```javascript
-{
- "name": "npm-scripts-demo",
- "version": "1.0.0",
- "description": "npm scripts demo",
- "scripts": {
- "clean": "rimraf ./dist && mkdir dist",
- "prebuild": "npm run clean",
- "build": "cross-env NODE_ENV=production webpack"
- }
-}
-```
-
-在上面例子中将`clean`任务抽离出来了,当你执行`npm run build`的时候,会先自动执行`npm run prebuild`任务,那就相当于执行了`npm run clean`任务了,注意上面的`&&`表示先后顺序执行,区别于`&`表示同时执行。
-
-## `npm scripts`的一些缺点
-
-不得不承认,用`npm scripts`来写自动化构建任务还是存在一些不足:不能在JSON文件里面写注释。有一些方法可以弥补这方面的不足:
-
-1. 写功能相对小而独立并且命名好的脚本名字
-2. 脚本跟文档分离(将文档写进READ.md)
-3. 直接分离脚本写进Makefile等独立的文件
-
-推荐使用第一种,脚本名字本来就应该能够直接描述功能。
-
-## 一些参考
-
-- [Task automation with npm run](http://substack.net/task_automation_with_npm_run) -- James Holliday
-- [Advanced front-end automation with npm scripts](https://www.youtube.com/watch?v=0RYETb9YVrk) -- Kate Hudson
-- [How to use npm as a build tool](http://blog.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/) -- Kieth Girkel
-- [Introduction to npm as a Build Tool](http://app.pluralsight.com/courses/npm-build-tool-introduction) -- Marcus Hammarberg
-- [Gulp is awesome, but do we really need it?](http://gon.to/2015/02/26/gulp-is-awesome-but-do-we-really-need-it/) -- Gonto
-- [NPM Scripts for Build Tooling](http://code.tutsplus.com/courses/npm-scripts-for-build-tooling) -- Andrew Burgess
\ No newline at end of file
diff --git a/source/_posts/2016-02-27-docker.md b/source/_posts/2016-02-27-docker.md
deleted file mode 100644
index 6d30fa3623..0000000000
--- a/source/_posts/2016-02-27-docker.md
+++ /dev/null
@@ -1,245 +0,0 @@
-title: 初探Docker
-subtitle: "docker:一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器,能够快速部署你的应用"
-cover: https://img14.360buyimg.com/ling/jfs/t1/71987/5/2223/474252/5d084e65E8e8ff843/d429fe97c9c3cb83.png
-date: 2016-02-27 17:55:35
-categories: Web开发
-tags:
- - docker
- - 环境
- - 部署
- - docker hub
-author:
- nick: lizhi
- github_name: l-zhi
----
-
-本文旨在让大家了解什么是Docker,并带领大家体验Docker使用的整个流程。
-
-
-
-开启Docker学习之旅前,我们简单描述几个场景,应该很多人都有碰到过:
-
-小凹同学开发了一个web应用,服务器环境是: `centos 7` + `nginx` + `node4.6` + `mongodb3.2.3` 最近要上线了。
-
-【场景1】:刚好公司有一台服务器可以用,但是服务器上有一些其他服务,而且已经装了`node3.31`和`mongodb2.3`,小凹蒙了,到底是直接升级环境呢?还是改一个适配低版本的应用呢?
-
-【场景2】:终于花了很久时间部署上了,慢慢的项目需求越来越多,小凹的同事小凸也准备一起迭代这个项目,小凸又要重新配置一遍应用环境到本地做测试,随着越来越多的同事参与进来,每个人都要配置一遍本地测试环境,重复工作,时间又白白浪费掉。
-
-【场景3】:随着项目越做越大,现有服务器配置和带宽已经不能满足了,小凹需要把这个项目迁移出去并做水平扩展,然后又得重复配置环境到多台服务器,而且这些服务器有可能还是会重复前面的场景1。
-
-【场景4】:运维要清理一些服务器,整理出来,把没有完全利用的服务器,分给新的项目用,要罗列出来每台服务器的服务,然后删除掉不需要的,这时候发现完全无从下手。
-
-上面的场景经常发生,也许就发生在你我身边,而且无比头疼,但对Docker来说解决这些问题都易如反掌,下面我们就一步步来了解并使用Docker。
-
-## 什么是Docker?
-
-[Docker](https://www.docker.com/)是一个[开源](https://github.com/docker/docker)的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs([虚拟机](https://zh.wikipedia.org/wiki/%E8%99%9B%E6%93%AC%E6%A9%9F%E5%99%A8))、[bare metal](https://en.wikipedia.org/wiki/BareMetal)、[OpenStack](https://zh.wikipedia.org/wiki/OpenStack) 集群和其他的基础应用平台。
-
-官方的描述是:Build, Ship, and Run Any App, Anywhere 在任何地方部署,传输,运行任何应用。
-
-其实很像虚拟机,但是跟虚拟机比起来 更灵活,速度更快,CPU/内存消耗更低,关键是更方便管理。
-
-
-
-上图就是一张Docker层级图, 最下面是核心系统,文件系统等构成Dokcer底层,上面的是镜像(image),分为基础镜像和普通镜像,所有镜像可以直接启动生成一个实例(container),container我们可以理解为一个可以直接运行的虚拟机了。
-
-其中基础image 启动后生成container,然后添加一些应用如 `apache`,`emacs`,可以通过提交操作直接生成普通的image。 我们可以共享这个image到任何地方,并启动它。
-
-## 使用Docker
-
-### 1.安装
-
-Docker 可以安装在 `Linux`, `Mac OS`, `Windows` 上,详细安装步骤可以参考 **[官方安装文档](https://docs.docker.com/engine/installation/)** 。
-
-*注:本文就不一一举例所有的安装方法,就以操作系统 **[centos](https://zh.wikipedia.org/wiki/CentOS)** 为例。*
-
-由于docker 只支持 `centos6`以上,`64`位的版本操作系统,所以安装前可以用以下命令查看服务器系统。
-```
-$ getconf LONG_BIT //查看操作系统是多少位
-> 64
-$ cat /etc/redhat-release //查看操作系统版本
-> CentOS Linux release 7.0.1406 (Core)
-```
-
-上面是我使用的机器 `centos7` `64`位系统,我就以这个为例讲下面的使用步骤。
-```
-$ curl -fsSL https://get.docker.com/ | sh //安装
-$ docker version // 查看是否安装成功
-```
-
-如果 **安装失败** 可以尝试使用阿里云的代理安装。
-```
-$ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
-```
-
-其他更详细的阿里云Docker代理加速器文档,可以点击[这里](https://help.aliyun.com/knowledge_detail/5974865.html)
-
-安装成功后启动Docker,并设置开机启动。
-```
-$ sudo service docker start //开启Docker 服务
-$ sudo chkconfig docker on //开机启动
-```
-
-### 获取基础镜像
-
-*注:假定我需要部署一个基于`centos`的应用,当然也可以换成别的,比如:`Redis` 或者 `Ubuntu`,可以是任何镜像来当做基础镜像,跟本机原有系统无关,只与所要部署的应用有关。*
-
-首先搜索需要获取的 **[镜像](https://hub.docker.com/explore/)**,这是官方`Docker Hub`提供的镜像资源。
-
-比如,我选择获取 **[centos最新版本](https://hub.docker.com/_/centos/)**
-
-```
-$ docker pull centos //获取centos最近版本的镜像
-```
-
-
-使用命令 `docker images` 就能查到刚才获取的 `centos` 的镜像,如上图。
-
-### 配置新的镜像
-*注:为了方便演示,假定我们的服务只需要安装一个`zip`的`centos`系统。*
-
-将上面获取的 `centos` 镜像,启动生成container,并在container中安装zip。
-
-```
-[root@AY130809220512304015Z image]# docker run -t -i centos /bin/bash
-```
-`docker run` 启动容器,`-t`:为容器重新分配一个伪输入终端,通常与 -i 同时使用; `-i`:以交互模式运行容器,通常与 -t 同时使用;`centos` 为镜像名, 镜像名通常以 **镜像名:版本** 来使用,因为centos没有版本所以省略, 后面 `/bin/bash` 是启动container后运行的程序。
-```
-[root@e44ea4258885 /]# zip //先运行zip,发现是没有安装的
-bash: zip: command not found
-[root@90934d1f4225 /]# yum install zip //安装zip
-[root@90934d1f4225 /]# zip //查看zip,安装成功
-Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
-Zip 3.0 (July 5th 2008). Usage:
-...
-```
-使用container命令行安装`zip`成功。
-```
-[root@90934d1f4225 /]# exit
-```
-退出容器命令行,因为不是后台运行,所以退出后,container也随即关闭了。`-d` 可以让container在后台运行,并可以随时通过`docker attach` 命令进入容器,具体例子可以看[这里](https://docs.docker.com/engine/reference/commandline/attach/),因为不是本文重点就不展开说明了。
-
-`docker ps` 命令可以查看当前启动的 container, `-a` 启动和没启动的都会展示。
-
-```
-[root@AY130809220512304015Z image]# docker ps -a
-CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-8f08b2b67380 centos "/bin/bash" 21 minutes ago Exited (0) 20 minutes ago lonely_euler
-```
-
-有一个id为 8f08b2b67380的container,这个就是我们刚才安装了zip,并退出的container。
-```
-[root@AY130809220512304015Z image]# docker commit -m "Added zip install" 8f08b2b67380 test:1
-sha256:8f1d192a4ea2a80801e33cd5fadb5f37180bb718f729f77a404a347b977d753c
-```
-
-`docker commit` 将container提交生成image, `-m`:为描述, 后面紧接着的是container的id, `test:1` 是提交的镜像名称和版本。
-
-```
-[root@AY130809220512304015Z image]# docker images
-REPOSITORY TAG IMAGE ID CREATED SIZE
-test 1 8f1d192a4ea2 About a minute ago 266.7 MB
-centos latest 0f0be3675ebb 7 days ago 196.6 MB
-```
-再查看的时候已经多了一个image了,这个image就是我们安装了zip的image,到此我们已经生成一个新的image。
-
-我们可以直接通过这个新的镜像启动容器,还是前面介绍过的命令`docker run` 并测试下zip,如下:
-```
-[root@AY130809220512304015Z image]# sudo docker run -t -i test:1 /bin/bash
-[root@2f1f28be351c /]# zip
-Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
-Zip 3.0 (July 5th 2008). Usage:
-...
-```
-好了这个镜像已经制作完成,当然实际情况下,安装的肯定不仅仅只有zip这么简单。
-
-但是在一个团队里,仅仅给我们image,我们可能不知道这个镜像到底做了什么,所以还有一种方法使用 配置文件`Dockerfile`,build出来一个镜像,这样更易于团队协作,下面我将介绍一下这种方式。
-
-### 通过Dockerfile 配置新的image
-
-开始之前顺便介绍删除image和container的命令,它们分别是`docker rmi` 删除image 和 `docker rm` 删除container,后面都是跟对应的id或者名称,为了后面的操作我们这里通过命令 `docker rmi 8f1d192a4ea2` 删除掉刚才建的image。
-
-*注:如果发现删不掉image,可能被某些容器引用了,可以通过上面介绍的`docker ps -a`查看container,并用 `docker rm`删除掉这个container*。
-
-接着我们创建`Dockerfile`
-```
-$ mkdir o2team
-$ cd o2team
-$ touch Dockerfile
-```
-
-下面是 `Dockerfile` 中的内容
-```
-# Dockerfile for o2team
-# http://aotu.io/
-FROM centos
-MAINTAINER lizhi
-RUN yum -y install zip
-```
-
-`#`为注释,`FROM centos` 为基础镜像来源,`MAINTAINER`为作者信息, `RUN` 则为 运行某些 命令,编辑完成后保存,然后我们就可以直接构建我们新的image,Dockerfile详细使用文档可以参看[这里](https://docs.docker.com/engine/reference/builder/)。
-
-```
-[root@AY130809220512304015Z o2team-test]# docker build -t test:1 .
-```
-`docker build`就是通过Dockfile来创建一个新的Image,其中 `-t`:为新image的名字这里命名为test:1, `"."` 则会在当前的目录下找 `Dockerfile` 文件,当然这里也可以指定路径。
-
-```
-[root@AY130809220512304015Z o2team-test]# docker images
-REPOSITORY TAG IMAGE ID CREATED SIZE
-test 1 8975f3fb142e 8 seconds ago 266.7 MB
-centos latest 0f0be3675ebb 9 days ago 196.6 MB
-```
-就这样,通过`docker images`也能生成一个新的镜像了,这种用Dockerfile的方式更加适合团队使用,环境配置更清晰。
-
-到这里,我们只需要管理我们的镜像就好了,比如同步镜像给其他人,或者其他机器。
-
-其实docker就给我们提供了这样一整套的解决方案,我们可以把我们的镜像提交到 **[Docker Hub](https://hub.docker.com/)**,类似 `github`一样的远程仓库,当我们需要的时候只需要 pull下来启动就好了。
-
-### 提交
-我们就把这个test镜像提交到`Docker Hub`
-
-首先我们得先注册:https://hub.docker.com/
-
-注册成功后就可以`docker login`登录了
-```
-[root@AY130809220512304015Z o2team-test]# docker login
-> Username: a569171010
-> Password: xxx
-> Email: fanlizhi@jd.com
-Login Succeeded
-```
-填完登录后就可以push了,注意这里push之前得确保名称是 `youruser/xxx`
-比如我的用户名是 a569171010 所以我需要将刚才的image 重命名成 a569171010/test:1,这里可以用`docker tag`命令重命名。
-
-```
-[root@AY130809220512304015Z o2team-test]# docker tag test:1 a569171010/test:1
-[root@AY130809220512304015Z o2team-test]# docker push a569171010/test:1
-```
-然后就发布出去了,在 **[Docker Hub](https://hub.docker.com/)** 上就可以看到下面多了这一条记录,当我们要获取的时候就直接 `docker pull a569171010/test`就可以了,因为是公用库所以任何人都可以获取并使用。
-
-
-我们已经基本熟悉,了解了整个Docker使用的流程,回过头来看看开始我们抛出的那几个曾经很棘手的问题,是不是都能迎刃而解呢?因为image的可移植和隔离性,我们不仅可以轻松迁移扩展,还能轻松了解现在机器上各个服务运行情况。
-
-下图为Docker整个使用流程:
-
-
-
-### 本文参考资料
-[Docker 官方文档](https://www.docker.com/)
-[Docker 中文指南](http://www.widuu.com/docker/index.html)
-[dockone.io 国内比较活跃的Docker论坛](http://dockone.io/article/101)
-[Docker 入门介绍](http://tech.meituan.com/docker_introduction.html)
-[Docker github](https://github.com/docker/docker-registry)
-[阿里镜像使用文档](https://help.aliyun.com/knowledge_detail/5974865.html)
-[维基百科](https://zh.wikipedia.org/zh/Docker_(%E8%BB%9F%E9%AB%94)
-
-### 还想了解的
-这篇文章只是带领大家了解Docker的整个使用流程和体验,关于其他的一些细节问题比如:后台运行container,各container之间的通讯,端口映射,文件共享等都没有涉及到,最近`docker1.1.0`发布又有很多新的特性和性能优化,如果有兴趣的同学可以参考这些:
-
-
-[利用Docker构建开发环境](http://tech.uc.cn/?p=2726)
-[Docker-从入门到实践](https://www.gitbook.com/book/yeasy/docker_practice/details)
-[Docker-学习资料](https://github.com/veggiemonk/awesome-docker)
-[Docker 1.1.0新特性](https://blog.docker.com/2016/02/docker-1-10/)
-
diff --git a/source/_posts/2016-03-01-createjs-get-started.md b/source/_posts/2016-03-01-createjs-get-started.md
deleted file mode 100644
index 40cfee61c7..0000000000
--- a/source/_posts/2016-03-01-createjs-get-started.md
+++ /dev/null
@@ -1,469 +0,0 @@
-title: createjs开发入门
-subtitle: 通过实例浅析createjs
-cover: https://img11.360buyimg.com/ling/jfs/t1/70077/31/2212/33092/5d084ee4Eaf799859/c0450ef75961e683.jpg
-categories: Web开发
-tags:
- - createjs
- - tweenjs
- - zoe
- - preloadjs
- - soundjs
- - easeljs
-author:
- nick: 圆姑娘她爹
- github_name: youing
-date: 2016-03-01 10:10:15
----
-通过实例简单介绍createjs的使用方法
-
-
-
-## PRELOADJS
-
-PreloadJS是一个用来管理和协调相关资源加载的类库,它可以方便的帮助你预先加载相关资源。
-
-
-### LoadQueue类介绍
-
-LoadQueue是一个加载管理器,可以预先加载一个文件或者一个文件队列。
-
-LoadQueue包含了几个可以订阅的事件:
-
-
-- complete: 当队列完成全部加载后触发
-- error: 当队列遇到错误时触发
-- progress: 整个队列变化时展示的进度
-- fileload: 一个单独文件加载完毕
-- fileprogress: 一个单独文件变化的进度,请注意只有文件使用XHR加载才会触发,其它只会显示0或者100%
-
-
-LoadQueue支持相关文件类型如下:
-
-- BINARY: XHR调用的二进制文件
-- CSS: CSS文件
-- IMAGE: 一般图片文件格式
-- JAVASCRIPT: JavaScript文件
-- JSON: JSON数据
-- JSONP: 跨域JSON文件
-- MANIFEST: JSON格式的文件列表
-- SOUND: 音频文件
-- SVG: SVG文件
-- TEXT: 文本文件 - 仅支持XHR
-- XML: XML数据
-
-
-### 示例:
-
-
-```
-manifest = [
- {src: "art/sky.png", id: "sky"},
- {src: "art/ground.png", id: "ground"},
- {src: "art/hill2.png", id: "hill2"},
- {src: "art/hill1.png", id: "hill"},
- {src: "static/grant.json", id:"grant", type:"spritesheet"}
-];
-
-var loader = new createjs.LoadQueue(true, "../_assets/");
-loader.on("fileload", handleFileLoad);
-loader.on("complete", handleComplete);
-loader.loadManifest(manifest);
-
-
-```
-
-- 预加载音频文件
-
-```
-//初始化插件
-preload.installPlugin(createjs.Sound);
-
-```
-
-- 设置加载路径
-
-```
-preload = new createjs.LoadQueue(true, "../_assets/art/");
-
-```
-
-- 获取预加载资源
-
-
-```
-preload.getResult(‘id’);
-
-```
-
-通常进度条可以通过`fileload`和`complete`来实现。
-
-
-## SOUNDJS
-
-一个音频播放引擎,能够根据浏览器性能选择音频播放方式。将音频文件作为模块,可随时加载和卸载。
-
-
-### 单个音频基本用法
-
-
-```
-var assetsPath = "../_assets/audio/";
-src = assetsPath + "M-GameBG.ogg";
-
-createjs.Sound.alternateExtensions = ["mp3"]; // 源格式不支持时,用此格式替换
-createjs.Sound.addEventListener("fileload", playSound); // 加载完回调
-createjs.Sound.registerSound(src); // 注册
-
-function playSound(event) {
- soundInstance = createjs.Sound.play(event.src); // 播放实例
-}
-
-
-
-```
-
-
-### 多个音频用法
-
-`registerSounds`
-
-```
-var assetsPath = "../_assets/audio/";
-var sounds = [
- {src: "Game-Break.ogg", id: 1},
- {src: "Game-Spawn.ogg", id: 2},
- {src: "Game-Shot.ogg", id: 3},
-
- {src: "GU-StealDaisy.ogg", id: 4},
- {src: "Humm.ogg", id: 5},
- {src: "R-Damage.ogg", id: 6},
-
- {src: "Thunder1.ogg", id: 7},
- {src: "S-Damage.ogg", id: 8},
- {src: "U-CabinBoy3.ogg", id: 9},
-
- {src: "ToneWobble.ogg", id: 10},
- {src: "Game-Death.ogg", id: 11},
- {src: "Game-Break.ogg", id: 12}
-];
-
-createjs.Sound.alternateExtensions = ["mp3"];
-createjs.Sound.addEventListener("fileload", createjs.proxy(soundLoaded, this));
-createjs.Sound.registerSounds(sounds, assetsPath);
-
-```
-
-
-### 声音合成
-
-- AudioSprite例子
-
-```
-createjs.Sound.initializeDefaultPlugins();
-var assetsPath = "./assets/";
-var sounds = [{
- src:"MyAudioSprite.ogg", data: {
- audioSprite: [
- {id:"sound1", startTime:0, duration:500},
- {id:"sound2", startTime:1000, duration:400},
- {id:"sound3", startTime:1700, duration: 1000}
- ]}
- }
-];
-createjs.Sound.alternateExtensions = ["mp3"];
-createjs.Sound.on("fileload", loadSound);
-createjs.Sound.registerSounds(sounds, assetsPath);
-// after load is complete
-createjs.Sound.play("sound2");
-
-```
-
-
-- AudioSprite安装
-
-
-```
-npm install -g audiosprite
-
-```
-
-- homebrew安装ffmpeg
-
-FFmpeg and the ogg codecs on OSX using brew:
-
-```
-brew install ffmpeg --with-theora --with-libogg --with-libvorbis
-```
-
-- 生成音频文件
-
-```
-audiosprite --autoplay bg_loop --output mygameaudio bg_loop.wav *.mp3
-```
-
-可选参数可以设置是否自动播放等,具体请参考[这里](https://github.com/tonistiigi/audiosprite)
-
-
-- 在线导出
-
-把生成好的json文件,导入到以下链接,才能供soundjs使用
-
-http://jsfiddle.net/bharat_battu/g8fFP/12/
-
-
-
-
-## TWEENJS
-
-TweenJS类库主要用来调整和动画HTML5和Javascript属性。提供了简单并且强大的tweening接口。支持数字对象属性和CSS样式属性,允许你使用链式语法来生成复杂的过程
-
-
-### 示例
-
-
-
-
-### 使用方法
-
-```
-createjs.Tween.get(target)
- .to({x:300},400,createjs.Ease.bounceInOut)
- .set({label:"hello!"})
- .wait(500)
- .to({alpha:0,visible:false},1000)
- .call(onComplete);
-
- ```
-
-- `get` 获取目标元素
-- `to` 执行动画
-- `set` 设置属性
-- `wait` 队列等待
-- `call` 执行回调函数
-- `createjs.Ease.bounceInOut` 缓动效果
-
-
-### 引导动画
-
-```
-createjs.MotionGuidePlugin.install(createjs.Tween);
-
-
-createjs.Tween.get(target).to({guide:{ path:[0,0, 0,200,200,200, 200,0,0,0] }},7000);
-//path所设置的坐标等同于下面画曲线的坐标
-graphics.moveTo(0,0).curveTo(0,200,200,200).curveTo(200,0,0,0);
-
-
-```
-
-- 例子
-
-
-
-
-
-
-## EASELJS
-
-EaselJS 是一个用以与 HTML5 canvas 协作的库。它包含一个完整的分层展示列表、一个核心交互模型以及一些辅助类,通过其来使与 Canvas 的协作更简单。
-
-
-### 先看例子
-
-
-
-下面介绍这个例子的制作过程
-
-### 素材准备
-
-
-
-
-人物精灵图会用到**flash**+**zoe**来生成
-
-
-打开flash,新建一个新的as3项目,导入图片,只要文件名是有序的,会自动导入到每一帧,如下图
-
-
-
-
-
-
-导入完之后,新建一个图层,来放动作标签,如上面的`run`和`jump`
-
-
-最后再新建一个新的图层用来放动作脚本,这里只需要写`stop()`就可以了,这样整个动画是处于静止状态。
-
-
-然后用快捷键`Ctrl + enter`发布成swf格式,并把它导入到**zoe**工具,效果如下
-
-
-
-
-
-tab选项卡切换到`Animations` 可以预览和设置刚才在flash设置的动作。
-
-最后导出json代码供后续使用
-
-
-### 开发阶段
-
-createjs中,元素都是放到舞台中
-
-
-1. 舞台创建
-
-```
-
-
-var stage = new createjs.Stage("testCanvas");
-
-
-```
-
-2. 天空
-
-
-
-```
-sky = new createjs.Shape();
-sky.graphics.beginBitmapFill(loader.getResult("sky")).drawRect(0, 0, w, h);
-
-```
-
-`Shape`类,通常用于画图,例如画矩形,圆形时会使用到
-
-
-
-3. 地板
-
-
-```
-var groundImg = loader.getResult("ground");
-ground = new createjs.Shape();
-ground.graphics.beginBitmapFill(groundImg).drawRect(0, 0, w + groundImg.width, groundImg.height);
-ground.tileW = groundImg.width;
-ground.y = h - groundImg.height;
-
-```
-
-
-4. 山
-
-```
-hill = new createjs.Bitmap(loader.getResult("hill"));
-hill.setTransform(Math.random() * w, h - hill.image.height * 4 - groundImg.height, 4, 4);
-hill.alpha = 0.5;
-
-```
-
-`Bitmap`类,常用于位图处理
-
-
-
-5. 人物
-
-```
-var spriteSheet = new createjs.SpriteSheet(
-{
- framerate: 30,
- "images": [loader.getResult("grant")],
- "frames": {"regX": 82, "height": 292, "count": 64, "regY": 0, "width": 165},
- "animations": {
- "run": [0, 25, "run", 1.5],
- "jump": [26, 63, "run"]
- }
-})
-
-var grant = new createjs.Sprite(spriteSheet, "run");
-
-
-```
-
-人物用到`Sprite`类,精灵图存放在`SpriteSheet`中,刚才用**flash** + **zoe** 生成的json,可以直接传入到`SpriteSheet`初始化对象中。
-
-还可以直接使用代码`gotoAndPlay('run')`来进行动作间的切换。
-
-
-6. 元素加入舞台
-
-```
-stage.addChild(sky, hill, hill2, ground, grant);
-
-```
-
-7. 让物体动起来
-
-```
-createjs.Ticker.setFPS(30);
-
-createjs.Ticker.addEventListener("tick", handleTick);
-function handleTick(event) {
-//物品移动逻辑
- stage.update();
-}
-
-```
-
-
-## 知识点
-
-
-### 开启鼠标检测
-
-```
-stage.enableMouseOver(20);
-```
-
-
-### 开启触摸
-
-```
-createjs.Touch.enable(this.stage)
-```
-
-### Request Animation Frame
-
-```
-createjs.Ticker.timingMode = createjs.Ticker.RAF;
-```
-
-
-### 缓存
-
-```
-shape.cache(x,y,width,height)
-```
-
-
-### Mask
-
-```
-bmp.mask = star;
-
-```
-
-### 碰撞检测
-
-```
-myShape.hitTest(x,y)
-```
-
-
-## 参考
-
-
-1. [http://createjs.com/](http://createjs.com/)
-2. [https://github.com/CreateJS](https://github.com/CreateJS)
-3. [https://github.com/tonistiigi/audiosprite](https://github.com/tonistiigi/audiosprite)
-
-
-
-
-
-
-
-
-
-
-
diff --git a/source/_posts/2016-03-04-can-we-use-base64-in-h5-webapps.md b/source/_posts/2016-03-04-can-we-use-base64-in-h5-webapps.md
deleted file mode 100644
index c04a4a426d..0000000000
--- a/source/_posts/2016-03-04-can-we-use-base64-in-h5-webapps.md
+++ /dev/null
@@ -1,178 +0,0 @@
-title: 图片资源Base64化在H5页面里有用武之地吗?
-subtitle: 本文使用performance接口和Timeline工具,测试和分析了不同场景下引用base64化的图片资源对渲染性能的影响,旨在抛砖引玉,找出图片资源的base64化在H5应用中使用的可行性。
-cover: https://img12.360buyimg.com/ling/jfs/t1/84687/37/2706/41340/5d09e939Efd413a9f/4ca7b50baedd3fbb.jpg
-categories: 性能优化
-tags:
- - base64
- - h5
-author:
- nick: Simba
- github_name: Simbachen
-date: 2016-03-04 17:45:03
----
-
-将图片资源转至base64格式后可直接放入页面作为首屏直出,也可以放入css文件中,减少请求,以加快首屏的呈现速度。
-不过图片base64化,将带来一个臃肿的html或css文件,是否会影响页面的渲染性能,浏览器又支持如何呢?
-
-### 如何统计?
->通过Navigation Timing记录的关键时间点来统计页面完成所用的时间,并通过Chrome开发工具来跟踪细节
-
-
-```javascript
-var timing = window.performance.timing
-timing.domLoading //浏览器开始解析 HTML 文档第一批收到的字节
-timing.domInteractive // 浏览器完成解析并且所有 HTML 和 DOM 构建完毕timing.domContentLoadedEventStart //DOM 解析完成后,网页内资源加载开始的时间
-timing.domContentLoadedEventEnd //DOM 解析完成后,网页内资源加载完成的时间(如 JS 脚本加载执行完毕)
-timing.domComplete //网页上所有资源(图片等) 下载完成,且准备就绪的时间
-
-```
->以上定义来自[chrome官方文档](https://developers.google.com/web/fundamentals/performance/critical-rendering-path/measure-crp?hl=zh-cn),在其它环境下也许会有差异,从测试结果看,下面的build时间在android+微信环境中一直是0,对此可能是因为渲染机制差别,此处不做深入测试。除osx+chrome之外环境的数据仅作参考。
-
-```javascript
- build = timing.domComplete - timing.domContentLoadedEventStart //间隔记录网页内资源加载和呈现时间。
- complete = timing.domComplete - timing.domLoading //页面接收到数据开始到呈现完毕的总时间。
-
-```
-
-## 场景1,内嵌至css文件中
-#### 1、原生引入图片链接做背景图
-
-一张大小为**50kb**的**jpg格式**图片,应用到9x15=135个dom做背景图,模拟雪碧图的模式,多个节点引用同一张图片做背景,(示例)如图。
-
-`测试环境`:Mac OS X EI Capitan 10.xx + Chrome 48.xx
-`其它辅助测试机器`: iPhone 6 plus iOS 9.xx; 魅族Note Android 4.xx
->实际使用过程中,其它版本和机型的Android手机还有待测试
-
-
-关闭缓存状态下,build:150ms | complete: 200ms(总时间受网络状态等因素影响,数据做比较用)
-
-
-开启缓存状态下,build: 7ms | complete: 59ms(包括以下稳定状态下多次测试的平均值,截图为最接近平均值的状态,默认数据来自Mac+Chrome[48.XX版本])
-
-
-
-| 测试环境 | build(单位:ms) | complete(单位:ms) |
-| :-------- | :--:| :--: |
-| OS X+Chrome | 7 | 59 |
-| iOS+微信 | 45| 90 |
-| OS X+Safari | 50 | 100 |
-| Android+微信 | 0| 120 |
-#### 2、引入base64格式图片做背景图
-
-将上面50kb大小的jpg图片转换为base64格式,加在css文件中。
-
-关闭缓存状态下,build:80ms | complete: 280ms
-
-
-开启缓存状态下,build: 160ms | complete: 210ms
-
-
-
-
-| 测试环境 | build(单位:ms) | complete(单位:ms) |
-| :-------- | :--:| :--: |
-| OS X+chrome | 160 | 210 |
-| iOS+微信 | 35| 100 |
-| OS X+Safari | 9 | 90 |
-| Android+微信 | 12| 150 |
-
-
-#### 3、调整图片体积
-调整上面图片的(压缩品质)体积,base64化后,对应的css文件大小也跟着改变
-
-| 图片大小 | 10kb | 20kb |45kb | 100kb|180kb|
-| :-------- | :--------:| :--: |:--: |:--: |:--: |
-| 对应css文件大小 | 27kb | 42kb | 76kb | 150kb | 260kb
-| Rendering时间 | 30ms| 46ms | 81ms | 156ms | 258ms|
-
-
-#### 4、调整引用次数
-
-50kb大小的图片,base64化后,调整引用图片做背景图的dom的个数
-
-| 引用次数 | 10 | 20 |50 | 100|135|
-| :-------- | :--:| :--: |:--: |:--: |:--: |
-| Rendering时间 | 15ms| 19ms | 44ms | 74ms | 83ms|
-
-
-#### 分析和小结:
-
-在OSX+Chrome环境下,将50kb的图片base64后放入样式中,build过程拉长了约20倍,使用Timeline工具可以看到,计算样式阻塞了整个过程。
-
-
-
-
-
-
-1. 比起直接引入图片地址,css文件中引入base64格式的图片对样式渲染的性能消耗明显,如果大量使用,会带来耗电和发热的问题,需谨慎使用。
-2. Rendering消耗的时间同css文件大小、引用次数几乎成正比(未测试其它极限情况),在网络条件优质的4G环境,50~70ms的RTT(往返时延)情况下,通常移动网络的状况会更差,对于首屏优化,合适的使用还是很值得的。
-3. 图片转成base64编码后,文档大小较原文件大了一些,而经过 gzip 后两者几乎没有区别。
-
-
-
-## 场景2,内嵌至js文件中
-
-#### 1、原生方式直接加载多张图片
-
-大小10~70kb共9张图片。总大小约300kb
-
-关闭缓存:build: 300ms | complete: 310ms
-
-
-开启缓存:build: 110ms | complete: 120ms
-
-
-
-| 测试环境 | build(单位:ms) | complete(单位:ms) |
-| :-------- | :--:| :--: |
-| OS X+Chrome | 110 | 120 |
-| iOS+微信 | 50| 100 |
-| OS X+Safari | 148 | 150 |
-| Android+微信 | 50| 100 |
-
-#### 2、转换成base64格式,合并请求
-
-将上面的图片转成base64后,放在js文件中,加载进来。
-
-关闭缓存:build: 0ms | complete: 400ms
-
-
-
-开启缓存:build: 0ms | complete: 80ms
-
-
-
-| 测试环境 | build(单位:ms) | complete(单位:ms) |
-| :--------: | :--:| :--: |
-| OSX+Chrome | 110 | 120 |
-| iOS+微信 | 0| 35 |
-| OS X+Safari | 7 | 70 |
-| Android+微信 | 0| 250 |
-#### 3、比较不同网速下同步请求和合并请求的加载效率
-使用上述1、2的测试demo分别在3G、4G网速条件下测试结果如下:
-
-- 在网络环境差的情况下,合并请求明显缩短了整个加载时间;
-- 在网络环境较好的WIFI和4G下则差别不大。
-
-| 测试环境 | 图片直接加载 complete(单位:ms) | base64合并请求 complete(单位:ms) |
-| :--------: | :--: | :--:|
-| 3G | 6000 | 4500 |
-| 4G | 450 | 400 |
-| WIFI | 320 | 340 |
-
-#### 分析和小结:
-base64后的的js资源达381kb,在一个线程里加载,消耗大量时间,从统计结果看,在渲染性能差异上并没有场景1那么明显。
-但有缓存的情况下,页面渲染完成的速度甚至更快。
-从Timeline里看到细节,解析这个近400kb的js文件对整个渲染过程造成了一定压力,不过总共40ms的解析时间是完全可以接受的。
-
-
-
-
-1. 从html里直直接引用图片链接和base64图片对渲染性能的影响几乎没有区别,在网络条件差的情况下,合并请求却能大大提高加载效率;
-2. 直接引用至html,无法缓存,将base64后的图片资源放在js文件中管理,方便设置缓存。
-3. 有一个缺点就是图片资源base64化需要扩展构建工具来支持。
-
-## 使用建议
-1. 图片资源的base64编码进css文件会带来一定的性能消耗,需谨慎使用。
-
-2. 将图片资源编码进js文件中,管理和预加载H5应用的图片资源,合理的合并请求可以大大提高页面体验。
diff --git a/source/_posts/2016-03-09-img-loading-optimization-in-mobile.md b/source/_posts/2016-03-09-img-loading-optimization-in-mobile.md
deleted file mode 100644
index b71622657f..0000000000
--- a/source/_posts/2016-03-09-img-loading-optimization-in-mobile.md
+++ /dev/null
@@ -1,129 +0,0 @@
-title: "让图片加载这件事儿变得更美好"
-subtitle: "图片是触屏页面让人赏心悦目的重要元素之一。而对图片资源的加载渲染将影响页面呈现,处理好图片加载才能给用户更好的体验。"
-date: 2016-03-09 17:38:02
-cover: https://img30.360buyimg.com/ling/jfs/t1/42715/16/6913/5475/5d085271Ebadb3707/ea2ee649077af52b.png
-categories: 性能优化
-tags:
- - Images
- - Load
- - optimize
- - Mobile
-author:
- nick: Ting
- github_name: Tingglelaoo
----
-如果你问我构建触屏页面的过程中有什么困难的?
-我可以拍着胸口跟可以跟你讲,有三大问题!那就是图片、图片、图片。
-尤其是面对活动运营侧的需求的时候,连妈妈都要问我为什么要跪着做需求。
-一个萝卜一个坑,总有一个萝卜适合你的坑。今天就来让图片加载这件事儿变得更美好,让用户跪倒你的石榴裙(牛仔裤)下。
-
-## 图片优化的一般方法
- 在本文正式开始之前,笔者先提提图片优化的一般方法,了解图片优化的方法有助于理解后面图片加载实现形式的多样化。
- 一般常见的图片优化方法有:
-- 减少文件体积大小
-- 减少图片资源请求数(合并HTTP请求)
-
-### 减少图片文件体积大小
-可以从
- - 压缩优化图片大小
- - 采用合适的图片格式
-
-两个途径来进行对体积大小的优化。
-这里推荐阅读[《Web性能优化:图片优化》](http://cabbit.me/web-image-optimization/),博主在文中讨论如何更优地选择图片的恰当格式以及推荐了优化图片大小的工具。
-
-### 减少图片资源请求数(合并HTTP请求)
-减少图片资源请求数(合并HTTP请求)的途径除了最为普遍的
- - 合成雪碧图
-
-还有
- - 使用DataURL
-
-这里特别提下,采用DataURL这种方式将图片被转换成base64编码的字符串形式的,如果单纯地“嵌”入HTML中是不会被缓存的,但是加在CSS或JS文件中,通过缓存CSS或JS则达到了间接缓存以base64编码的图片。
-这里推荐一个将图片转换成Base64编码的字符串的在线工具: [DataURLMaker在线工具](http://dataurl.net/#dataurlmaker)
-因为本文的重点不在于讨论图片优化的内容,所以这里就简单总结下对图片进行优化的方法,对于更详细的内容,笔者则按下不表了。
-对于触屏页面中常见的的图片资源加载方式,笔者归纳为三类:正常加载、预加载、懒加载。
-
-## 正常加载
-所谓正常加载,则是开发者不采用人为地方式去干扰,按照浏览器正常加载的方式去加载渲染页面。
-适合采用正常加载的方式的情景是图片数量较少以及图片体积较小,对触屏页面呈现的用户体验不影响或影响较少。
-但是在现有的大环境中,限制于网络宽带等客观的因素,而且触屏页面的华丽炫目的设计都需要依靠图片,单纯的CSS是无法满足要求的,对图片的应用还是有一定量。
-所以,能够毫无顾忌地采用正常加载的方式的案例还是比较少的,目前笔者暂时是没有见过。
-
-## 预加载
-在触屏页面处理中最为常见的可以是说预加载,几乎每个触屏页面的案例都使用到了这种方式。
-为了完整地呈现页面给用户,开发者会通过一定的技术预先加载图片资源(以及页面其它资源),等加载渲染完毕再把页面呈现给用户。
-而根据这个预加载的过程是否有明显的进度提示,笔者把常见的预加载方式划分为两种形式:
-- 显性预加载
-- 隐性预加载
-
-### 显性预加载
-显性预加载指的则是处于预加载过程时页面有明确的加载提示,比如进度条或者是Loading图标。
-譬如,我厂的触屏页面案例《点燃你心中的野兽》,在预加载过程提示加载的进度,让用户有个心理预期,减少等待的烦躁感。
-
->以下截图来源自京东的[《点燃你心中的野兽》](http://wqs.jd.com/promote/CH77/2015/paper/index.html)
-
-
-
-这个案例下的预加载处理技术是,先把页面DOM结构放入JS模版中,预加载完成后再把页面从JS模版拎出来,页面渲染完后能够完整地呈现页面给用户。
-其中,图片资源相关预加载处理代码段为:
-```javascript
- PreLoad.prototype.image = function(a) {
- var b = document.createElement("img");
- b.src = a
- ...
- }
-
-```
-
-通过创建image元素,设置其src,就简单方便可以预先发起HTTP请求,实现预加载图片。
-除了对png/jpg等格式图片能够利用以上方法实现预加载,对于DataURL转换图片为base64编码的字符串也能够实现预加载。
- 在Adidas的《罗斯·决不凋谢》中,利用DataURL协议将图片转换成base64编码的字符串写入JS中,预加载JS文件完成后通过JS来进行内联在DOM元素中。
-> 以下截图来自案例[《Adidas:罗斯·决不凋谢》](http://drose6.adidasevent.com/])阅读。
-### 隐性预加载
-除了明确的预加载提示,还有一种是通过推进触屏页面进度的趣味互动的方式,笔者称之此种类似的情况为隐性预加载。
-
-> 截图来自案例[《大众点评:阿惠故事1 - 吃饭别带姥爷》](http://evt.dianping.com/market/20151207/)快速地呈现部分画面(截图右部分)给用户,再通过互动(向上滑动数钱)来继续分段加载资源。这样的做法一改用户往日沉闷的等待,能够给予用户更好的体验。
-
-还有一个比较特别的案例是大众点评和欧莱雅合作的《好年从头开始》,笔者也将之归纳为隐性预加载。
-
->截图来源于案例[《大众点评:好年从头开始》](http://evt.dianping.com/midas/160108-loreal/index.html)
-
-
-
-
-
-在这里,开发者先预加载了部分图片以呈现首屏画面给用户,同时图片预加载依然在进行,当用户触发的页面内的图片资源还未加载完时则会显示进度条,加载完毕则可以进入下一个画面。
-
-笔者觉得采用这种方式的原因有二,第一,页面内容需要加载的资源过多,若等待全部加载完毕所需时间耗费过长,容易导致流失用户;第二,页面内容足够吸引,即时在交互过程中插入等待过程,用户也愿意去等待。
-
-## 懒加载
-
-懒加载,又称为延迟加载、按需加载。指的是图片在页面渲染的时候先不加载,页面渲染完成后在指定动作触发后再加载图片。
-这种方式通常比较合适于篇幅较长的页面,并且图片内容的重要性低于页面信息内容,能够快速地先将重要的页面信息呈现给用户。
-譬如,这种方式则应用于电商商品信息集合页面,同时也常用于文章阅读的情景下。除了在移动端的应用场景之外,在PC端懒加载也是应用最广泛的一种图片加载优化方式。
-最为常见的一种懒加载技术是以可见距离作为触发点。当页面滑动到屏幕可见区域时,则进行加载图片。实现的原理是:
- - 先将图片的实际src,记录在data-set属性中。
- - 监听屏幕滚动,计算图片的Y坐标,并计算可视区域的高度height,当Y小于等于(height+scrollTop)时,图片的src的值用data-src的来替换,从而来实现图片的懒加载。
-
-具体可以前往[拇指期刊](http://jdc.jd.com/h5/case/maga.html)点击文章阅读体验喔。
-
-## 写在最后
- 希望这篇文章能够带给读者一些启发。并不是某一种案例只使用一种加载方式。同时,也不是触屏页面的加载方式仅限于以上方法之一。
- 这里仅是列举并讨论常见的加载方式,凡事讲究实践出真知,在实践的时候必然会有更加切合具体案例的好方法。
- Keep Moving,在触屏页面的开发中,兴许还有更多更优秀的图片资源加载方式等着我们去发掘。
-
-> 文中案例搜集均来源于[数英网](http://www.digitaling.com/projects):)
diff --git a/source/_posts/2016-03-15-jcloud-sum.md b/source/_posts/2016-03-15-jcloud-sum.md
deleted file mode 100644
index 4530ec2497..0000000000
--- a/source/_posts/2016-03-15-jcloud-sum.md
+++ /dev/null
@@ -1,146 +0,0 @@
-title: 某超长文档的探索之路
-subtitle: 加量不加价~ 比字数谁都赢不了我!
-date: 2016-03-15 16:18:00
-cover: https://img14.360buyimg.com/ling/jfs/t1/81553/15/2270/396092/5d085648Ee47b04b1/633cbe7c5c08b71e.png
-categories: 项目总结
-tags:
- - jcloud
- - sum
-author:
- nick: Littly
- github_name: Littly
----
-
-所谓的文档, 大概就是指那种洋洋洒洒写了不下几万字, 最后没有多少人会看完的东西. 对, 比技术不一定, 但比字数谁都赢不了我!
-
-
-
-这次京东云改版的项目, 除了需要搭建一个放置京东云文档的平台, 还包括了文档录入的工作. 之前使用[**Hexo**](http://hexo.io)做过[**HaloJS**](http://aotu.io/halojs/)的文档平台, 在文档录入的时候并没有碰到太多问题. 本以为搭建文档页面也就仅此而已, 直到碰到了长达104页的doc文档...
-
-
-### 搭建框架
-
-不同于其他零散的页面, 文档页面是一整个系列的, 具有相同的页面结构. 页面头部, 底部, 导航等组件. 如果像平时制作静态页面那样每个页面都从一个空白的模板html文件开始下手, 在开发量达到一定程度的时候, 页面整体的维护就会非常困难. 首先是无法很痛快地进行某些公共模块的修改: 就算只是在底部加多一个链接, 或者在导航中删除一个条目, 我们都需要对每个页面都进行手动修改. 另外, 页面的资源管理会越来越难. 每个页面都需要引用整体页面的样式文件与脚本文件, 还都有页面私有的样式文件, 脚本文件, 还有图片文件等. 如果这些资源共用一个文件夹, 有时候就会面临文件命名的难题.
-
-如上面说, 文档页面可谓是重复工作最严重的一种页面. 好在搭建框架的小伙伴非常给力, 使用了同样很给力的开源的前端工程化开发工具[Athena](https://github.com/o2team/athena),自带支持代码热更新的预览服务, 自带压缩代码, 编译sass/less的工具, 自带上传sftp的工具等等. 而对于这个需求来说, 最好用的莫过于ejs模板语法的支持了. 有了模板, 公共的组件在不同页面都可以随意引用, 工作量减少了非常多.
-
-每个页面都由组件组成, 平时写页面的时候只需要点名引用需要的组件. 搭建完成后, 使用Athena工具的build命令, 就可以将页面的静态文件输出. 对于这批文档的页面, 每个页面会被拆分为头部组件, 底部组件, 导航组件. 如果开发过程中某个组件产生变化, 只需要直接修改组件, 再重新运行build命令, 就可以使每个引用了这个组件的页面都一起变过来, 可谓十分方便.
-
-### 录入文档
-录入文档可能是这一整个需求最痛苦的工作了. 一百多页A4纸大小的DOC文档, 还需要依据设计稿重新设置样式, 是十分机械化的工作. 在这里, 我的小伙伴将文档中的不同样式建立为不同的组件, 比如一级标题组件, 或是二级标题组件等等. 这些组件使用起来就像下面这样:
-
-```html
-<%= widget.load('doc_mod_list3', {
- title1: '操作指南',
- item1: ['挂载云硬盘','绑定公网IP','常见问题','主机数量','监控报警','删除云主机','绑定监控报警','重置密码','制作镜像'],
- title2: '常见问题',
- item2: ['主机数量','监控报警','删除云主机'],
- item3show: false
-}) %>
-```
-
-组件本身是一个ejs模板:
-
-```html
-
-```
-
-这样一来, 我们写页面的工作, 变成了写ejs组件, 再用widget.load函数加载自定义的组件, 用getCSS/getJS函数调用对应的css/js文件资源. 把页面中比较通用, 复杂的组件拆分出来, 有利于将页面模块化, 代码复用可以更爽快.
-
-#### 思考
-具体到这个项目, 文档录入是个非常痛苦的活. 按照目前的方案, 文档里面的一级标题, 二级标题, 正文, 图片等, 都是由组件构成, 像`xxxx
`这样的简单代码, 也被做成了组件. 个人认为这样的做法不太科学. 这种太过细小的组件反而使录入文档变成了十分痛苦的事情. 上面所说的情况, 一个标签可以解决的问题, 变成引用组件的工作后, 代码量并没有多少差别:
-
-```html
-
-
- <%= title %>
-
-
-
-<%= widget.load('doc_mod_title3', {
- title: '京东云入门手册'
-}) %>
-```
-
-左边是引用组件的写法, 右边是组件内部的代码. 可以看见, **过度模块化导致了细小组件的产生**. 这里应该有更加方便的做法.
-
-Python中有个第三方模块docx2html, 实现了将docx文件转化为html代码的功能, 并且转化完的代码十分纯净, 只有html结构与内容, 不带样式, 很适合在导出后再重置样式. 针对这个项目, 我们可以做个小改造, 每个页面依然由头部, 导航还有底部组成, 而文档内容则可以定义一个css类`doc_mod_content`, 表示其中是文档的内容, 而文档的各种样式, 则写在这个类的后代选择器上. 如果标签的种类无法满足区分特定节点的需要, 还可以通过编辑器的搜索替换功能去批量添加特定的类. 这样的话, 首先是少去了开发组件的工作, 文档的录入也会轻松很多. 遗憾的是, 由于时间紧迫, 这个需求并没有使用这种方式. 过后有机会可以尝试. 文档录入本来就该是个轻松的活.
-
-### 导航优化
-对于普通的页面, 侧导航跟页面主体并不需要分开, 直接放置即可, 就像hexo的[文档页面](https://hexo.io/api/)一样. 但前面说过, 文档页是非常长的. 对于这种超长的页面, 使用上述的实现方式, 有可能会出现滚动到页面内容中间, 看不见导航的窘迫局面.
-
-
-
-看见这种情况, 产品的小伙伴就该找我们了. 重构哥哥, 我想让导航始终在视野里面. 你能实现不?
-Of Course! 只需要把导航栏设置为position: fixed就ok了. 不过对于这种页面中同时还存在头部与底部的页面, 会比较麻烦. 跟交互的童鞋商量过后, 我们把方案确定了下来. 具体而言, 侧导航共有三种状态:
-
-1. 导航条尚未滚动到页面顶部的状态, `position: static`
-2. 导航条滚动到超出页面顶部的位置, `position: fixed`
-3. 导航条底部与页面内容的底部对齐, `position: absolute; bottom: 0`, 或者使用JS控制导航条的底部对齐页面内容底部.
-
-再具体一点说, 这三种状态的触发条件分别是:
-1. 页面滚动距离 < 导航距离顶部的距离
-2. 页面滚动距离 > 导航距离顶部的距离 && 页面滚动距离 < 内容的高度 + 内容距离顶部的距离 - 导航条的高度 + 导航条的滚动距离
-3. 剩下的情况.
-
-就算如此, 这样的实现还是会有一些问题存在, 比如在跳转到某个页面之后, 导航的高亮条目不一定会在视野中, 这会导致在不同页面间跳转的过程中, 导航条不固定, 找不到高亮条目的尴尬.
-
-
-
-
-在当前实现方式下, 并没有特别好的办法能解决这种情况. 不同页面的长度不是相同的, 导航的位置跟页面的位置关系处于上面三种状态中的哪一种也是难以预测的, 就更没办法将导航移入视野中了. 说到底, 这种情况都是由于页面和导航太长导致的. [腾讯云](http://www.qcloud.com/product/cvm.html)的文档页面也是这样处理的.
-
-
-#### 思考
-
-那么, 在不缩短页面导航的情况下, 有没有办法做好这样的页面的效果呢? 答案是有的, 并且不止一种.
-
-首先, 有一种比较折中的方案(当然, 要先问问产品的小伙伴同不同意), 把导航中的高亮条目抽出来放到导航的第一位. 参考各种基于JSDoc3的文档页面. 下面是[PIXI](http://pixijs.github.io/docs/)的文档:
-
-
-
-
-放到项目中的话, 这种办法大有曲线救国的味道: 不惜修改几十个页面中的导航顺序来达成高亮条目的固定. 这种机械化的工作, 做起来已经很累人. 如果做完后产品的小伙伴对效果不满意…. 是的, 还得几十个页面一个一个的改回来. 当然, 我们也可以预先把老版本备份一下, 不满意了就直接覆盖文件完事. 这一切做起来是那么的麻烦. 但如果是搭配着[Athena](https://github.com/o2team/athena)工具使用, 就简单多了. 导航栏组件中用数组menu来储存导航栏条目信息, 只需要用forEach就可以输出所有的菜单项. 如果要将高亮条目与第一项对调, 只需要一句话就完事:
-
-```js
- // var menu, curIdx;
- menu.unshift(menu.splice(curIdx/*高亮条目的索引*/, 1)[0]);
- // menu.forEach(function (val, idx) {...});
-```
-
-是不是有点爽?
-
-上面这种方法, 说实话是有点不完美的. 用户当然不希望侧导航的位置一直不固定. 在这里, 我们可以使用页面局部刷新技术来规避这个问题. 如果能够在跳转到其他文档的时候不刷新页面, 而是在脚本中通过异步请求获取到新的文档的内容. 这个内容可以是json, 也可以是一个html文档, 甚至是一个html片段. 过后我们再将其用合适的姿势展示在右侧内容区. 结果上看, 页面仅仅是刷新了内容区, 导航位置不会改变, 比起之前的版本, 效率还会更高.
-
-### 感悟
-这个项目做下来, 最后还是留下了一些遗憾的地方. 迫于时间, 感觉手头还有很多的技术没用上, 或者还有许多的方案没实现. 要做好一个项目, 还是需要从项目一开始就与产品, 交互, 视觉等业务上游团队保持良好的沟通, 对整个项目拥有相当的了解, 闭门造车不可取, **用户体验**才是王道.
\ No newline at end of file
diff --git a/source/_posts/2016-03-16-optimization.md b/source/_posts/2016-03-16-optimization.md
deleted file mode 100644
index 773b0a6e65..0000000000
--- a/source/_posts/2016-03-16-optimization.md
+++ /dev/null
@@ -1,446 +0,0 @@
-title: 前端优化不完全指南
-subtitle: 暖妹子の前端优化不完全指南来袭,救赎众生啦~~快来瞧瞧~
-cover: https://img20.360buyimg.com/ling/jfs/t1/47851/1/2756/122055/5d09d6b9Ee91298f5/8cc92eb6311cc7a6.png
-categories: 资源合集
-tags:
- - 工作效率
- - 速度性能
- - 安全性
- - 响应式
- - 兼容性
- - 搜索SEO
- - 信息无障碍
- - 前端优化
-author:
- nick: 暖暖
- github_name: Newcandy
-date: 2016-03-16 15:26:12
----
-篇幅可能有点长,我想先聊一聊阅读的方式,我希望你阅读的时候,能够把我当作你的竞争对手,你的梦想是超越我。你想超越我,就得了解我懂什么对吧,好,开始阅读~ ~ 哈哈哈 ~ ~ ~
-
-历时144000000毫秒出山的前端优化篇,若你问我有什么感悟?
-那我告诉你,看到毫秒啊,火箭啊,这些与优化相关的词,都有莫名的亲切感。
-本文主要从**工作效率**、**速度性能**、**稳定性**、**响应式**、**兼容性**、**搜索SEO**、**信息无障碍**等方面进行讲解。
-前端优化是一个让人技术提升的point,希望你也能从这里学到一些东西。
-
-
-
-## 1 工作效率
-
-你是否经常处于这样的场景:从早上忙到晚上八九点,一会与产品经理沟通,一会在部门群聊一下新奇的东西,一会被设计美眉纠缠住拖不了身,有时还开不了部门的会议因为页面急着上线,然后继续加班~~~
-
-怎么提高我们的工作效率?下面从四个方面讲解:
-
-* 时间管理
-* 利用工具
-* 经验和阅历
-* 使用新技术
-
-### 1.1 时间管理
-凡是时间管理,都会联想到计划这个词。我们先看看别人家的月计划表和周计划表,之所以周计划表为空,是希望你能把它下载并打印出来,行动从计划开始:
-月计划表:
-
-周计划表:
-
-
-当然计划不要做得过于琐碎,且不要占用自己太多时间。做好计划之余,在执行过程中需要注意几点:
-* **正确的时间点做正确的事,比如早上比较精神,可选择比较难的项目开展,可容易达到高效率**。
-* **专注一件事情,尽量不要被琐碎或其他事情影响,而且不要频繁地去看计划表,最好是做完一件再去看,否则容易焦虑导致无法专心**。
-
-### 1.2 利用工具
-第一样工具,比如程序员杯子:
-
-
-利用工具有什么好处呢?
-* 减少重复性工作。
-* 减少繁琐工作流程,一键式化。
-
-#### 1.2.1 编辑器
-选择好一个前端编辑器是比较重要的。目前sublime、webstorm和vim是比较常见的,建议不使用Dreamweaver。
-sublime目前还是不错的选择,可以安装插件,比如BracketHighlighter 高亮显示、JsFormat、Emmet html/CSS快速编辑以及DocBlockr插件,快速输入jsDoc注释等,还可以自定义代码段snippets。
-无论你使用哪种编辑器,你需要的是**熟悉这个编辑器并熟练它的快捷键**。
-
-#### 1.2.2 浏览器开发者工具
-作为前端人员,首选的浏览器当然是chrome。推荐阅读[Chrome开发者工具不完全指南](http://web.jobbole.com/82558/)一系列文章,它从一些基础的功能开始到它的一些高级性能分析器(Timeline、Profiles),熟悉chrome对我们的开发工作有很大的作用。
-
-#### 1.2.3 其他常用工具
-切图工具:[photoshop cc切图之智能切图](http://jingyan.baidu.com/article/e73e26c0c9971524adb6a7a6.html)、 [cutterman](http://www.cutterman.cn/v2/cutterman)
-量色、测距工具:FastStone Capture、[马克鳗 - 设计稿标注](http://www.getmarkman.com/)
-图片压缩:[tinypng](https://tinypng.com/)、[智图](http://zhitu.isux.us/)
-生成雪碧图:[spritebox](http://www.spritebox.net/)、[CSS Sprite Generator](http://www.cn.spritegen.website-performance.org/)、cssgaga
-调试工具:Fiddler 、weinre 、微信调试工具;
-
-#### 1.2.4 前端工程化
-凡是重复的,必须使用工具自动完成。
-工具众多,我们就有一种想法,能不能有一种工具能帮我们自动生成雪碧图、 css压缩、图片压缩等等,然后就出现了前端工程化。前端工程化一般可分为五个步骤:
-(1) 初始,生成基础目录结构和样式库。
-(2) 开发,实时预览、预编译。
-(3) 构建,预编译、合并、压缩。
-(4) 发布,将构建后静态文件发布上线。
-(5) 打包,资源路径转换,源码打包 。
-
-这里推荐一个工具[fis](http://fis.baidu.com/),解决前端开发中自动化工具、性能优化、模块化框架、开发规范、代码部署、开发流程等问题。还有凹凸实验室研发的[athena](http://aotu.io/athena/),O2Team构建项目流程工具,可以生成相应目录和代码,同时对项目进行编译, 一次安装,到处运行。
-
-### 1.3 阅历和经验
-我所理解的程序员兼并聪明以及“懒惰”精神,推崇懒惰式开发,即把问题理解清楚,确保将要写的代码能真正的解决问题,这将会避免之后写出大量无用的代码,正所谓“懒”出效率。
-我们的阅历和经验可以大大提高开发效率,思考代码的时间增加从而选出最优方案,因此写代码速度更快以及代码长度更短,对问题的透彻理解使调试代码的速度也更快。
-根据阅历和经验,或借助其他人的,我们进行整理从而形成自己或团队的规范,这可大大提高我们的写码速度。
-
-### 1.4 使用新技术
-使用新技术如何提高我们的工作效率。一贯我们都使用我们熟悉的技术去开发一个技术处理方案,毕竟学习新技术的时间成本还是存在的。但是还是不能忽略一些新技术的存在,一般新技术包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率,比如ES6。**用你的慧眼去积累新技术,会派上用场的**。
-
-## 2 速度性能
-
-为什么需要前端性能优化?性能优化可以从哪几个方面入手?
-遇到一个页面,5秒还没加载完成,那个菊花转啊转,或者页面完全白屏,那简直把人逼疯了。从用户体验的角度看,前端性能优化是非常有必要的。网页最长加载时间一般不能超过3秒。
-首先我们需要确定网页的性能指标,可量化的目标以及可持续跟踪的优化数据是性能优化工作得以持续进行的保障,同时也是源动力!比如:
-* 首屏加载时长
-* DOM加载时长
-* 页面白屏时长
-
-我们一般通过三种方式来检验我们的网页性能:
-* 通过浏览器开发者工具或浏览器插件、Fiddler、Charles等查看页面加载情况。原理是通过追踪HTTP请求与响应的时间,以图形的方式列出所有资源的下载情况。缺点是人为操作,难以实现批量测试与统计。
-* 在页面中引入额外的代码钩子来记录时间等相关数据。缺点是加重了开发者与测试人员的负担,还有可能因为检测代码本身的潜在问题影响页面的性能。如果好一点的话,会接入一个性能数据收集系统,采取并分析数据。
-* 使用第三方的工具如Page Speed、YSlow和WebPagetest,能够选择在不同浏览器和不同地域进行测试,并且给出各方面的评分以及提供一些优化建议。但某些服务需要排队等待,并且难以实现批量测试与统计。下面是使用WebPagetest测试京东首页的情况:

-
-可喜可贺,W3C推出了一套**[性能API标准](https://www.w3.org/wiki/Web_Performance/Publications)**,目的是简化开发者对网站性能进行精确分析与控制的过程,最终实现性能的提高。比如通过Navigation Timing记录的关键时间点来统计页面完成所用的时间,部分使用方法:
-
-```javascript
-var timing = window.performance.timing
-timing.domLoading //浏览器开始解析 HTML 文档第一批收到的字节
-timing.domInteractive // 浏览器完成解析并且所有 HTML 和 DOM 构建完毕
-timing.domContentLoadedEventStart //DOM 解析完成后,网页内资源加载开始的时间
-timing.domContentLoadedEventEnd // DOM 解析完成后,网页内资源加载完成的时间(如 JS 脚本加载执行完毕)
-timing.domComplete //网页上所有资源(图片等)下载完成,且准备就绪的时间
-```
-
-**持续追踪性能数据,要选择合适的页面性能测量工具或API,一旦选定后,不再更换,以保证历史数据的可参照性。**我们还要形成一种意识,达成性能联盟小组,对于重要的业务或者页面,一定要从性能的角度考虑问题,有理有据地拒绝有损于前端性能的业务需求或改动。
-
-人人都知道雅虎军规,那我就来个截图吧!
-
-
-
-以下,我们从服务端、网络、客户端三个方面来一一突破速度性能的提升。
-
-### 2.1 没事少烦我-服务端
-
-#### 2.1.1 使用内容分发网络(Content Delivery Network,CDN)
-通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的 cache服务器内,通过DNS负载均衡的技术,**判断用户来源就近访问cache服务器取得所需的内容**。深圳用户访问遥远的美国服务器,当然不理想了。把静态内容分布到CDN可以减少用户响应时间20%或更多。
-#### 2.1.2 静态资源缓存,移动端离线缓存
-如果可以减少服务端的负担,在应用离线时可使用资源或加载资源更快,岂不乐哉?
-缓存利用可包括:添加 Expires 头,配置 ETag,使 Ajax 可缓存等。其实,恰当的缓存设置可以大大的减少 HTTP请求,也可以节省带宽 。
-* 配置 ETag:即If-None-Match: 上次 ETag 的内容。浏览器会发出请求询问服务端,资源是否过期;服务端发现,没有过期,直接返回一个状态码为 304、正文为空的响应,告知浏览器使用本地缓存;如果资源有更新,服务端返回状态码 200、Etag 和正文。这个过程被称之为 HTTP 的协商缓存,通常也叫做弱缓存。
-* 添加 Expires 头:服务端通过响应头告诉浏览器,在什么时间之前(Expires)或在多长时间之内(Cache-Control: Max-age=xxx),不要再请求服务器了。这个机制我们通常称之为 HTTP 的强缓存。一般会对 CSS、JS、图片等资源使用强缓存,而入口文件(HTML)一般使用协商缓存或不缓存。
-* AppCache:
-
- AppCache主要利用manifest 文本文件,告知浏览器被缓存的内容以及不缓存的内容。

-
- manifest 文件可分为三个部分:
- (1) CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存,等价于CACHE
- (2) NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓存
- (3) FALLBACK - 在此标题下列出的文件规定当页面无法访问时的回退页面
-
- 使用AppCache方案的步骤:
- (1) 整理出需要缓存的静态文件列表,如juqery.js和gb.css。
- (2) 配置服务器支持。
- (3) 确定内容更新机制和浏览器兼容方案。
-
-
-* LocalStorage:用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
-
-### 2.2 省着点用-网络
-#### 2.2.1 减少请求数
-可通过以下方式减少请求数:
-* 小图片合并雪碧图;
-* JS、CSS文件选择性合并;
-* 避免重复的资源请求。
-
-减少请求数对于速度优化来说最重要最有效的,特别是网络差的用户。一个完整的请求需要经过域名解析以及DNS寻址、与服务器建立连接、发送数据、等待服务器响应、接收数据的过程;每个请求都需要携带数据,因此每个请求都需要占用带宽;浏览器进行并发请求的请求数是有上限的。请求多了的情况,明显增加了网页的响应时间。一个页面由多个模块拼接而成,几个模块中请求了同样的资源时,就会导致资源的重复请求。
-
-#### 2.2.2 减少文件大小(减少请求带宽)
-* 压缩CSS、JS、图片;
-* 尽可能控制DOM节点数;
-* 精简css、 JavaScript,移除注释、空格、重复css和脚本。
-* 开启Gzip,Gzip的思想就是把文件先在服务器端进行压缩,且压缩率达到85%,然后再传输,传输完毕后浏览器会 重新对压缩过的内容进行解压缩,并执行。。好处在于Gzip的支持已经很好,且爬虫可识别,压缩率达到66%-85%显著减少了文件传输的大小。另外,gzip对pdf文件的压缩效果不大,而且会浪费CPU。
-
-#### 2.2.3 合理使用静态资源域名
-**域名的要求是短小且独立**。
-短小可以减少头部开销,因为域名越短请求头起始行的 URI 就越短。之所以要求独立,因为独立域名不会共享主域的 Cookie,可以有效减小请求头大小,这个策略一般称之为 Cookie-Free Domain;另外一个原因是浏览器对相同域名的并发连接数限制,一般允许同域名并发 6~8 个连接,域名不是越多越好,每个域名的第一个连接都要经历 DNS 查询(DNS Lookup),导致会耗费一定的时间,控制域名使用在2-4个之间。另外注意:同一静态资源在不同页面被散列到不同子域下,会导致无法利用 HTTP 缓存。
-
-#### 2.2.4 使用HTTP 2
-HTTP 2 相比 HTTP 1.1 的更新大部分集中于:
-* **多路复用**:多路复用很好地解决如何让重要资源尽快加载这个问题。同域名下或者不同域但是同时满足同一个 IP以及使用同一个证书的这两个条件中的所有通信都在**单个连接**上完成,此连接上同时打开任意数量的双向数据流( HTTP 1.1 有连接数限制)。使用多域名加上相同的 IP 和证书部署 Web 服务有特殊的意义:让支持 HTTP/2 的终端只建立一个连接,用上 HTTP/2 协议带来的各种好处;而只支持 HTTP/1.1 的终端则会建立多个连接,达到同时更多并发请求的目的。
-* **HEAD 压缩**:HTTP/2 将请求和响应数据分割为更小的帧,并对它们采用二进制编码( Binary Framing )。在 HTTP/1 中,HTTP 请求和响应都是由「状态行、请求 / 响应头部、消息主体」三部分组成,状态行和头部却没有经过任何压缩,直接以纯文本传输。如下图的比较:

-在 HTTP/2 中,每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。
-* **请求优先级**:服务器可以根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。
-* **服务器推送**:启动Server Push,意味着服务端可以在发送页面HTML时主动推送其它资源,有自己独立的URL,可以被浏览器缓存;如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送 RST_STREAM 帧来拒收。
-
-
-### 2.2 学会持家,让家变得简洁漂亮-客户端
-* 使用外链CSS和JS,CSS放头,JS放尾,防止阻塞以减少对并发下载的影响,尽早刷新文档的输出。
-* html的代码优化,如:
- * 避免空的图片src;
- * 协议自适应,减少html文件大小,将https://和http://都替换成//。
-* css的代码优化,如:
- * 建议使用类选择器,访问比较快;
- * 不建议使用很长的base64;
- * 避免CSS表达式;
- * 避免使用Filters。
-* js的代码优化,如:
- * 避免使用eval和width;
- * 减少作用域链查找;
- * 减少DOM访问,尽量缓存DOM;
- * 充分利用事件委托;
- * 减少Repaint(重绘)和Reflow(重排)最好通过批量更新元素减少重排次数,如设置类class统一更新样式,在添加多个li
- * 元素将会触发多次页面重排的情况下使用 DOM fargment 在内存中创建完整的 DOM 节点,然后再一次性添加到 DOM 中。
-* 图片格式的选择:
- * 颜色较为丰富的图片而且文件比较大的(40KB - 200KB)或者有内容的图片优先考虑 jpg;图标等颜色比较简单、文件体积不大、起修饰作用的图片,优先考虑使用 PNG8 格式;图像颜色丰富而且图片文件不太大的(40KB 以下)或有半透明效果的优先考虑 PNG24 格式。
- * 条件允许的,使用新格式WEBP和BPG。
- * 用SVG和ICONFONT代替简单的图标。
- * 用[字蛛](https://isux.tencent.com/font-spider.html)来代替艺术字体切图,它可剔除没有使用的字符,从而解决中文字体过大的问题,并编码成跨平台兼容的格式。
-* 合理分配资源加载时间,按需加载,包括CSS、JS文件以及图片、业务模块等。
-根据我们网页最初加载需要的最小内容集推断其他内容延迟加载;无条件提前加载公共内容或根据用户行为推断提前加载某些内容,如根据搜索框输入的文字来判断加载的内容。加载机制如下:
- * 预加载
- * Dom Ready后加载
- * onLoad后加载
- * 滚动加载
-* 减少DNS 查询:DNS 查询一般需要几毫秒到几百毫秒,移动环境下会更慢。我们可以预先读取DNS,减少用户等待时间。

-
-## 3 稳定性
-稳定性的第一要求是可用。最起码的要求是页面得出来,要不然没法用了。
-其次讲究的是页面的可维护性,假如页面挂了,多久可以恢复过来,另外考虑页面挂的期间是否可以采取静态页面处理等方式。
-页面的稳定性其实和前端安全挂钩,即使页面可以出来了,但是不能保证不会被黑掉,下文从前端安全的方面讲解。
-### 3.1 常见攻击:
-* XSS (Cross Site Script) ,跨站脚本攻击,往Web页面里插入恶意html代码。特点是攻击者的代码必须能获取用户浏览器端的执行权限,要杜绝此类攻击出现可以在入口和出口进行严格的过滤。
- 三种类型:
- (1) 反射型XSS:一次性;将包含注入脚本的恶意链接发送给受害者。
- (2) 持久型XSS:用户输入的数据“存储”在服务器端,比如一条包含XSS代码的留言。
- (3) DOM XSS:使用一些eval等有输出的语句意味着多了一份被XSS的风险。
-
- 应对策略:
- * 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
- * 当恶意代码被作为某一标签的属性显示,通过用 "将属性截断来开辟新的属性或恶意方法:属性本身存在的 单引号和双引号都需要进行转码;对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。
-
-
-* CSRF(Cross Site Request Forgery),跨站点伪造请求,通过伪造连接请求在用户不知情的情况下,让用户以自己的身份来完成攻击者需要达到的一些目的。
-
-* cookie劫持,通过获取页面的权限,在页面中写一个简单的到恶意站点的请求,并获取用户的cookie登录某些站点。
-
-对于crsf 和cookie 劫持的策略:
-* 通过 referer、token 或者 验证码 来检测用户提交。
-* 尽量不要在页面的链接中暴露用户隐私信息。
-* 对于用户修改删除等操作最好都使用post 操作 。
-* 避免全站通用的cookie,严格设置cookie的域。
-
-### 3.2 数据通道安全
-国内的众多网站都没有实现全站HTTPS。这是目前为止最重要的一步,所有的数据在发送之前就会被加密,攻击者无法查看或篡改数据包的内容。HTTPS可以理解为HTTP+SSL/TLS,通过数据加密、校验数据完整性和身份认证三种机制来保障安全。HTTPS的缺点是网站在加上TLS证书时,可能导致RTT往返时延增加,并且 HTTPS通信过程的非对称和对称加解密计算会产生更多的服务器性能和时间上的消耗,但是这是可以优化的,这里就不细说了。
-
-### 3.3浏览器安全
-
-#### 3.3.1 同源策略
-首先了解一下同源策略:
-* 源指的是有相同的HOST、相同的协议、相同的端口。
-* 同源策略以源为单位,把资源天然分隔,保护了用户的信息安全。
-* 绕过同源策略让javascript访问其他源的资源的方法,如:JSONP、CORS、flash等。
-* 同源策略不是绝对安全的,面对很多攻击是无能为力的,比如XSS,因为此时攻击者就在同源之内。
-
-不建议使用JSONP,因为JSONP通常在脚本中写一个回调函数,然后把回调函数的名字写在请求的URL中,因此如果请求数据的服务器被黑了,那么黑客就能在返回的数据中植入恶意代码,从而窃取用户的隐私信息。
-
-跨域资源共享CORS允许资源提供方在响应头中加入一个特殊的标记,使你能通过XHR来获取、解析并验证数据。这样就能避免恶意代码在你的应用中执行。在响应头中加入的标记如下:
-
-```
-Access-Control-Allow-Origin: allowed origins
-```
-如果对Access–Control-Allow-Origin设置为*其实是比较危险的,如果没有携带会话认证意味着信息被公开在全网,建议设置具体的域名,而且跨域的时候记得带上session id;严格审查请求信息,比如请求参数,还有http头信息,因为 http头可以伪造。
-
-#### 3.3.2 CSP(Content Security Policy)
-CSP指定网站上所有脚本和图片等资源的源站点,也能阻止所有内联(inline)的脚本和样式。即使有人在页面评论或者留言中嵌入了脚本标签,这些脚本代码也不会被执行。可通过两种方式设置,如果 HTTP 头与 Meta 定义同时存在,则优先采用 HTTP 头中的定义:
-* 通过 HTTP 头,比如只允许脚本从本源加载:Content-Security-Policy: script-src ‘self’,其中script-src ‘self’是策略。
-* 通过HTML的Meta标签,比如只允许脚本从本源加载:
-
- ```
-
- ```
-
-其他策略:
-* script-src – 设置可以接受的JavaScript代码的源站点
-* style-src – 设置可以接受的CSS样式代码的源站点
-* connect-src – 定义浏览器可以通过XHR、WebSocket或者 EventSource访问哪些站点
-* font-src – 设置可以接受的字体文件的源站点
-* frame-src – 定义浏览器可以通过iframe访问哪些站点
-* img-src – 设置可以接受的图片的源站点
-* media-src – 设置可以接受的音频和视频文件的源站点
-* object-src – 设置可以接受的Flash和其它插件的源站点
-
-缺点:
-默认情况下,所有的内联JavaScript脚本都不会被执行,因为浏览器无法区分自己的内联脚本和黑客注入的脚本。
-CSP还会默认阻止所有eval()风格的代码的执行,包括setInterval/setTimeout中的字符串和类似于new Function(‘return false’)之类的代码。
-
-#### 3.3.3 iframe 沙箱环境
-利用iframe进行跨源:HTML5为iframe提供了安全属性 sandbox,iframe的能力将会被限制。
-
-#### 3.3.4 Secure和HttpOnly属性
-Secure能确保cookie的内容只能通过SSL连接进行传输。Secure和HttpOnly属性告诉浏览器cookie的内容只能分别通过HTTP(S)协议进行访问,从而避免了被轻易窃取,比如禁止从JavaScript中的document.cookie访问,因此cookie在浏览器document中不可见了。如果单独使用的话,无法全面抵御跨站点脚本攻击,通常和其他技术组合使用。使用方法如下:
-```
-Set-Cookie: =[; =] [; expires=][; domain=][; path=][; secure][; HttpOnly]
-```
-
-#### 3.3.5 其他安全相关的HTTP 头
-* X-Content-Type-Options 告诉浏览器相信此服务器下发的资源的类型,防止类型嗅探攻击。
-
-* HPKP(Public Key Pinning) Public Key Pinning 是一个response 头,用来检测一个证书的公钥是否发生了改变,防止中间人攻击。
-
-* HSTS (HTTP Strict-Transport-Security) 强制使用TSL作为数据通道。
-
-### 3.4 HTML5 对web安全的影响
-
-html5有很多新的特性能力,然而能力越大,被攻破后的危险就越大。
-HTML5 对xss的影响主要体现在:
-* 攻击面更大,html5带来更多的标签和更多的属性如`