vite2+vue2+vant2+ts

总方针:是什么?从哪里来?要到哪里去?

 一、是什么?

* vite ------- vue 作者尤雨溪开发的web开发工具

* 它具有的特性:静态服务器、构建工具、轻量、开箱即用、极速模块热替换、内置Rollup 用于打包项目

* 作者在微博上的发言:

Vite,一个基于浏览器原生 ES imports 的开发服务器。利用浏览器去解析 imports,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。同时不仅有 Vue 文件支持,还搞定了热更新,而且热更新的速度不会随着模块增多而变慢。针对生产环境则可以把同一份代码用 rollup 打。虽然现在还比较粗糙,但这个方向我觉得是有潜力的,做得好可以彻底解决改一行代码等半天热更新的问题。

它的主要特点:基于浏览器 native 的 ES module

[ES module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) 来开发,省略打包这个步骤,因为需要什么资源直接在浏览器里引入即可。

本质上是用C++ / Rust / Go 重写了依赖分析/模块构建能力,但是充分利用了已有的生态,使得开发成本极大降低。

## 二、从哪里来?

* 时下热门的打包构建工具有:parcel 、 rollup(es module/ tree shaking) 、 webpack(最强的性能、扩展能力强)

* 2.1 如何食用

```javascript

# npm 6.x

npm init @vitejs/app <project-name> --template vue

# npm 7+, extra double-dash is needed:

npm init @vitejs/app <project-name> --template vue

# yarn

yarn create @vitejs/app <project-name> --template vue

cd <project-name>

npm install (or `yarn`)

npm run dev (or `yarn dev`)

```

* 2.2 背后的原理

* 2.2.1 如何去掉打包步骤?

打包的概念是开发者利用打包工具将应用各个模块集合在一起形成 bundle,以一定规则读取模块的代码——以便在不支持模块化的浏览器里使用。

为了在浏览器里加载各模块,打包工具会借助胶水代码用来组装各模块,比如 webpack 使用 map存放模块 id 和路径,使用 __webpack_require__ 方法获取模块导出。

vite 利用浏览器原生支持模块化导入这一特性,省略了对模块的组装,也就不需要生成 bundle,所以打包这一步就可以省略了。

* 2.2.2 如何实现按需加载?

webpack 之类的打包工具会将各模块提前打包进 bundle 里,但打包的过程是静态的——不管某个模块的代码是否执行到,这个模块都要打包到 bundle 里,这样的坏处就是随着项目越来越大打包后的 bundle 也越来越大。

开发者为了减少 bundle 大小,会使用动态引入 import() 的方式异步的加载模块( 被引入模块依然需要提前打包),又或者使用 tree shaking 等方式尽力的去掉未引用的模块,然而这些方式都不如 vite 的优雅,vite 可以只在需要某个模块的时候动态(借助 import() )的引入它,而不需要提前打包,虽然只能用在开发环境,不过这就够了。

## 三、要到哪里去?

正如尤大大所言:彻底解决改一行代码等半天热更新的问题。咱们配好料就等饺子下锅了,真香!

## 四、如何实践?

直接上干货:下面链接

[vite2-vue2-vant2-ts](https://github.com/liugangtaotie/vite2-vue2-ts)

搭建的这套框架,解决了几个前端经常遇到的问题:

a. vite2实现开发环境秒级更新;

b. 实现响应式布局,从而达到任意屏幕适配;

c. 实现vant2 自定义主题色;

d. 加入eslint、stylelint、prettier等插件,实现代码统一规范。

### 4.1 开发环境秒级更新

    上文已经做了解释,目前只关心实现效果:


![runtime.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1e1fbb9597064014a86ff0af579c5646~tplv-k3u1fbpfcp-watermark.image)

启动时间为757ms,基本是秒级更新。

### 4.2 任意屏幕适配

采用viewpoint方案:

```

// 步骤一

npm i -D postcss-px-to-viewport

// 步骤二,配置postcss.config.js文件

module.exports = ({ file }) => {

  return {

    plugins: {

      // autoprefixer: {},

      "postcss-px-to-viewport": {

        viewportWidth: 375, // 视口的宽度,对应的时设计稿的宽度/2,一般为750

        unitToConvert: "px",

        viewportHeight: 667, // 视口的高度,对应的是设计稿的高度(也可以不配置)

        unitPrecision: 5, // 指定‘px’转换为视口单位值的小数位数(很多时候无法整除)

        propList: ["*"], // (Array)指定可以转换的css属性,默认是['*'],代表全部属性进行转换

        viewportUnit: "vw", // 指定需要转换成的视口单位,建议使用vw

        fontViewportUnit: "vw",

        selectorBlankList: ["ignore", "tab-bar"], // 指定不需要转换的类

        minPixelValue: 1, // 小于或等于‘1px’不转换为视口单位

        mediaQuery: false, // 允许在媒体查询中转换为‘px’

        replace: true,

        landscape: false,

        landscapeUnit: "vw",

        landscapeWidth: 568,

        exclude: [], // 排除node_modules文件中第三方css文件

        // exclude: /(\/|\\)(node_modules)(\/|\\)/, // 排除node_modules文件中第三方css文件

      },

    },

  };

};

```

### 4.3 实现vant2 自定义主题色

```

// 步骤一:官网复制theme.less文件到  src/assets/css/theme.less

...

// Tabs

@tabs-default-color: @xx-color-primary;

...

// 步骤二:引入全局样式

...

import { xxx } from "vant";

import "vant/lib/index.less"; // 全局引入样式

Vue.use(xxx);

...

// 步骤三:vite.config.ts

...

import path, { resolve } from "path";

...

export default defineConfig({

...

// 配置别名

  resolve: {

    alias: [

      {

        find: /^~/,

        replacement: "",

      },

      {

        find: "@",

        replacement: resolve(__dirname, "src"),

      },

      {

        find: "@ASS",

        replacement: resolve(__dirname, "src/assets"),

      },

      ...

    ],

  },

...

css: {

    preprocessorOptions: {

      less: {

        modifyVars: {

          hack: `true; @import "@ASS/css/theme.less";`,

        },

      },

    },

  },

...

```

实践后的效果:

![Screenshot 2021-04-04 at 4.56.01 PM.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/51f2e8a0877045a4a2d4785d49743b44~tplv-k3u1fbpfcp-watermark.image)

### 4.4 代码统一规范

加入基本eslint 、stylelint、 prettier 等配置实现代码统一,[具体详见](https://github.com/liugangtaotie/vite2-vue2-ts)

推荐的官方文档

[vue-cli 迁移 vite2 实践小结](https://zhuanlan.zhihu.com/p/353601634)

[Vite 2.0 初探](https://zhuanlan.zhihu.com/p/360109945)

[备战2021:Vite2项目最佳实践](https://zhuanlan.zhihu.com/p/349271585)

[重构于Vite](https://zhuanlan.zhihu.com/p/352216610)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容