# vue-cli-sample **Repository Path**: self-denial-cy/vue-cli-sample ## Basic Information - **Project Name**: vue-cli-sample - **Description**: Learn Vue Cli - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-14 - **Last Updated**: 2022-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: Vue, vue-cli ## README # 介绍 Vue CLI是一个基于Vue进行快速开发的完整系统,包括 - 通过`@vue/cli`实现的交互式项目脚手架 - 通过`@vue/cli`+`@vue/cli-service-global`实现的零配置原型开发 - 一个开发时依赖`@vue/cli-service`,该依赖 - 可升级; - 基于webpack构建,并自带合理的默认配置 - 可以通过项目内的配置文件进行配置 - 可以通过插件进行扩展 - 一个丰富的官方插件集合,集成了前端生态中最好的工具 - 一套完全图形化的创建和管理Vue项目的用户界面 ## 该系统的组件 ### CLI `@vue/cli`是一个全局安装的npm包,提供了终端中的vue命令 ### CLI服务 `@vue/cli-service`是一个开发时依赖,局部安装在每个`@vue/cli`创建的项目中 它基于webpack和webpack-dev-server,包括 - 加载其它CLI插件的核心服务 - 一个针对绝大部分应用优化过的内部webpack配置 - 提供`serve`,`build`,`inspect`命令 ### CLI插件 CLI插件是向Vue项目提供可选功能的npm包 # 基础 ## 插件和Preset ### 插件 Vue CLI使用了一套基于插件的架构 当查看一个新创建项目的`package.json`文件时,就会发现依赖项大多都是以`@vue/cli-plugin-`开头的 插件可以修改webpack的内部配置,也可以向`vue-cli-service`注入新命令 在项目创建的过程中,提供的绝大部分特性都是通过插件来实现的 ## CLI服务 ### 使用命令 在一个Vue CLI项目中,`@vue/cli-service`安装了一个`vue-cli-service`的命令 该命令可以在 npm scripts 中以`vue-cli-service`或在终端中以`./node_modules/.bin/vue-cli-service`访问 ### vue-cli-service serve ![image-20220301222645288](https://gitee.com/self-denial-cy/pictures/raw/master/PicGo/20220301222645.png) 该命令会启动一个基于 webpack-dev-server 的开发服务器并附带开箱即用的模块热重载 除了通过命令行参数,也可以通过 `vue.config.js`中 devServer 字段配置开发服务器 命令行参数 entry 将被指定为唯一入口(默认为`src/main.js`或`src/main.ts`) ### vue-cli-service build ![image-20220301225426151](https://gitee.com/self-denial-cy/pictures/raw/master/PicGo/20220301225426.png) ### vue-cli-service inspect ![image-20220301232732674](https://gitee.com/self-denial-cy/pictures/raw/master/PicGo/20220301232732.png) 使用该命令来审查一个 Vue CLI 项目的 webpack config ### 查看所有的可用命令 有些 CLI 插件会向 `vue-cli-service`注入额外的命令 例如`@vue/cli-plugin-eslint`会注入`vue-cli-service lint`命令 ```shell // 查看所有注入的命令 npx vue-cli-service help // 查看某个命令可用的选项 npx vue-cli-service help [command] ``` ### 缓存和并行处理 - `cache-loader`会默认为 Vue、Babel、TypeScript 编译开启。文件会缓存在`node_modules/.cache`中——如果遇到编译方面问题,记得先删除缓存目录后再试试看 - `thread-loader`会在多核 CPU 的机器上为 Babel、TypeScript 转译开启 # 开发 ## 浏览器兼容性 ### browserslist 项目中`package.json`文件中的`browserslist`字段或一个单独的`.browserslist`文件,指定了当前项目的目标浏览器范围 这个值会被`@babel/preset-env`和`autoprefixer`解析用来确定需要转译的 JavaScript 特性和需要添加的 CSS 浏览器前缀 ### Polyfill #### useBuiltIns:'usage' 一个默认的 Vue CLI 项目会使用 `@vue/babel-preset-app`,它通过`@babel/preset-env`和`browserslist`配置来决定项目中需要的 polyfill > Vue CLI 项目启用 Babel 功能的话,会引入依赖 @vue/cli-plugin-babel > > 同时生成 babel.config.js 文件,默认配置中的 @vue/cli-plugin-babel/preset 就是指向 @vue/babel-preset-app 默认情况下,它会把 `useBuiltIns: 'usage'`传递给 `@babel/preset-env` 这样它会根据源代码中出现的语言特性自动检测需要的 polyfill 这确保了最终包里 polyfill 数量的最小化 然而,这也意味着如果其中有一个依赖项需要特殊的 polyfill 默认情况下 Babel 无法将其检测出来 如果有依赖项需要 polyfill: - 如果该依赖基于一个目标环境不支持的 ES 版本:将其添加到 `vue.config.js` 中的 `transpileDependencies` 选项,这会为该依赖项同时开启语法转译和根据使用情况自动 polyfill - 如果该依赖项交付了 ES5 代码并显式的列出了需要的 polyfill:可以使用 `@vue/babel-preset-app` 的 polyfills 选项预包含所需要的 polyfill( es.promise 将被默认包含,因为现在的库依赖 Promise 相当普遍 ) ```js // babel.config.js module.exports={ presets:[ ['@vue/app',{ polyfills:[ 'es.promise', 'es.symbol' ] }] ] } // 这里的 @vue/app 大概或许也许可能就是指向 @vue/babel-preset-app 吧。。。 // 反正我找了很久还是没找到说明,希望有大佬看到可以帮忙解答一下 ``` > 推荐以这种方式添加 polyfill 而不是在源代码中直接导入,因为如果这里列出的 polyfill 在 browserslist 的目标中原生支持,则它会被自动排除,不会重复导入 - 如果该依赖项交付 ES5 代码,但使用了 ES6+ 特性且没有显式的列出需要的 polyfill:使用 `useBuiltIns: 'entry'` 然后在入口文件添加 `import 'core-js/stable'` 和 `import 'regenerator-runtime/runtime'`。这会根据 `browserslist` 目标导入所有 polyfill ,这样就不用担心依赖的 polyfill 问题了,但是因为包含了一些没有用到的polyfill 所以最终的包大小可能会增加 #### 构建库或是 Web Component 时的 Polyfills 当使用 Vue CLI 来构建一个库或是 Web Component 时,推荐给 `@vue/babel-preset-app` 传入 `useBuiltIns: false` 选项。这能够确保当前库或是组件不包含不必要的 polyfills 。通常来说,处理 polyfills 问题应当是最终使用库或组件的应用的责任。 ### 现代模式 有了 Babel 在代码中可以使用所有最新的 ES2015+ 语言特性,但也意味着最终需要交付转译和 polyfill 后的包以支持旧浏览器 这些转译后的包通常都比原生的 ES2015+ 代码更多冗长,运行更慢 现如今绝大多数现代浏览器都已经支持了原生的 ES2015,所以因为要支持更老的浏览器而为它们交付笨重的代码是一种浪费 Vue CLI 提供了 【现代模式】 以解决这个问题 ```shel vue-cli-service build --modern ``` Vue CLI 会生成应用的两个版本:一个现代版的包,面向支持 ES modules 的现代浏览器,另一个旧版本的包,面向不支持的旧浏览器 最酷的是这里没有任何特殊的部署要求:其生成的 HTML 文件: - 现代版的包会通过 `