从0-1实现一个自己的脚手架

当我们在开发的时候,时常会在创建项目的时候重复很多操作,比如下载相同的依赖(锁定依赖版本)封装网络请求封装路由配置代码提示/检查配置vite/webpack打包配置自动导入(auto-import)配置项目基础结构注册全局指令等,有非常多重复的步骤其实都是可以被省略的,或者说开发者应该专注于业务的实现,而不是在这些上浪费大量的时间,所以我们可以将以上重复且关键的步骤提炼出来放在一个仓库里,然后创建一个属于我们自己的脚手架并放在npm上,通过全局安装这个脚手架,使用脚手架指令就可以直接下载我们存在仓库里面的基础模版了。

 一、创建脚手架

1、初始化脚手架

npm init -y

2、创建入口文件

mkdir bin

cd bin

touch www.js

//然后进入 www.js 文件 ,将下列代码粘贴上去

#! /usr/bin/env node

require('../index.js')

3、配置package.json的入口文件

//将以下代码贴入 package.json中

  "bin": "bin/www",

4、在根目录创建index.js并软链接到全局

touch index.js

cnpm link

5、安装依赖(工具)

    "axios": "^0.26.1",
    "chalk": "^4.0.0",
    "commander": "^9.0.0",
    "download-git-repo": "^3.0.2",
    "figlet": "^1.5.2",
    "fs-extra": "^10.0.1",
    "gitee-repo": "^0.0.2",
    "inquirer": "^8.2.1",
    "ora": "^5.0.0"

6、创建配置文件

        我已经将所要配置的文件都放在代码里面的,直接贴进去就行,当然也可以在我的基础上加以改造,可以让脚手架变的更加完善。

mkdir lib

touch api.js create.js Creator.js util.js

//index.js
const program = require("commander");
const chalk = require("chalk");
const figlet = require("figlet");
program
  .command("create <project-name>") //增加创建指令
  .description("create a new project") //添加描述信息
  .option("-f, --force", "overwrite target directory if it exists") //强制覆盖
  .action((projectName, cmd) =&g
<think> 我们正在讨论的是在非脚手架环境下(即没有使用Vue CLI等构建工具)如何在Vue项目中引入vue-virtual-scroller。根据引用[1]和[2],我们通常是在main.js中引入vue-virtual-scroller及其CSS文件,并使用Vue.use()来安装它。但是,在没有脚手架的情况下,项目可能没有使用模块打包工具(如Webpack)或者没有ES6模块支持,因此我们需要考虑传统引入方式。 然而,vue-virtual-scroller是一个npm包,它通常通过模块化的方式引入。如果项目没有使用构建工具,我们可以尝试通过全局script标签引入,但需要确认该库是否提供了UMD版本。 查看vue-virtual-scroller的文档,它确实提供了UMD构建版本,我们可以通过CDN引入。 因此,在不使用脚手架的情况下,我们可以这样引入: 1. 在HTML文件中通过`<script>`标签引入Vue(确保Vue已经引入,因为vue-virtual-scroller依赖Vue)。 2. 引入vue-virtual-scroller的UMD文件。 3. 引入vue-virtual-scroller的CSS文件。 步骤: 1. 在HTML的head中引入CSS: ```html <link rel="stylesheet" href="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.css"> ``` 2. 在Vue之后引入vue-virtual-scroller的UMD脚本: ```html <script src="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.umd.min.js"></script> ``` 3. 然后,在创建Vue实例之前,我们需要安装这个插件。因为UMD版本会自动将插件暴露为全局变量,我们可以使用`Vue.use()`来安装: ```html <script> Vue.use(VueVirtualScroller.default); // 注意:UMD版本导出的是对象,其default属性才是插件 </script> ``` 但是,请注意,不同版本的导出方式可能不同,如果直接暴露的是插件函数,则可以直接使用`Vue.use(VueVirtualScroller)`。我们可以查看控制台或者文档确认。 另一种方式,根据引用[3]和[4]中的使用示例,我们在组件中使用的是`<RecycleScroller>`或`<recycle-list>`等组件。因此,在全局安装插件后,我们就可以在任意组件中使用这些组件了。 注意:如果遇到问题,比如引用[3]中提到的错误,可能需要设置`key-field`属性,并且确保每个项都有一个唯一的键值。 所以,完整的HTML示例: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue Virtual Scroller Example</title> <!-- 引入vue-virtual-scroller的样式 --> <link rel="stylesheet" href="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.css"> <!-- 引入Vue --> <script src="https://unpkg.com/vue@2.6.14/dist/vue.js"></script> <!-- 引入vue-virtual-scroller的UMD文件 --> <script src="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.umd.min.js"></script> </head> <body> <div id="app"> <!-- 使用RecycleScroller组件 --> <RecycleScroller class="scroller" :items="list" :item-size="32" key-field="id" v-slot="{ item }" > <div class="user"> {{ item.name }} </div> </RecycleScroller> </div> <script> // 安装插件 Vue.use(VueVirtualScroller.default); // 注意:根据实际暴露的全局变量名调整 new Vue({ el: '#app', data: { list: [ { id: 1, name: 'User 1' }, { id: 2, name: 'User 2' }, // ... 很多数据 ] } }); </script> </body> </html> ``` 注意:上面的示例中,我们使用了`VueVirtualScroller.default`,这是因为UMD模块将默认导出放在default属性上。如果直接使用`VueVirtualScroller`作为插件对象,我们可能需要查看控制台是否有错误,或者尝试直接使用`VueVirtualScroller`(去掉.default)。 如果遇到导出问题,可以尝试: Vue.use(window['vue-virtual-scroller'].default); 或者,如果库已经将自身安装到Vue上,可能不需要手动调用`Vue.use`,但通常我们需要显式调用。 另外,引用[3]提到的问题:如果列表项数量很大,可能会遇到“Rendered items limit reached”的错误,这是因为默认渲染项数有限制。可以通过设置`:buffer="1000"`(或更大的值)来增加缓冲区,或者确保正确设置`item-size`(每个项的高度)以帮助计算。 总结: 1. 通过CDN引入CSS和JS。 2. 使用`Vue.use`安装插件(注意导出对象)。 3. 在组件中使用`<RecycleScroller>`等组件,并注意设置正确的属性(如`key-field`,`item-size`等)。 最后,建议查阅vue-virtual-scroller官方文档以获取最新信息。 </think>在不使用脚手架(如 Vue CLI)的情况下,在 Vue 项目中引入 `vue-virtual-scroller` 需要手动配置。以下是完整的实现方法: ### 步骤 1:引入依赖 在 HTML 文件中直接引入 CDN 链接: ```html <!-- 引入 Vue --> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> <!-- 引入 vue-virtual-scroller --> <link rel="stylesheet" href="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.css"> <script src="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.umd.js"></script> ``` ### 步骤 2:注册组件 在 Vue 实例化前注册虚拟滚动组件: ```html <script> // 手动注册组件 Vue.component('RecycleScroller', VueVirtualScroller.RecycleScroller) Vue.component('DynamicScroller', VueVirtualScroller.DynamicScroller) Vue.component('DynamicScrollerItem', VueVirtualScroller.DynamicScrollerItem) new Vue({ el: '#app', data() { return { items: Array.from({length: 10000}, (_, i) => ({ id: i + 1, name: `Item ${i + 1}` })) } } }) </script> ``` ### 步骤 3:在模板中使用 ```html <div id="app"> <RecycleScroller class="scroller" :items="items" :item-size="50" key-field="id" v-slot="{ item }" > <div class="item"> {{ item.name }} </div> </RecycleScroller> </div> ``` ### 步骤 4:添加必要的 CSS ```css .scroller { height: 500px; /* 必须设置固定高度 */ overflow-y: auto; border: 1px solid #eee; } .item { height: 50px; /* 与 item-size 保持一致 */ line-height: 50px; padding: 0 15px; border-bottom: 1px solid #f0f0f0; } ``` ### 解决常见问题 1. **`Rendered items limit reached` 错误** ```html <RecycleScroller :buffer="200" <!-- 增加缓冲区 --> :prerender="10" <!-- 预渲染数量 --> > ``` 2. **滚动抖动问题** ```css .scroller { overflow-anchor: none; /* 禁用滚动锚定 */ } ``` 3. **动态高度支持** ```html <DynamicScroller :items="items" :min-item-size="50" key-field="id" v-slot="{ item, active }" > <DynamicScrollerItem :item="item" :active="active" :data-index="item.id" > <div :style="{ height: item.height + 'px' }"> {{ item.content }} </div> </DynamicScrollerItem> </DynamicScroller> ``` ### 完整示例 ```html <!DOCTYPE html> <html> <head> <title>Virtual Scroller without CLI</title> <link rel="stylesheet" href="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.css"> <style> #app { font-family: Arial; } .scroller { height: 500px; border: 1px solid #ddd; } .item { height: 50px; line-height: 50px; padding: 0 15px; border-bottom: 1px solid #eee; } .item:hover { background: #f9f9f9; } </style> </head> <body> <div id="app"> <RecycleScroller class="scroller" :items="items" :item-size="50" key-field="id" v-slot="{ item }" > <div class="item"> {{ item.id }}. {{ item.name }} </div> </RecycleScroller> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> <script src="https://unpkg.com/vue-virtual-scroller@1.0.10/dist/vue-virtual-scroller.umd.js"></script> <script> // 注册组件 Vue.component('RecycleScroller', VueVirtualScroller.RecycleScroller) new Vue({ el: '#app', data: { items: Array.from({length: 10000}, (_, i) => ({ id: i + 1, name: `测试项目 ${Math.random().toString(36).substr(2, 5)}` })) } }); </script> </body> </html> ``` ### ⚠ 注意事项 1. **必须设置容器高度**:`.scroller` 必须设置固定高度 2. **key-field 必填**:确保使用唯一键值字段[^3] 3. **item-size 匹配**:`:item-size` 应与 CSS 中的项目高度一致 4. **避免内联样式**:项目高度变化时使用 `DynamicScroller` 5. **缓冲区设置**:大数据量时增加 `:buffer` 值防止空白 > 此方法适用于传统 Vue 项目或通过 CDN 引入 Vue 的场景,无需构建工具即可实现万级数据的流畅滚动[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值