underfin / vite-plugin-vue2

Vue2 plugin for Vite
621 stars 84 forks source link

error: vue-template-compiler not found #86

Closed zhangyuang closed 3 years ago

zhangyuang commented 3 years ago

for the commit

move vue-template-compiler to peerDependencies only output a warning cause vue-template-compiler has not been installed. image

$ npm -v
6.14.7

image

2096903746 commented 3 years ago

npm i vue-template-compiler@x.x.x (The same version of vue)

zhangyuang commented 3 years ago

fix by #87

IndexXuan commented 3 years ago

@zhangyuang why not install vue-template-compiler yourself ? I think each Vue 2 project should install it in your own project. @2096903746 I think you are right, but why they move vue-template-compiler to deps again and the author @underfin agreed ? I really really dont know why ?

https://github.com/underfin/vite-plugin-vue2/issues/96

zhangyuang commented 3 years ago

@IndexXuan 时间有限,直接讲中文了。 开发者用你的东西不关心你的具体细节。你最起码的要求是我安装了你的依赖后我的项目能够跑起来。事实上当你从 vite 默认创建的 Vue3 项目改造成 Vue2 后并不能直接跑起来会提示 vue-template-compiler 找不到。这就是有问题的。要么你就在本项目的 readme 中加上需要同时安装 vite-plugin-vue2vue-template-compiler 要么你就把vue-template-compiler 作为 vite-plugin-vue2 的依赖自动安装。而现在提示vue-template-compiler找不到,我肯定知道解决办法可以通过手动安装 vue-template-compiler来解决。但是其他开发者呢?就算假设所有开发者都知道,报错后让用户来手动单独安装其他依赖从设计层面来讲就是不合格的

zhangyuang commented 3 years ago

and 你 issue 的那个问题你保持所有 vue-template-compiler 都是最新的版本就行了。peerdependencies 安装的时候不存在不会 error 只会 warning。启动时才会真正报错,所以 vue-template-compiler 必须放在 dependencies

IndexXuan commented 3 years ago

@zhangyuang 那我也中文了,你要考虑大部分场景,大多数用户不论是新建 vite2 + Vue 2 项目还是老项目迁移(占比最大)都是自带 vue-template-compiler 的,且他们的版本很容易不是最新的,例如 2.6.12 很久了,2.6.13/2.6.14 最近连发两版,造成用户启动必然报错,体验很不佳。说白了,就是这个插件真的是 vite2 + Vue 2 的救命稻草,但是第一次使用基本要报错。试问公司项目我说升级 2.6.14 就升级 ?我 Vue 从 2.5.17 升级到 2.6.14 + VTC 2.6.14 你来帮我测试 ?

我唯一能做的就是 yarn resolution,所以本质问题是,为了你这种少数场景破坏了大多数场景(要杠精么,Vue 2 项目有 vue-template-compiler 的多还是没有的多 ?)所以你的所谓“优化”,你满足了你开箱即用,但是用你的道理,不是让更多的人,无法开箱即用了么 ?

这个插件本身就是利用 vue-template-compiler 解析,项目就应该自带 @underfin 大佬怎么看 ?

zhangyuang commented 3 years ago

我不懂你说的 2.6.12 很久是什么意思。Vue自身是不可能写死版本号的,符合 semver 规则的话删掉lock安装自动就是最新的依赖。 另外什么叫 所以你的所谓“优化”,你满足了你开箱即用,但是用你的道理,不是让更多的人,无法开箱即用了么 ? vite-plugin-vue2 代码里面直接 importvue-template-compiler它就应该是 dependencies ,这是最基本的设计规范。

import path from 'path'
import slash from 'slash'
import hash from 'hash-sum'
import { parse, SFCDescriptor } from '@vue/component-compiler-utils'
import * as vueTemplateCompiler from 'vue-template-compiler'
IndexXuan commented 3 years ago

哦 ?yarn.lock 说删就删,还是那个问题 ?谁来测试,我当然不否则最终都要升级到最新版,但不是安装了这个插件就必须且这个插件根本不依赖 vue-template-compiler 版本,低版本绝对可用。

至于 peerDeps,就你懂,本身 peerDeps 就有争议 ?那我列几个例子。 https://github.com/vuejs/vue-cli/blob/820b9b7826764bb3f8928d9da953df73348248b9/packages/%40vue/cli-service/lib/config/base.js#L63

https://github.com/vuejs/vue-loader/blob/b53ae44e4b9958db290f5918248071e9d2445d38/lib/loaders/templateLoader.js#L22

你比 @vue/cli-service / vue-loader 还懂 ??? 这几个都是直接用了 VTC,但是都是 peerDeps

IndexXuan commented 3 years ago

@huih99 你的 issue 被又改回来了,怎么看待这个问题 ? 非引战,真心想讨论

IndexXuan commented 3 years ago

放在 peerDeps 里,报错很明显,npm / yarn 会自己提示你安装 xxx 依赖。放在 deps 里,上来 yarn dev 就是 xxx mismatch,然后呐 ?然后怎么做没说。用 yarn 和 pnpm 还有救,用 npm 连 resolution 都没有,怎么搞 mismatch 问题 ?

zhangyuang commented 3 years ago

1、你锁 lock 是你应用自己的事情。框架,库本身没有义务为你的lock负责 2、另外 peerdependencies 在npm6和npm7的行为也不完全一致

如果要移除 vue-template-compiler 要么你就在 readme里面写上需要同时安装 vue-template-compiler 要么就检测到没有自动安装。现在的报错后手动安装的方式是不可能被接受的。谁会在安装的时候关注那一堆 npm warning,只有启动的时候直接 error 找不到才会去查原因 and 这不是满足我的开箱即用。用 vite 脚手架来从0开始新的vue2项目的人跟老vue2项目加入vite的人数量都很多

IndexXuan commented 3 years ago

@zhangyuang 那你说的太对了,NPM 7 开开启了 strict peerDeps,更让人无法少安装依赖。 哦,看来你也说了,应该是检测加提示,而不是放 deps,那我 PR 去了

IndexXuan commented 3 years ago

从 create-vite-app 产出项目改成 Vue 2 就不知道安装 vue-template-compiler,那是怪 vite 官方没提供 Vue 2 模板,你咋不说人家帮你装了 @vue/compiler-sfc 的 ?还装多了呐。

zhangyuang commented 3 years ago

-。- 心累,非撕逼 站在我个人的角度,遇到的问题我都能解决。但是其他开发者呢,绝大多数开发者都是初学者,你不能要求他们能够迅速定位问题出在哪里。开发者要的只是安装了依赖后能够把应用跑起来。 and 本来 resolution peerdependencies 就很多争议。以及这些特性中 npm yarn cnpm 以及阿里内部的 tnpm 对这些模块的安装机制都不一样

IndexXuan commented 3 years ago

一样的啊,哥哥。都是追求安装了就跑,但是要不 mismatch,要不少依赖。哪个更多,哪个更难解决 ? 一个是安装依赖即可,一个是真的不知道咋办啊,哥

公司项目又不是我一个人,我上来就把几千几万行 yarn.lock 删了,Vue 非要把 2.5.17/2.6.12 换成 2.6.14,我推得动么,哥

zhangyuang commented 3 years ago

这又是对 要不要lock的争论了。事实上 cnpm tnpm 都是不生成lock的 参见 https://zhuanlan.zhihu.com/p/22934066 and 模块本身是没有义务为你的lock负责的,但是 vue 受众太多,你发的链接是因为受众太多所以 vue 比较 贴心的帮用户去check了一下。而没有 peerdependencies 直接在 dependencies 的模块才是占据了npm的主流模块

huih99 commented 3 years ago

其实我认为这个vue-template-compiler是不应该放在dependencies中的,但是作者他接受了这个提案又把我的pr改回去了,也只能接受,作者现在提供了另一个方式来修改引用的vue-template-compiler版本。 peerDependencies其本意就是告诉使用者,要想正常使用就得安装这里面指定的依赖包,因为require寻找包的逻辑,有些依赖就不该在depencies中指定,会造成引用的版本与使用者原本安装的版本不一致的情况。首先我不赞同@zhangyuang的说法:npm依赖包应该就应该开箱即用。 作为使用者是有必要了解你自己使用的依赖包到底是干什么的,以及为了使用这个依赖包需要提供什么环境,以及必备的排错能力。 因为这个插件本身是为了vue开发而准备的,我不知道什么情况下会出现没有安装vue-template-compiler的情况,即便出现了,我认为这也是使用者需要去解决的问题,而不是依赖库开发者去解决这个问题。所以我依然倾向与将这个依赖放在perrDependencies中,特别是这个compiler版本需要严格与vue版本匹配的现状情况下。

IndexXuan commented 3 years ago

@huih99 那种新方式我没看懂啊,怎么用,有例子么 ? @underfin 哥,辛苦百忙之中出来说句话啊

huih99 commented 3 years ago

如果都要靠库作者去解决一切问题的话,我们使用者为什么还要不停的去给作者提pr呢,这也是我们使用者发现错误并且解决错误然后提交更改给作者的意义

huih99 commented 3 years ago

@huih99 那种新方式我没看懂啊,怎么用,有例子么 ? @underfin 哥,辛苦百忙之中出来说句话啊

有一个选项啊,你看作者最上面的回复,新增了一个选项了,用以指定compiler版本

zhangyuang commented 3 years ago

大概以下的几种解法 1、给 vite 官方新增 vue2的模版快速创建,抛弃自定义用户从vue3+Vite手动改成vue2+vite的场景 2、本项目直接提供 vue2+vite-plugin的模版快速创建,而不只是单独的一个插件依赖 3、本项目 readme 加上提示若无 vtc 则需要手动安装 4、像vue-cli一样启动的时候去check依赖,成本略高 最终还是得@underfin 决定

IndexXuan commented 3 years ago

@huih99 没用成功啊,我是想 require 自己的 VTC 传进去,期待不报错 mismatch 可还是不行啊。 其实我对 VTC 放哪里都能接受,只要我能封装抹平给其他同事用就行,但现在不行,其他同事每个项目都报 mismatch。

huih99 commented 3 years ago

看changeLog image 估计你需要使用require(绝对路径)来引用正确的VTC版本

zhangyuang commented 3 years ago

那就行了,看来后来 作者已经开了一个口子来自己指定 vtc

zhangyuang commented 3 years ago

image and 刚好看到我发的那篇文章下面 vue-cli 作者的争议

IndexXuan commented 3 years ago

image

https://github.com/vitejs/vite/blob/main/packages/plugin-vue/package.json#L32 maybe vite-plugin-vue2 should align with @vitejs/plugin-vue. compiler should be peerDeps.