From bb0c105293d60f1a65896b659d62a6e35095c900 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 17 Dec 2020 14:26:50 -0500 Subject: [PATCH] wip: port rollup-plugin-vue to vite plugin --- LICENSE | 2 +- package.json | 3 +- packages/plugin-vue/package.json | 34 +- packages/plugin-vue/src/handleHotUpdate.ts | 194 +++++++++++ packages/plugin-vue/src/index.ts | 167 +++++++++ packages/plugin-vue/src/main.ts | 328 ++++++++++++++++++ packages/plugin-vue/src/script.ts | 49 +++ packages/plugin-vue/src/style.ts | 41 +++ packages/plugin-vue/src/template.ts | 111 ++++++ .../plugin-vue/src/utils/descriptorCache.ts | 26 ++ packages/plugin-vue/src/utils/error.ts | 30 ++ packages/plugin-vue/src/utils/query.ts | 24 ++ packages/plugin-vue/tsconfig.json | 21 ++ 13 files changed, 1027 insertions(+), 3 deletions(-) create mode 100644 packages/plugin-vue/src/handleHotUpdate.ts create mode 100644 packages/plugin-vue/src/index.ts create mode 100644 packages/plugin-vue/src/main.ts create mode 100644 packages/plugin-vue/src/script.ts create mode 100644 packages/plugin-vue/src/style.ts create mode 100644 packages/plugin-vue/src/template.ts create mode 100644 packages/plugin-vue/src/utils/descriptorCache.ts create mode 100644 packages/plugin-vue/src/utils/error.ts create mode 100644 packages/plugin-vue/src/utils/query.ts create mode 100644 packages/plugin-vue/tsconfig.json diff --git a/LICENSE b/LICENSE index 93a89715..9c1b313d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019-present, Yuxi (Evan) You +Copyright (c) 2019-present, Yuxi (Evan) You and Vite contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/package.json b/package.json index 744a5eab..d6f9102a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "packages/*" ], "scripts": { - "lint": "eslint --ext .ts packages/*/src/**" + "lint": "eslint --ext .ts packages/*/src/**", + "bundle": "esbuild packages/vite/src/node/index.ts packages/vite/src/node/cli.ts --bundle --platform=node --target=node12 --external:fsevents --external:sugarss --external:bufferutil --external:utf-8-validate --outdir=esbuild" }, "devDependencies": { "@types/node": "^14.14.10", diff --git a/packages/plugin-vue/package.json b/packages/plugin-vue/package.json index 4a28e9ab..0550e4b7 100644 --- a/packages/plugin-vue/package.json +++ b/packages/plugin-vue/package.json @@ -1,4 +1,36 @@ { "name": "@vitejs/plugin-vue", - "version": "1.0.0" + "version": "1.0.0", + "license": "MIT", + "files": [ + "dist" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "dev": "tsc -w --incremental -p ." + }, + "engines": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/vitejs/vite.git" + }, + "bugs": { + "url": "https://github.com/vitejs/vite/issues" + }, + "homepage": "https://github.com/vitejs/vite/tree/master/#readme", + "peerDependencies": { + "@vue/compiler-sfc": "^3.0.4" + }, + "devDependencies": { + "@rollup/pluginutils": "^4.1.0", + "@types/hash-sum": "^1.0.0", + "@vue/compiler-sfc": "^3.0.4", + "debug": "^4.3.1", + "hash-sum": "^2.0.0", + "rollup": "^2.35.1", + "source-map": "^0.6.1" + } } diff --git a/packages/plugin-vue/src/handleHotUpdate.ts b/packages/plugin-vue/src/handleHotUpdate.ts new file mode 100644 index 00000000..8c1c80d7 --- /dev/null +++ b/packages/plugin-vue/src/handleHotUpdate.ts @@ -0,0 +1,194 @@ +import fs from 'fs' +import _debug from 'debug' +import { parse, SFCBlock, SFCDescriptor } from '@vue/compiler-sfc' +import { + getDescriptor, + setDescriptor, + setPrevDescriptor +} from './utils/descriptorCache' +import { getResolvedScript, setResolvedScript } from './script' +import { ModuleNode } from 'vite' + +const debug = _debug('vite:hmr') + +/** + * Vite-specific HMR handling + */ +export async function handleHotUpdate( + file: string, + modules: ModuleNode[] +): Promise { + if (!file.endsWith('.vue')) { + return + } + + const prevDescriptor = getDescriptor(file) + if (!prevDescriptor) { + // file hasn't been requested yet (e.g. async component) + return + } + + let content = fs.readFileSync(file, 'utf-8') + if (!content) { + await untilModified(file) + content = fs.readFileSync(file, 'utf-8') + } + + const { descriptor } = parse(content, { + filename: file, + sourceMap: true + }) + setDescriptor(file, descriptor) + setPrevDescriptor(file, prevDescriptor) + + let needRerender = false + const affectedModules = new Set() + const mainModule = modules.find( + (m) => !/type=/.test(m.url) || /type=script/.test(m.url) + ) + const templateModule = modules.find((m) => /type=template/.test(m.url)) + + if ( + !isEqualBlock(descriptor.script, prevDescriptor.script) || + !isEqualBlock(descriptor.scriptSetup, prevDescriptor.scriptSetup) + ) { + affectedModules.add(mainModule) + } + + if (!isEqualBlock(descriptor.template, prevDescriptor.template)) { + // when a