├── .gitignore ├── LICENSE ├── README.md ├── esm-demo ├── index.html └── logger.js ├── media ├── es-modules.png ├── http-1.1-connection.png ├── http-1.1.png ├── http-2-connection.png ├── vite.png ├── vue-cli-service-serve.png └── webpack.png ├── my-vite-demo ├── index.html ├── package-lock.json ├── package.json ├── public │ └── favicon.ico └── src │ ├── App.vue │ ├── assets │ └── logo.png │ ├── components │ └── HelloWorld.vue │ ├── index.css │ └── main.js └── my-vite ├── cli.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | *.local -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 汪磊 (https://zce.me) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 前端新玩具:Vite 2 | 3 | ## 知识储备 4 | 5 | - 掌握 ES Modules 特性 6 | - 了解 HTTP 2 标准 7 | 8 | ## 相关介绍 9 | 10 | ### Vite 的定义 11 | 12 | 面向现代浏览器的一个更轻、更快的 Web 应用开发工具, 13 | 14 | 基于 ECMAScript 标准原生模块系统(ES Modules)实现。 15 | 16 | ### Vite 的由来 17 | 18 | 如果应用比较复杂,使用 Webpack 的开发过程相对没有那么丝滑。 19 | 20 | - Webpack Dev Server 冷启动时间会比较长 21 | - Webpack HMR 热更新的反应速度比较慢 22 | 23 | ## 快速上手 24 | 25 | Vite 官方目前提供了一个比较简单的脚手架:create-vite-app,可以使用这个脚手架快速创建一个使用 Vite 构建的 Vue.js 应用 26 | 27 | ```shell 28 | $ npm init vite-app 29 | $ cd 30 | $ npm install 31 | $ npm run dev 32 | ``` 33 | 34 | 如果使用 yarn: 35 | 36 | ```shell 37 | $ yarn create vite-app 38 | $ cd 39 | $ yarn 40 | $ yarn dev 41 | ``` 42 | 43 | > P.S. 44 | > `npm init` 或者 `yarn create` 是这两个包管理工具提供的新功能, 45 | > 其内部就是自动去安装一个 `create-` 的模块(临时),然后自动执行这个模块中的 bin。 46 | > 例如: 47 | > `yarn create react-app my-react-app` 就相当于先 `yarn global add create-react-app`,然后自动执行 `create-react-app my-react-app` 48 | 49 | ### 对比差异点 50 | 51 | 打开生成的项目过后,你会发现就是一个很普通的 Vue.js 应用,没有太多特殊的地方。 52 | 53 | 不过相比于之前 vue-cli 创建的项目或者是基于 Webpack 搭建的 Vue.js 项目,这里的开发依赖非常简单,只有 vite 和 @vue/compiler-sfc。 54 | 55 | vite 就是我们今天要介绍的主角,而 @vue/compiler-sfc 就是用来编译我们项目中 .vue 结尾的单文件组件(SFC),它取代的就是 Vue.js 2.x 时使用的 vue-template-compiler。 56 | 57 | 再者就是 Vue.js 的版本是 3.0。这里尤其需要注意:**Vite 目前只支持 Vue.js 3.0 版本。** 58 | 59 | > 如果你想,在后面介绍完实现原理过后,你也可以改造 Vite 让它支持 Vue.js 2.0。 60 | 61 | ### 基础体验 62 | 63 | 这里我们所安装的 vite 模块提供了两个子命令: 64 | 65 | - serve:启动一个用于开发的服务器 66 | - build:构建整个项目(上线) 67 | 68 | 当我们执行 `vite serve` 的时候,你会发现响应速度非常快,几乎就是秒开。 69 | 70 | 可能单独体验你不会有太明显的感觉,你可以对比使用 `vue-cli-service`(内部还是 Webpack)启动开发服务器, 71 | 72 | 当我们对比使用 `vue-cli-service serve` 的时候,你会有更明显的感觉。 73 | 74 | 因为 Webpack Dev Server 在启动时,需要先 build 一遍,而 build 的过程是需要耗费很多时间的。 75 | 76 | ![](media/webpack.png) 77 | 78 | 而 Vite 则完全不同,当我们执行 `vite serve` 时,内部直接启动了 Web Server,并不会先编译所有的代码文件。 79 | 80 | 那仅仅是启动 Web Server,速度上自然就快了很多。 81 | 82 | ![](media/vite.png) 83 | 84 | 但是像 Webpack 这类工具的做法是将所有模块提前编译、打包进 bundle 里,换句话说,不管模块是否会被执行,都要被编译和打包到 bundle 里。随着项目越来越大打包后的 bundle 也越来越大,打包的速度自然也就越来越慢。 85 | 86 | Vite 利用现代浏览器原生支持 ESM 特性,省略了对模块的打包。 87 | 88 | 对于需要编译的文件,Vite 采用的是另外一种模式:即时编译。 89 | 90 | 也就是说,只有具体去请求某个文件时才会编译这个文件。 91 | 92 | 所以,这种「即时编译」的好处主要体现在:按需编译。 93 | 94 | ### Optimize 95 | 96 | Vite 还提供了一个目前在帮助列表中并没有呈现的一个子命令:optimize。 97 | 98 | 这个命令的作用就是单独的去「优化依赖」。 99 | 100 | 所谓的「优化依赖」,指的就是自动去把代码中依赖的第三方模块提前编译出来。 101 | 102 | 例如,我们在代码中通过 `import` 载入了 vue 这个模块,那通过这个命令就会自动将这个模块打包成一个单独的 ESM bundle, 放到 `node_modules/.vite_opt_cache` 目录中。 103 | 104 | 这样后续请求这个文件时就不需要再即时去加载了。 105 | 106 | ### HMR 107 | 108 | 同样也是模式的问题,热更新的时候,Vite 只需要立即编译当前所修改的文件即可,所以响应速度非常快。 109 | 110 | 而 Webpack 修改某个文件过后,会自动以这个文件为入口重写 build 一次,所有的涉及到的依赖也都会被加载一遍,所以反应速度会慢很多。 111 | 112 | ### Build 113 | 114 | Vite 在生产模式下打包,需要使用 `vite build` 命令。 115 | 116 | 这个命令内部采用的是 Rollup 完成的应用打包,最终还是会把文件都提前编译并打包到一起。 117 | 118 | 对于 Code Splitting 需求,Vite 内部采用的就是原生 Dynamic imports 特性实现的,所以打包结果还是只能够支持现代浏览器。 119 | 120 | 不过好在 Dynamic imports 特性是可以有 Polyfill 的:https://github.com/GoogleChromeLabs/dynamic-import-polyfill,也就是说,只要你想,它也可以运行在相对低版本的浏览器中。 121 | 122 | ### 打包 or 不打包 123 | 124 | Vite 的出现,引发了另外一个值得我们思考的问题:究竟还有没有必要打包应用? 125 | 126 | 之前我们使用 Webpack 打包应用代码,使之成为一个 bundle.js,主要有两个原因: 127 | 128 | 1. 浏览器环境并不支持模块化 129 | 2. 零散的模块文件会产生大量的 HTTP 请求 130 | 131 | 随着浏览器的对 ES 标准支持的逐渐完善,第一个问题已经慢慢不存在了。现阶段绝大多数浏览器都是支持 ES Modules 的。 132 | 133 | ![es-modules](media/es-modules.png) 134 | 135 | 零散模块文件确实会产生大量的 HTTP 请求,而大量的 HTTP 请求在浏览器端就会并发请求资源的问题; 136 | 137 | ![](media/http-1.1.png) 138 | 139 | _如上图所示,红色圈出来的请求就是并行请求,但是后面的请求就因为域名链接数已超过限制,而被挂起等待了一段时间。_ 140 | 141 | 在 HTTP 1.1 的标准下,每次请求都需要单独建立 TCP 链接,经过完整的通讯过程,非常耗时; 142 | 143 | ![](media/http-1.1-connection.png) 144 | 145 | 而且每次请求除了请求体中的内容,请求头中也会包含很多数据,大量请求的情况下也会浪费很多资源。 146 | 147 | 但是这些问题随着 HTTP 2 的出现,也就不复存在了。 148 | 149 | ![](media/http-2-connection.png) 150 | 151 | 关于 HTTP 1.1 与 HTTP 2 之间的差异,可以通过这个链接体验:https://http2.akamai.com/demo,直观感受下 HTTP/2 比 HTTP/1 到底快了多少。 152 | 153 | 而且不打包也有一个好处,就是可以把按需加载实现到极致。 154 | 155 | > 关于 HTTP 2 的详细介绍,可以参考: 156 | > 157 | > - https://blog.fundebug.com/2019/03/07/understand-http2-and-http3/ 158 | > - https://www.digitalocean.com/community/tutorials/http-1-1-vs-http-2-what-s-the-difference 159 | 160 | ### 开箱即用 161 | 162 | - TypeScript - 内置支持 163 | - less/sass/stylus/postcss - 内置支持(需要单独安装所对应的编译器) 164 | 165 | ### 特性小结 166 | 167 | Vite 带来的优势主要体现在提升开发者在开发过程中的体验。 168 | 169 | - Dev Server 无需等待,即时启动; 170 | - 几乎实时的模块热更新; 171 | - 所需文件按需编译,避免编译用不到的文件; 172 | - 开箱即用,避免各种 Loader 和 Plugin 的配置; 173 | 174 | ## 实现原理 175 | 176 | Vite 的核心功能:Static Server + Compile + HMR 177 | 178 | 核心思路: 179 | 180 | 1. 将当前项目目录作为静态文件服务器的根目录 181 | 2. 拦截部分文件请求 182 | 1. 处理代码中 import node_modules 中的模块 183 | 2. 处理 vue 单文件组件(SFC)的编译 184 | 3. 通过 WebSocket 实现 HMR 185 | 186 | ### 手写实现 187 | 188 | 详细参考 [my-vite](my-vite) 189 | 190 | ```javascript 191 | #!/usr/bin/env node 192 | 193 | const path = require('path') 194 | const { Readable } = require('stream') 195 | const Koa = require('koa') 196 | const send = require('koa-send') 197 | const compilerSfc = require('@vue/compiler-sfc') 198 | 199 | const cwd = process.cwd() 200 | 201 | const streamToString = stream => new Promise((resolve, reject) => { 202 | const chunks = [] 203 | stream.on('data', chunk => chunks.push(chunk)) 204 | stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8'))) 205 | stream.on('error', reject) 206 | }) 207 | 208 | const app = new Koa() 209 | 210 | // 重写请求路径,/@modules/xxx => /node_modules/ 211 | app.use(async (ctx, next) => { 212 | if (ctx.path.startsWith('/@modules/')) { 213 | const moduleName = ctx.path.substr(10) // => vue 214 | const modulePkg = require(path.join(cwd, 'node_modules', moduleName, 'package.json')) 215 | ctx.path = path.join('/node_modules', moduleName, modulePkg.module) 216 | } 217 | await next() 218 | }) 219 | 220 | // 根据请求路径得到相应文件 /index.html 221 | app.use(async (ctx, next) => { 222 | // ctx.path // http://localhost:3080/ 223 | // ctx.body = 'my-vite' 224 | await send(ctx, ctx.path, { root: cwd, index: 'index.html' }) // 有可能还需要额外处理相应结果 225 | await next() 226 | }) 227 | 228 | // .vue 文件请求的处理,即时编译 229 | app.use(async (ctx, next) => { 230 | if (ctx.path.endsWith('.vue')) { 231 | const contents = await streamToString(ctx.body) 232 | const { descriptor } = compilerSfc.parse(contents) 233 | let code 234 | 235 | if (ctx.query.type === undefined) { 236 | code = descriptor.script.content 237 | code = code.replace(/export\s+default\s+/, 'const __script = ') 238 | code += ` 239 | import { render as __render } from "${ctx.path}?type=template" 240 | __script.render = __render 241 | export default __script` 242 | // console.log(code) 243 | ctx.type = 'application/javascript' 244 | ctx.body = Readable.from(Buffer.from(code)) 245 | } else if (ctx.query.type === 'template') { 246 | const templateRender = compilerSfc.compileTemplate({ source: descriptor.template.content }) 247 | code = templateRender.code 248 | } 249 | 250 | ctx.type = 'application/javascript' 251 | ctx.body = Readable.from(Buffer.from(code)) 252 | } 253 | await next() 254 | }) 255 | 256 | // 替换代码中特殊位置 257 | app.use(async (ctx, next) => { 258 | if (ctx.type === 'application/javascript') { 259 | const contents = await streamToString(ctx.body) 260 | ctx.body = contents 261 | .replace(/(from\s+['"])(?![\.\/])/g, '$1/@modules/') 262 | .replace(/process\.env\.NODE_ENV/g, '"production"') 263 | } 264 | }) 265 | 266 | app.listen(3080) 267 | 268 | console.log('Server running @ http://localhost:3080') 269 | ``` 270 | 271 | ## License 272 | 273 | [MIT](LICENSE) © [汪磊](https://zce.me) 274 | -------------------------------------------------------------------------------- /esm-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /esm-demo/logger.js: -------------------------------------------------------------------------------- 1 | export const info = (...args) => { 2 | console.log(...args) 3 | } -------------------------------------------------------------------------------- /media/es-modules.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/media/es-modules.png -------------------------------------------------------------------------------- /media/http-1.1-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/media/http-1.1-connection.png -------------------------------------------------------------------------------- /media/http-1.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/media/http-1.1.png -------------------------------------------------------------------------------- /media/http-2-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/media/http-2-connection.png -------------------------------------------------------------------------------- /media/vite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/media/vite.png -------------------------------------------------------------------------------- /media/vue-cli-service-serve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/media/vue-cli-service-serve.png -------------------------------------------------------------------------------- /media/webpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/media/webpack.png -------------------------------------------------------------------------------- /my-vite-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /my-vite-demo/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-demo", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/helper-validator-identifier": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.10.4.tgz", 10 | "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=" 11 | }, 12 | "@babel/parser": { 13 | "version": "7.10.4", 14 | "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.10.4.tgz?cache=0&sync_timestamp=1593521035480&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.10.4.tgz", 15 | "integrity": "sha1-nu3yfhmY2Hc5+1AopRIFV8BqGmQ=" 16 | }, 17 | "@babel/types": { 18 | "version": "7.10.4", 19 | "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.10.4.tgz?cache=0&sync_timestamp=1593521074992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.10.4.tgz", 20 | "integrity": "sha1-NpUXGINS4YIZmB79FWv9sZn/8e4=", 21 | "requires": { 22 | "@babel/helper-validator-identifier": "^7.10.4", 23 | "lodash": "^4.17.13", 24 | "to-fast-properties": "^2.0.0" 25 | } 26 | }, 27 | "@vue/compiler-core": { 28 | "version": "3.0.0-beta.20", 29 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-core/download/@vue/compiler-core-3.0.0-beta.20.tgz", 30 | "integrity": "sha1-ZsCF4j1UIAiAdL7HMpH72BUcr/M=", 31 | "requires": { 32 | "@babel/parser": "^7.8.6", 33 | "@babel/types": "^7.8.6", 34 | "@vue/shared": "3.0.0-beta.20", 35 | "estree-walker": "^0.8.1", 36 | "source-map": "^0.6.1" 37 | } 38 | }, 39 | "@vue/compiler-dom": { 40 | "version": "3.0.0-beta.20", 41 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-dom/download/@vue/compiler-dom-3.0.0-beta.20.tgz", 42 | "integrity": "sha1-nTBdVm2igiLbSg9800nj5gOkKHI=", 43 | "requires": { 44 | "@vue/compiler-core": "3.0.0-beta.20", 45 | "@vue/shared": "3.0.0-beta.20" 46 | } 47 | }, 48 | "@vue/compiler-sfc": { 49 | "version": "3.0.0-beta.20", 50 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-sfc/download/@vue/compiler-sfc-3.0.0-beta.20.tgz", 51 | "integrity": "sha1-j/4aMecJcTcI+2JcrmLn79rpCxQ=", 52 | "dev": true, 53 | "requires": { 54 | "@vue/compiler-core": "3.0.0-beta.20", 55 | "@vue/compiler-dom": "3.0.0-beta.20", 56 | "@vue/compiler-ssr": "3.0.0-beta.20", 57 | "@vue/shared": "3.0.0-beta.20", 58 | "consolidate": "^0.15.1", 59 | "hash-sum": "^2.0.0", 60 | "lru-cache": "^5.1.1", 61 | "merge-source-map": "^1.1.0", 62 | "postcss": "^7.0.27", 63 | "postcss-modules": "^3.1.0", 64 | "postcss-selector-parser": "^6.0.2", 65 | "source-map": "^0.6.1" 66 | } 67 | }, 68 | "@vue/compiler-ssr": { 69 | "version": "3.0.0-beta.20", 70 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-ssr/download/@vue/compiler-ssr-3.0.0-beta.20.tgz", 71 | "integrity": "sha1-9gWDagm5vNPKZhk+SYQIGqFAiCU=", 72 | "dev": true, 73 | "requires": { 74 | "@vue/compiler-dom": "3.0.0-beta.20", 75 | "@vue/shared": "3.0.0-beta.20" 76 | } 77 | }, 78 | "@vue/reactivity": { 79 | "version": "3.0.0-beta.20", 80 | "resolved": "https://registry.npm.taobao.org/@vue/reactivity/download/@vue/reactivity-3.0.0-beta.20.tgz", 81 | "integrity": "sha1-ihbwiTlKKahQnkyOUV9eyEsmzBM=", 82 | "requires": { 83 | "@vue/shared": "3.0.0-beta.20" 84 | } 85 | }, 86 | "@vue/runtime-core": { 87 | "version": "3.0.0-beta.20", 88 | "resolved": "https://registry.npm.taobao.org/@vue/runtime-core/download/@vue/runtime-core-3.0.0-beta.20.tgz", 89 | "integrity": "sha1-M9CQoYroaJn/3FceGc+opVI7Sk8=", 90 | "requires": { 91 | "@vue/reactivity": "3.0.0-beta.20", 92 | "@vue/shared": "3.0.0-beta.20" 93 | } 94 | }, 95 | "@vue/runtime-dom": { 96 | "version": "3.0.0-beta.20", 97 | "resolved": "https://registry.npm.taobao.org/@vue/runtime-dom/download/@vue/runtime-dom-3.0.0-beta.20.tgz", 98 | "integrity": "sha1-dYg0HnMErlppXqHdhrvobI35blU=", 99 | "requires": { 100 | "@vue/runtime-core": "3.0.0-beta.20", 101 | "@vue/shared": "3.0.0-beta.20", 102 | "csstype": "^2.6.8" 103 | } 104 | }, 105 | "@vue/shared": { 106 | "version": "3.0.0-beta.20", 107 | "resolved": "https://registry.npm.taobao.org/@vue/shared/download/@vue/shared-3.0.0-beta.20.tgz", 108 | "integrity": "sha1-Ait6rAlmnWynn/LNOEGIU7L/yL4=" 109 | }, 110 | "ansi-styles": { 111 | "version": "3.2.1", 112 | "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", 113 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 114 | "dev": true, 115 | "requires": { 116 | "color-convert": "^1.9.0" 117 | } 118 | }, 119 | "big.js": { 120 | "version": "5.2.2", 121 | "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", 122 | "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", 123 | "dev": true 124 | }, 125 | "bluebird": { 126 | "version": "3.7.2", 127 | "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1586263933818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz", 128 | "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", 129 | "dev": true 130 | }, 131 | "chalk": { 132 | "version": "2.4.2", 133 | "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687126086&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", 134 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 135 | "dev": true, 136 | "requires": { 137 | "ansi-styles": "^3.2.1", 138 | "escape-string-regexp": "^1.0.5", 139 | "supports-color": "^5.3.0" 140 | }, 141 | "dependencies": { 142 | "supports-color": { 143 | "version": "5.5.0", 144 | "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", 145 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 146 | "dev": true, 147 | "requires": { 148 | "has-flag": "^3.0.0" 149 | } 150 | } 151 | } 152 | }, 153 | "color-convert": { 154 | "version": "1.9.3", 155 | "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", 156 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 157 | "dev": true, 158 | "requires": { 159 | "color-name": "1.1.3" 160 | } 161 | }, 162 | "color-name": { 163 | "version": "1.1.3", 164 | "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", 165 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 166 | "dev": true 167 | }, 168 | "consolidate": { 169 | "version": "0.15.1", 170 | "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz", 171 | "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", 172 | "dev": true, 173 | "requires": { 174 | "bluebird": "^3.1.1" 175 | } 176 | }, 177 | "cssesc": { 178 | "version": "3.0.0", 179 | "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", 180 | "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", 181 | "dev": true 182 | }, 183 | "csstype": { 184 | "version": "2.6.11", 185 | "resolved": "https://registry.npm.taobao.org/csstype/download/csstype-2.6.11.tgz?cache=0&sync_timestamp=1593600197016&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-2.6.11.tgz", 186 | "integrity": "sha1-RS9NAkFJ7PJgqFKwJeNlYqJT/8U=" 187 | }, 188 | "emojis-list": { 189 | "version": "3.0.0", 190 | "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", 191 | "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", 192 | "dev": true 193 | }, 194 | "escape-string-regexp": { 195 | "version": "1.0.5", 196 | "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1587627212242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", 197 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 198 | "dev": true 199 | }, 200 | "estree-walker": { 201 | "version": "0.8.1", 202 | "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-0.8.1.tgz", 203 | "integrity": "sha1-YjDOLsmlywOIivyvKV+X2QqlK3k=" 204 | }, 205 | "generic-names": { 206 | "version": "2.0.1", 207 | "resolved": "https://registry.npm.taobao.org/generic-names/download/generic-names-2.0.1.tgz", 208 | "integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=", 209 | "dev": true, 210 | "requires": { 211 | "loader-utils": "^1.1.0" 212 | } 213 | }, 214 | "has-flag": { 215 | "version": "3.0.0", 216 | "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", 217 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 218 | "dev": true 219 | }, 220 | "hash-sum": { 221 | "version": "2.0.0", 222 | "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz?cache=0&sync_timestamp=1586263945599&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhash-sum%2Fdownload%2Fhash-sum-2.0.0.tgz", 223 | "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=", 224 | "dev": true 225 | }, 226 | "icss-replace-symbols": { 227 | "version": "1.1.0", 228 | "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", 229 | "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", 230 | "dev": true 231 | }, 232 | "icss-utils": { 233 | "version": "4.1.1", 234 | "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz", 235 | "integrity": "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc=", 236 | "dev": true, 237 | "requires": { 238 | "postcss": "^7.0.14" 239 | } 240 | }, 241 | "indexes-of": { 242 | "version": "1.0.1", 243 | "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", 244 | "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", 245 | "dev": true 246 | }, 247 | "json5": { 248 | "version": "1.0.1", 249 | "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", 250 | "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", 251 | "dev": true, 252 | "requires": { 253 | "minimist": "^1.2.0" 254 | } 255 | }, 256 | "loader-utils": { 257 | "version": "1.4.0", 258 | "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", 259 | "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", 260 | "dev": true, 261 | "requires": { 262 | "big.js": "^5.2.2", 263 | "emojis-list": "^3.0.0", 264 | "json5": "^1.0.1" 265 | } 266 | }, 267 | "lodash": { 268 | "version": "4.17.19", 269 | "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.19.tgz?cache=0&sync_timestamp=1594226905843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.19.tgz", 270 | "integrity": "sha1-5I3e2+MLMyF4PFtDAfvTU7weSks=" 271 | }, 272 | "lodash.camelcase": { 273 | "version": "4.3.0", 274 | "resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz", 275 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", 276 | "dev": true 277 | }, 278 | "lru-cache": { 279 | "version": "5.1.1", 280 | "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", 281 | "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", 282 | "dev": true, 283 | "requires": { 284 | "yallist": "^3.0.2" 285 | } 286 | }, 287 | "merge-source-map": { 288 | "version": "1.1.0", 289 | "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", 290 | "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", 291 | "dev": true, 292 | "requires": { 293 | "source-map": "^0.6.1" 294 | } 295 | }, 296 | "minimist": { 297 | "version": "1.2.5", 298 | "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", 299 | "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", 300 | "dev": true 301 | }, 302 | "my-vite": { 303 | "version": "file:../my-vite" 304 | }, 305 | "postcss": { 306 | "version": "7.0.32", 307 | "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.32.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-7.0.32.tgz", 308 | "integrity": "sha1-QxDW7jRwU9o0M9sr5JKIPWLOxZ0=", 309 | "dev": true, 310 | "requires": { 311 | "chalk": "^2.4.2", 312 | "source-map": "^0.6.1", 313 | "supports-color": "^6.1.0" 314 | } 315 | }, 316 | "postcss-modules": { 317 | "version": "3.2.0", 318 | "resolved": "https://registry.npm.taobao.org/postcss-modules/download/postcss-modules-3.2.0.tgz", 319 | "integrity": "sha1-HKhw0ZfNCaeWQlPhLeKqyQbJQlY=", 320 | "dev": true, 321 | "requires": { 322 | "generic-names": "^2.0.1", 323 | "icss-replace-symbols": "^1.1.0", 324 | "lodash.camelcase": "^4.3.0", 325 | "postcss": "^7.0.32", 326 | "postcss-modules-extract-imports": "^2.0.0", 327 | "postcss-modules-local-by-default": "^3.0.2", 328 | "postcss-modules-scope": "^2.2.0", 329 | "postcss-modules-values": "^3.0.0", 330 | "string-hash": "^1.1.1" 331 | } 332 | }, 333 | "postcss-modules-extract-imports": { 334 | "version": "2.0.0", 335 | "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz", 336 | "integrity": "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4=", 337 | "dev": true, 338 | "requires": { 339 | "postcss": "^7.0.5" 340 | } 341 | }, 342 | "postcss-modules-local-by-default": { 343 | "version": "3.0.2", 344 | "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.2.tgz", 345 | "integrity": "sha1-6KZWG+kUqvPAUodjd1JMqQ27eRU=", 346 | "dev": true, 347 | "requires": { 348 | "icss-utils": "^4.1.1", 349 | "postcss": "^7.0.16", 350 | "postcss-selector-parser": "^6.0.2", 351 | "postcss-value-parser": "^4.0.0" 352 | } 353 | }, 354 | "postcss-modules-scope": { 355 | "version": "2.2.0", 356 | "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz?cache=0&sync_timestamp=1584619550024&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-2.2.0.tgz", 357 | "integrity": "sha1-OFyuATzHdD9afXYC0Qc6iequYu4=", 358 | "dev": true, 359 | "requires": { 360 | "postcss": "^7.0.6", 361 | "postcss-selector-parser": "^6.0.0" 362 | } 363 | }, 364 | "postcss-modules-values": { 365 | "version": "3.0.0", 366 | "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz", 367 | "integrity": "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA=", 368 | "dev": true, 369 | "requires": { 370 | "icss-utils": "^4.0.0", 371 | "postcss": "^7.0.6" 372 | } 373 | }, 374 | "postcss-selector-parser": { 375 | "version": "6.0.2", 376 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz", 377 | "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", 378 | "dev": true, 379 | "requires": { 380 | "cssesc": "^3.0.0", 381 | "indexes-of": "^1.0.1", 382 | "uniq": "^1.0.1" 383 | } 384 | }, 385 | "postcss-value-parser": { 386 | "version": "4.1.0", 387 | "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz?cache=0&sync_timestamp=1588083303810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-4.1.0.tgz", 388 | "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", 389 | "dev": true 390 | }, 391 | "source-map": { 392 | "version": "0.6.1", 393 | "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", 394 | "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" 395 | }, 396 | "string-hash": { 397 | "version": "1.1.3", 398 | "resolved": "https://registry.npm.taobao.org/string-hash/download/string-hash-1.1.3.tgz", 399 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", 400 | "dev": true 401 | }, 402 | "supports-color": { 403 | "version": "6.1.0", 404 | "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", 405 | "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", 406 | "dev": true, 407 | "requires": { 408 | "has-flag": "^3.0.0" 409 | } 410 | }, 411 | "to-fast-properties": { 412 | "version": "2.0.0", 413 | "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", 414 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 415 | }, 416 | "uniq": { 417 | "version": "1.0.1", 418 | "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", 419 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 420 | "dev": true 421 | }, 422 | "vue": { 423 | "version": "3.0.0-beta.20", 424 | "resolved": "https://registry.npm.taobao.org/vue/download/vue-3.0.0-beta.20.tgz?cache=0&sync_timestamp=1594226884797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-3.0.0-beta.20.tgz", 425 | "integrity": "sha1-NKeQfPvcZba4xh+012VvSqa/H/8=", 426 | "requires": { 427 | "@vue/compiler-dom": "3.0.0-beta.20", 428 | "@vue/runtime-dom": "3.0.0-beta.20", 429 | "@vue/shared": "3.0.0-beta.20" 430 | } 431 | }, 432 | "yallist": { 433 | "version": "3.1.1", 434 | "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", 435 | "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", 436 | "dev": true 437 | } 438 | } 439 | } 440 | -------------------------------------------------------------------------------- /my-vite-demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-demo", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "dev": "my-vite", 6 | "build": "my-vite build" 7 | }, 8 | "dependencies": { 9 | "vue": "^3.0.0-beta.15" 10 | }, 11 | "devDependencies": { 12 | "my-vite": "file:../my-vite", 13 | "@vue/compiler-sfc": "^3.0.0-beta.15" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /my-vite-demo/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/my-vite-demo/public/favicon.ico -------------------------------------------------------------------------------- /my-vite-demo/src/App.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 16 | -------------------------------------------------------------------------------- /my-vite-demo/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zce/vite-essentials/4fa80a045bc1c3e7141aa9136a7dad813ed903b2/my-vite-demo/src/assets/logo.png -------------------------------------------------------------------------------- /my-vite-demo/src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 20 | -------------------------------------------------------------------------------- /my-vite-demo/src/index.css: -------------------------------------------------------------------------------- 1 | #app { 2 | font-family: Avenir, Helvetica, Arial, sans-serif; 3 | -webkit-font-smoothing: antialiased; 4 | -moz-osx-font-smoothing: grayscale; 5 | text-align: center; 6 | color: #2c3e50; 7 | margin-top: 60px; 8 | } 9 | -------------------------------------------------------------------------------- /my-vite-demo/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import './index.css' 4 | 5 | createApp(App).mount('#app') 6 | -------------------------------------------------------------------------------- /my-vite/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const path = require('path') 4 | const { Readable } = require('stream') 5 | const Koa = require('koa') 6 | const send = require('koa-send') 7 | const replace = require('stream-replace') 8 | const compilerSfc = require('@vue/compiler-sfc') 9 | 10 | const streamToString = stream => new Promise((resolve, reject) => { 11 | const chunks = [] 12 | stream.on('data', chunk => chunks.push(chunk)) 13 | stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8'))) 14 | stream.on('error', reject) 15 | }) 16 | 17 | const cwd = process.cwd() 18 | 19 | const app = new Koa() 20 | 21 | // /@modules request 22 | app.use(async (ctx, next) => { 23 | if (ctx.path.startsWith('/@modules/')) { 24 | const moduleName = ctx.path.substr(10) 25 | const moduleDir = path.join(cwd, 'node_modules', moduleName) 26 | const modulePkg = require(path.join(moduleDir, 'package.json')) 27 | ctx.path = path.join('/node_modules', moduleName, modulePkg.module) 28 | } 29 | await next() 30 | }) 31 | 32 | // static files serve 33 | app.use(async (ctx, next) => { 34 | await send(ctx, ctx.path, { root: cwd, index: 'index.html' }) 35 | await next() 36 | }) 37 | 38 | // static file import 39 | app.use(async (ctx, next) => { 40 | if (ctx.query.import !== undefined) { 41 | if (ctx.type.startsWith('image')) { 42 | ctx.type = 'application/javascript' 43 | ctx.body = Readable.from(`export default '${ctx.path}'`) 44 | } else if (ctx.type === 'text/css') { 45 | const css = await streamToString(ctx.body) 46 | ctx.type = 'application/javascript' 47 | ctx.body = Readable.from(`const style = document.createElement('style') 48 | style.innerHTML = ${JSON.stringify(css)} 49 | document.head.appendChild(style)`) 50 | } 51 | } 52 | await next() 53 | }) 54 | 55 | // sfc compile 56 | app.use(async (ctx, next) => { 57 | if (ctx.path.endsWith('.vue')) { 58 | const contents = await streamToString(ctx.body) 59 | const { descriptor } = compilerSfc.parse(contents) 60 | 61 | let code = '' 62 | if (!ctx.query.type) { 63 | const optionsCode = descriptor.script.content.replace( 64 | /export\s+default\s+/, 65 | `const ___options = ` 66 | ) 67 | code = `${optionsCode} 68 | import { render as ___render } from '${ctx.path}?type=template' 69 | ___options.render = ___render 70 | export default ___options` 71 | } else if (ctx.query.type === 'template') { 72 | const templateRender = compilerSfc.compileTemplate({ source: descriptor.template.content }) 73 | code = templateRender.code 74 | } 75 | 76 | ctx.type = 'application/javascript' 77 | ctx.body = Readable.from(code) 78 | } 79 | await next() 80 | }) 81 | 82 | // replace javascript import 83 | app.use(async (ctx, next) => { 84 | if (ctx.type === 'text/html' || ctx.type === 'application/javascript') { 85 | ctx.body = ctx.body 86 | // .pipe(replace(/((import|export)\s[^'"]*['"])(?![\.\/])/g, '$1/@modules/')) 87 | .pipe(replace(/from\s(['"])(?![\.\/])/g, 'from $1/@modules/')) 88 | // .pipe(replace(/(import\s*[^'"]*['"][^'"]+(png|jpe?g|gif|css))/g, '$1?import')) 89 | .pipe(replace(/from\s(['"].+?)\.(png|jpe?g|gif)/g, 'from $1.$2?import')) 90 | .pipe(replace(/import\s(['"].+?)\.(css)/g, 'import $1.$2?import')) 91 | .pipe(replace(/process\.env\.NODE_ENV/g, '"production"')) 92 | } 93 | await next() 94 | }) 95 | 96 | app.listen(3000) 97 | 98 | console.log('Server running @ http://localhost:3000') -------------------------------------------------------------------------------- /my-vite/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-vite", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/helper-validator-identifier": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.10.4.tgz", 10 | "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=" 11 | }, 12 | "@babel/parser": { 13 | "version": "7.10.4", 14 | "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.10.4.tgz?cache=0&sync_timestamp=1593521035480&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.10.4.tgz", 15 | "integrity": "sha1-nu3yfhmY2Hc5+1AopRIFV8BqGmQ=" 16 | }, 17 | "@babel/types": { 18 | "version": "7.10.4", 19 | "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.10.4.tgz?cache=0&sync_timestamp=1593521074992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.10.4.tgz", 20 | "integrity": "sha1-NpUXGINS4YIZmB79FWv9sZn/8e4=", 21 | "requires": { 22 | "@babel/helper-validator-identifier": "^7.10.4", 23 | "lodash": "^4.17.13", 24 | "to-fast-properties": "^2.0.0" 25 | } 26 | }, 27 | "@vue/compiler-core": { 28 | "version": "3.0.0-beta.20", 29 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-core/download/@vue/compiler-core-3.0.0-beta.20.tgz", 30 | "integrity": "sha1-ZsCF4j1UIAiAdL7HMpH72BUcr/M=", 31 | "requires": { 32 | "@babel/parser": "^7.8.6", 33 | "@babel/types": "^7.8.6", 34 | "@vue/shared": "3.0.0-beta.20", 35 | "estree-walker": "^0.8.1", 36 | "source-map": "^0.6.1" 37 | } 38 | }, 39 | "@vue/compiler-dom": { 40 | "version": "3.0.0-beta.20", 41 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-dom/download/@vue/compiler-dom-3.0.0-beta.20.tgz", 42 | "integrity": "sha1-nTBdVm2igiLbSg9800nj5gOkKHI=", 43 | "requires": { 44 | "@vue/compiler-core": "3.0.0-beta.20", 45 | "@vue/shared": "3.0.0-beta.20" 46 | } 47 | }, 48 | "@vue/compiler-sfc": { 49 | "version": "3.0.0-beta.20", 50 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-sfc/download/@vue/compiler-sfc-3.0.0-beta.20.tgz", 51 | "integrity": "sha1-j/4aMecJcTcI+2JcrmLn79rpCxQ=", 52 | "requires": { 53 | "@vue/compiler-core": "3.0.0-beta.20", 54 | "@vue/compiler-dom": "3.0.0-beta.20", 55 | "@vue/compiler-ssr": "3.0.0-beta.20", 56 | "@vue/shared": "3.0.0-beta.20", 57 | "consolidate": "^0.15.1", 58 | "hash-sum": "^2.0.0", 59 | "lru-cache": "^5.1.1", 60 | "merge-source-map": "^1.1.0", 61 | "postcss": "^7.0.27", 62 | "postcss-modules": "^3.1.0", 63 | "postcss-selector-parser": "^6.0.2", 64 | "source-map": "^0.6.1" 65 | } 66 | }, 67 | "@vue/compiler-ssr": { 68 | "version": "3.0.0-beta.20", 69 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-ssr/download/@vue/compiler-ssr-3.0.0-beta.20.tgz", 70 | "integrity": "sha1-9gWDagm5vNPKZhk+SYQIGqFAiCU=", 71 | "requires": { 72 | "@vue/compiler-dom": "3.0.0-beta.20", 73 | "@vue/shared": "3.0.0-beta.20" 74 | } 75 | }, 76 | "@vue/shared": { 77 | "version": "3.0.0-beta.20", 78 | "resolved": "https://registry.npm.taobao.org/@vue/shared/download/@vue/shared-3.0.0-beta.20.tgz", 79 | "integrity": "sha1-Ait6rAlmnWynn/LNOEGIU7L/yL4=" 80 | }, 81 | "accepts": { 82 | "version": "1.3.7", 83 | "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", 84 | "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", 85 | "requires": { 86 | "mime-types": "~2.1.24", 87 | "negotiator": "0.6.2" 88 | } 89 | }, 90 | "ansi-styles": { 91 | "version": "3.2.1", 92 | "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", 93 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 94 | "requires": { 95 | "color-convert": "^1.9.0" 96 | } 97 | }, 98 | "any-promise": { 99 | "version": "1.3.0", 100 | "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz", 101 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 102 | }, 103 | "big.js": { 104 | "version": "5.2.2", 105 | "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", 106 | "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=" 107 | }, 108 | "bluebird": { 109 | "version": "3.7.2", 110 | "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1586263933818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz", 111 | "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=" 112 | }, 113 | "cache-content-type": { 114 | "version": "1.0.1", 115 | "resolved": "https://registry.npm.taobao.org/cache-content-type/download/cache-content-type-1.0.1.tgz", 116 | "integrity": "sha1-A1zeKwjuISn0qDFeqPAKANuhRTw=", 117 | "requires": { 118 | "mime-types": "^2.1.18", 119 | "ylru": "^1.2.0" 120 | } 121 | }, 122 | "chalk": { 123 | "version": "2.4.2", 124 | "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687126086&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", 125 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 126 | "requires": { 127 | "ansi-styles": "^3.2.1", 128 | "escape-string-regexp": "^1.0.5", 129 | "supports-color": "^5.3.0" 130 | }, 131 | "dependencies": { 132 | "supports-color": { 133 | "version": "5.5.0", 134 | "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", 135 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 136 | "requires": { 137 | "has-flag": "^3.0.0" 138 | } 139 | } 140 | } 141 | }, 142 | "co": { 143 | "version": "4.6.0", 144 | "resolved": "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz", 145 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 146 | }, 147 | "color-convert": { 148 | "version": "1.9.3", 149 | "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", 150 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 151 | "requires": { 152 | "color-name": "1.1.3" 153 | } 154 | }, 155 | "color-name": { 156 | "version": "1.1.3", 157 | "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", 158 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 159 | }, 160 | "consolidate": { 161 | "version": "0.15.1", 162 | "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz", 163 | "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", 164 | "requires": { 165 | "bluebird": "^3.1.1" 166 | } 167 | }, 168 | "content-disposition": { 169 | "version": "0.5.3", 170 | "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", 171 | "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", 172 | "requires": { 173 | "safe-buffer": "5.1.2" 174 | } 175 | }, 176 | "content-type": { 177 | "version": "1.0.4", 178 | "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", 179 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" 180 | }, 181 | "cookies": { 182 | "version": "0.8.0", 183 | "resolved": "https://registry.npm.taobao.org/cookies/download/cookies-0.8.0.tgz?cache=0&sync_timestamp=1570851324736&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookies%2Fdownload%2Fcookies-0.8.0.tgz", 184 | "integrity": "sha1-EpPOSzkXQKhAbjyYcOgoxLVPP5A=", 185 | "requires": { 186 | "depd": "~2.0.0", 187 | "keygrip": "~1.1.0" 188 | }, 189 | "dependencies": { 190 | "depd": { 191 | "version": "2.0.0", 192 | "resolved": "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz", 193 | "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=" 194 | } 195 | } 196 | }, 197 | "cssesc": { 198 | "version": "3.0.0", 199 | "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", 200 | "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=" 201 | }, 202 | "debug": { 203 | "version": "3.1.0", 204 | "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&sync_timestamp=1589881689076&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz", 205 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 206 | "requires": { 207 | "ms": "2.0.0" 208 | } 209 | }, 210 | "deep-equal": { 211 | "version": "1.0.1", 212 | "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz?cache=0&sync_timestamp=1590392787863&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeep-equal%2Fdownload%2Fdeep-equal-1.0.1.tgz", 213 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 214 | }, 215 | "delegates": { 216 | "version": "1.0.0", 217 | "resolved": "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz", 218 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 219 | }, 220 | "depd": { 221 | "version": "1.1.2", 222 | "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", 223 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 224 | }, 225 | "destroy": { 226 | "version": "1.0.4", 227 | "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", 228 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 229 | }, 230 | "ee-first": { 231 | "version": "1.1.1", 232 | "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", 233 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 234 | }, 235 | "emojis-list": { 236 | "version": "3.0.0", 237 | "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", 238 | "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=" 239 | }, 240 | "encodeurl": { 241 | "version": "1.0.2", 242 | "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", 243 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 244 | }, 245 | "escape-html": { 246 | "version": "1.0.3", 247 | "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", 248 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 249 | }, 250 | "escape-string-regexp": { 251 | "version": "1.0.5", 252 | "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1587627212242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", 253 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 254 | }, 255 | "estree-walker": { 256 | "version": "0.8.1", 257 | "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-0.8.1.tgz", 258 | "integrity": "sha1-YjDOLsmlywOIivyvKV+X2QqlK3k=" 259 | }, 260 | "fresh": { 261 | "version": "0.5.2", 262 | "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", 263 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 264 | }, 265 | "generic-names": { 266 | "version": "2.0.1", 267 | "resolved": "https://registry.npm.taobao.org/generic-names/download/generic-names-2.0.1.tgz", 268 | "integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=", 269 | "requires": { 270 | "loader-utils": "^1.1.0" 271 | } 272 | }, 273 | "has-flag": { 274 | "version": "3.0.0", 275 | "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", 276 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 277 | }, 278 | "hash-sum": { 279 | "version": "2.0.0", 280 | "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz?cache=0&sync_timestamp=1586263945599&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhash-sum%2Fdownload%2Fhash-sum-2.0.0.tgz", 281 | "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=" 282 | }, 283 | "http-assert": { 284 | "version": "1.4.1", 285 | "resolved": "https://registry.npm.taobao.org/http-assert/download/http-assert-1.4.1.tgz", 286 | "integrity": "sha1-xfcl1neqfoc+9zYZm4lobM6zeHg=", 287 | "requires": { 288 | "deep-equal": "~1.0.1", 289 | "http-errors": "~1.7.2" 290 | }, 291 | "dependencies": { 292 | "http-errors": { 293 | "version": "1.7.3", 294 | "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz?cache=0&sync_timestamp=1593407638690&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.3.tgz", 295 | "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=", 296 | "requires": { 297 | "depd": "~1.1.2", 298 | "inherits": "2.0.4", 299 | "setprototypeof": "1.1.1", 300 | "statuses": ">= 1.5.0 < 2", 301 | "toidentifier": "1.0.0" 302 | } 303 | } 304 | } 305 | }, 306 | "http-errors": { 307 | "version": "1.8.0", 308 | "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.8.0.tgz?cache=0&sync_timestamp=1593407638690&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.8.0.tgz", 309 | "integrity": "sha1-ddG75JfhBE9R5O6ecEpi8o0zZQc=", 310 | "requires": { 311 | "depd": "~1.1.2", 312 | "inherits": "2.0.4", 313 | "setprototypeof": "1.2.0", 314 | "statuses": ">= 1.5.0 < 2", 315 | "toidentifier": "1.0.0" 316 | }, 317 | "dependencies": { 318 | "setprototypeof": { 319 | "version": "1.2.0", 320 | "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.2.0.tgz", 321 | "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=" 322 | } 323 | } 324 | }, 325 | "icss-replace-symbols": { 326 | "version": "1.1.0", 327 | "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", 328 | "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" 329 | }, 330 | "icss-utils": { 331 | "version": "4.1.1", 332 | "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz", 333 | "integrity": "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc=", 334 | "requires": { 335 | "postcss": "^7.0.14" 336 | } 337 | }, 338 | "indexes-of": { 339 | "version": "1.0.1", 340 | "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", 341 | "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" 342 | }, 343 | "inherits": { 344 | "version": "2.0.4", 345 | "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", 346 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" 347 | }, 348 | "is-generator-function": { 349 | "version": "1.0.7", 350 | "resolved": "https://registry.npm.taobao.org/is-generator-function/download/is-generator-function-1.0.7.tgz", 351 | "integrity": "sha1-0hMuUpuwAAp/gHlNS99c1eWBNSI=" 352 | }, 353 | "json5": { 354 | "version": "1.0.1", 355 | "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", 356 | "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", 357 | "requires": { 358 | "minimist": "^1.2.0" 359 | } 360 | }, 361 | "keygrip": { 362 | "version": "1.1.0", 363 | "resolved": "https://registry.npm.taobao.org/keygrip/download/keygrip-1.1.0.tgz", 364 | "integrity": "sha1-hxsWgdXhWcYqRFsMdLYV4JF+ciY=", 365 | "requires": { 366 | "tsscmp": "1.0.6" 367 | } 368 | }, 369 | "koa": { 370 | "version": "2.13.0", 371 | "resolved": "https://registry.npm.taobao.org/koa/download/koa-2.13.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkoa%2Fdownload%2Fkoa-2.13.0.tgz", 372 | "integrity": "sha1-JSF+Be/TNYp+Xd7ADwo4DJtxtQE=", 373 | "requires": { 374 | "accepts": "^1.3.5", 375 | "cache-content-type": "^1.0.0", 376 | "content-disposition": "~0.5.2", 377 | "content-type": "^1.0.4", 378 | "cookies": "~0.8.0", 379 | "debug": "~3.1.0", 380 | "delegates": "^1.0.0", 381 | "depd": "^1.1.2", 382 | "destroy": "^1.0.4", 383 | "encodeurl": "^1.0.2", 384 | "escape-html": "^1.0.3", 385 | "fresh": "~0.5.2", 386 | "http-assert": "^1.3.0", 387 | "http-errors": "^1.6.3", 388 | "is-generator-function": "^1.0.7", 389 | "koa-compose": "^4.1.0", 390 | "koa-convert": "^1.2.0", 391 | "on-finished": "^2.3.0", 392 | "only": "~0.0.2", 393 | "parseurl": "^1.3.2", 394 | "statuses": "^1.5.0", 395 | "type-is": "^1.6.16", 396 | "vary": "^1.1.2" 397 | } 398 | }, 399 | "koa-compose": { 400 | "version": "4.1.0", 401 | "resolved": "https://registry.npm.taobao.org/koa-compose/download/koa-compose-4.1.0.tgz", 402 | "integrity": "sha1-UHMGuTcZAdtBEhyBLpI9DWfT6Hc=" 403 | }, 404 | "koa-convert": { 405 | "version": "1.2.0", 406 | "resolved": "https://registry.npm.taobao.org/koa-convert/download/koa-convert-1.2.0.tgz", 407 | "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", 408 | "requires": { 409 | "co": "^4.6.0", 410 | "koa-compose": "^3.0.0" 411 | }, 412 | "dependencies": { 413 | "koa-compose": { 414 | "version": "3.2.1", 415 | "resolved": "https://registry.npm.taobao.org/koa-compose/download/koa-compose-3.2.1.tgz", 416 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 417 | "requires": { 418 | "any-promise": "^1.1.0" 419 | } 420 | } 421 | } 422 | }, 423 | "koa-send": { 424 | "version": "5.0.1", 425 | "resolved": "https://registry.npm.taobao.org/koa-send/download/koa-send-5.0.1.tgz?cache=0&sync_timestamp=1594224361920&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkoa-send%2Fdownload%2Fkoa-send-5.0.1.tgz", 426 | "integrity": "sha1-Odzuv6+zldDWC+r/ujpwtPVD/nk=", 427 | "requires": { 428 | "debug": "^4.1.1", 429 | "http-errors": "^1.7.3", 430 | "resolve-path": "^1.4.0" 431 | }, 432 | "dependencies": { 433 | "debug": { 434 | "version": "4.1.1", 435 | "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&sync_timestamp=1589881689076&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", 436 | "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", 437 | "requires": { 438 | "ms": "^2.1.1" 439 | } 440 | }, 441 | "ms": { 442 | "version": "2.1.2", 443 | "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", 444 | "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" 445 | } 446 | } 447 | }, 448 | "loader-utils": { 449 | "version": "1.4.0", 450 | "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", 451 | "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", 452 | "requires": { 453 | "big.js": "^5.2.2", 454 | "emojis-list": "^3.0.0", 455 | "json5": "^1.0.1" 456 | } 457 | }, 458 | "lodash": { 459 | "version": "4.17.19", 460 | "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.19.tgz?cache=0&sync_timestamp=1594226905843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.19.tgz", 461 | "integrity": "sha1-5I3e2+MLMyF4PFtDAfvTU7weSks=" 462 | }, 463 | "lodash.camelcase": { 464 | "version": "4.3.0", 465 | "resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz", 466 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 467 | }, 468 | "lru-cache": { 469 | "version": "5.1.1", 470 | "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", 471 | "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", 472 | "requires": { 473 | "yallist": "^3.0.2" 474 | } 475 | }, 476 | "media-typer": { 477 | "version": "0.3.0", 478 | "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", 479 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 480 | }, 481 | "merge-source-map": { 482 | "version": "1.1.0", 483 | "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", 484 | "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", 485 | "requires": { 486 | "source-map": "^0.6.1" 487 | } 488 | }, 489 | "mime-db": { 490 | "version": "1.44.0", 491 | "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz?cache=0&sync_timestamp=1587603398892&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.44.0.tgz", 492 | "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=" 493 | }, 494 | "mime-types": { 495 | "version": "2.1.27", 496 | "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz?cache=0&sync_timestamp=1587700357177&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.27.tgz", 497 | "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", 498 | "requires": { 499 | "mime-db": "1.44.0" 500 | } 501 | }, 502 | "minimist": { 503 | "version": "1.2.5", 504 | "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", 505 | "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" 506 | }, 507 | "ms": { 508 | "version": "2.0.0", 509 | "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 510 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 511 | }, 512 | "negotiator": { 513 | "version": "0.6.2", 514 | "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", 515 | "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" 516 | }, 517 | "on-finished": { 518 | "version": "2.3.0", 519 | "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", 520 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 521 | "requires": { 522 | "ee-first": "1.1.1" 523 | } 524 | }, 525 | "only": { 526 | "version": "0.0.2", 527 | "resolved": "https://registry.npm.taobao.org/only/download/only-0.0.2.tgz", 528 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" 529 | }, 530 | "parseurl": { 531 | "version": "1.3.3", 532 | "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", 533 | "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" 534 | }, 535 | "path-is-absolute": { 536 | "version": "1.0.1", 537 | "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 538 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 539 | }, 540 | "postcss": { 541 | "version": "7.0.32", 542 | "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.32.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-7.0.32.tgz", 543 | "integrity": "sha1-QxDW7jRwU9o0M9sr5JKIPWLOxZ0=", 544 | "requires": { 545 | "chalk": "^2.4.2", 546 | "source-map": "^0.6.1", 547 | "supports-color": "^6.1.0" 548 | } 549 | }, 550 | "postcss-modules": { 551 | "version": "3.2.0", 552 | "resolved": "https://registry.npm.taobao.org/postcss-modules/download/postcss-modules-3.2.0.tgz", 553 | "integrity": "sha1-HKhw0ZfNCaeWQlPhLeKqyQbJQlY=", 554 | "requires": { 555 | "generic-names": "^2.0.1", 556 | "icss-replace-symbols": "^1.1.0", 557 | "lodash.camelcase": "^4.3.0", 558 | "postcss": "^7.0.32", 559 | "postcss-modules-extract-imports": "^2.0.0", 560 | "postcss-modules-local-by-default": "^3.0.2", 561 | "postcss-modules-scope": "^2.2.0", 562 | "postcss-modules-values": "^3.0.0", 563 | "string-hash": "^1.1.1" 564 | } 565 | }, 566 | "postcss-modules-extract-imports": { 567 | "version": "2.0.0", 568 | "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz", 569 | "integrity": "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4=", 570 | "requires": { 571 | "postcss": "^7.0.5" 572 | } 573 | }, 574 | "postcss-modules-local-by-default": { 575 | "version": "3.0.2", 576 | "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.2.tgz", 577 | "integrity": "sha1-6KZWG+kUqvPAUodjd1JMqQ27eRU=", 578 | "requires": { 579 | "icss-utils": "^4.1.1", 580 | "postcss": "^7.0.16", 581 | "postcss-selector-parser": "^6.0.2", 582 | "postcss-value-parser": "^4.0.0" 583 | } 584 | }, 585 | "postcss-modules-scope": { 586 | "version": "2.2.0", 587 | "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz?cache=0&sync_timestamp=1584619550024&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-2.2.0.tgz", 588 | "integrity": "sha1-OFyuATzHdD9afXYC0Qc6iequYu4=", 589 | "requires": { 590 | "postcss": "^7.0.6", 591 | "postcss-selector-parser": "^6.0.0" 592 | } 593 | }, 594 | "postcss-modules-values": { 595 | "version": "3.0.0", 596 | "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz", 597 | "integrity": "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA=", 598 | "requires": { 599 | "icss-utils": "^4.0.0", 600 | "postcss": "^7.0.6" 601 | } 602 | }, 603 | "postcss-selector-parser": { 604 | "version": "6.0.2", 605 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz", 606 | "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", 607 | "requires": { 608 | "cssesc": "^3.0.0", 609 | "indexes-of": "^1.0.1", 610 | "uniq": "^1.0.1" 611 | } 612 | }, 613 | "postcss-value-parser": { 614 | "version": "4.1.0", 615 | "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz?cache=0&sync_timestamp=1588083303810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-4.1.0.tgz", 616 | "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=" 617 | }, 618 | "resolve-path": { 619 | "version": "1.4.0", 620 | "resolved": "https://registry.npm.taobao.org/resolve-path/download/resolve-path-1.4.0.tgz", 621 | "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", 622 | "requires": { 623 | "http-errors": "~1.6.2", 624 | "path-is-absolute": "1.0.1" 625 | }, 626 | "dependencies": { 627 | "http-errors": { 628 | "version": "1.6.3", 629 | "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1593407638690&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", 630 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 631 | "requires": { 632 | "depd": "~1.1.2", 633 | "inherits": "2.0.3", 634 | "setprototypeof": "1.1.0", 635 | "statuses": ">= 1.4.0 < 2" 636 | } 637 | }, 638 | "inherits": { 639 | "version": "2.0.3", 640 | "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 641 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 642 | }, 643 | "setprototypeof": { 644 | "version": "1.1.0", 645 | "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", 646 | "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" 647 | } 648 | } 649 | }, 650 | "safe-buffer": { 651 | "version": "5.1.2", 652 | "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", 653 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 654 | }, 655 | "setprototypeof": { 656 | "version": "1.1.1", 657 | "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", 658 | "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" 659 | }, 660 | "source-map": { 661 | "version": "0.6.1", 662 | "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", 663 | "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" 664 | }, 665 | "statuses": { 666 | "version": "1.5.0", 667 | "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", 668 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 669 | }, 670 | "stream-replace": { 671 | "version": "1.0.0", 672 | "resolved": "https://registry.npm.taobao.org/stream-replace/download/stream-replace-1.0.0.tgz", 673 | "integrity": "sha1-CswL8ydWYmZuSLxdoiwIBwCyaQ0=" 674 | }, 675 | "string-hash": { 676 | "version": "1.1.3", 677 | "resolved": "https://registry.npm.taobao.org/string-hash/download/string-hash-1.1.3.tgz", 678 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" 679 | }, 680 | "supports-color": { 681 | "version": "6.1.0", 682 | "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", 683 | "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", 684 | "requires": { 685 | "has-flag": "^3.0.0" 686 | } 687 | }, 688 | "to-fast-properties": { 689 | "version": "2.0.0", 690 | "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", 691 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 692 | }, 693 | "toidentifier": { 694 | "version": "1.0.0", 695 | "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", 696 | "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" 697 | }, 698 | "tsscmp": { 699 | "version": "1.0.6", 700 | "resolved": "https://registry.npm.taobao.org/tsscmp/download/tsscmp-1.0.6.tgz", 701 | "integrity": "sha1-hbmVg6w1iexL/vgltQAKqRHWBes=" 702 | }, 703 | "type-is": { 704 | "version": "1.6.18", 705 | "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", 706 | "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", 707 | "requires": { 708 | "media-typer": "0.3.0", 709 | "mime-types": "~2.1.24" 710 | } 711 | }, 712 | "uniq": { 713 | "version": "1.0.1", 714 | "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", 715 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" 716 | }, 717 | "vary": { 718 | "version": "1.1.2", 719 | "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", 720 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 721 | }, 722 | "yallist": { 723 | "version": "3.1.1", 724 | "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", 725 | "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=" 726 | }, 727 | "ylru": { 728 | "version": "1.2.1", 729 | "resolved": "https://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz", 730 | "integrity": "sha1-9Xa2M0FUeYnB3nuiiHYJI7J/6E8=" 731 | } 732 | } 733 | } 734 | -------------------------------------------------------------------------------- /my-vite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-vite", 3 | "version": "0.1.0", 4 | "description": "", 5 | "main": "index.js", 6 | "bin": "cli.js", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "zce (https://zce.me/)", 11 | "license": "MIT", 12 | "peerDependencies": { 13 | "@vue/compiler-sfc": "^3.0.0-beta.20" 14 | }, 15 | "dependencies": { 16 | "koa": "^2.13.0", 17 | "koa-send": "^5.0.1", 18 | "stream-replace": "^1.0.0" 19 | } 20 | } 21 | --------------------------------------------------------------------------------