написать впереди
Перемещение кирпичей каждый день уже стал резюме инженера. Частое копирование и вставка, а затем удаление после копирования, скучно и скучно. В проекте мы обычно настраиваем сочетания клавиш в редакторе для генерации фрагментов кода. Кажется, что это не может удовлетворить желание резюме. Особенно важно настроить некоторые файлы шаблонов, связанных с бизнесом, в проекте, а затем динамически сгенерировать файлы. Не ограничивается редактором, лучше настраиваемая конфигурация, мощнее.
Первый взгляд на эффект
На самом деле существует множество способов создания фрагментов кода, например, фрагменты кода можно создавать, настроив сочетания клавиш в редакторе кода. Например, вы также можете установить плагины в vscode. Хотя редактор может быть реализован, он не может быть более индивидуальным.
В крупномасштабном проекте многие страницы относительно похожи, да и уровень кода в принципе схож.Обычно для создания нового компонента страницы нужно скопировать предыдущую страницу, скопировать файл конфигурации апи, скопировать файлы в магазине , а затем изменить соответствующие переменные, часто также будут пропуски.
Теперь мы можем извлечь общую часть этой части кода в файл шаблона, и узнать, нужно ли нам добавить какие-то фрагменты кода, спросив. Судя, а затем сгенерировать соответствующий файл. Таким образом, мы можем сформировать общий метод генерации кода, уникальный для проекта, и должным образом повысить эффективность работы.
Основные шаги:
- Извлеките общедоступный код в проекте, чтобы сформировать файл шаблона.
- Собрать через 'аск', настроить некоторую конфигурацию страницы
- создать соответствующий файл
использовать здесьplopИнструмент для некоторой конфигурации, давайте посмотрим!
Установить
Как правило, выберите установку в локальный проект, выполните следующую команду для установки:
// 全局安装
npm i -g plop
// 本地安装
npm i plop -D
Настройте команду скриптов:
// package.json
"scripts": {
// ...
"g": "plop --plopfile generators/index.js"
// ...
}
бегатьnpm run g
Соответствующая конфигурация может быть выполнена. вgenerators/index.js
Входной файл для выполнения команды.
Соответствующая конфигурация будет представлена позже.
основное использование
Для соответствующей конфигурации, пожалуйста, обратитесь к официальной документации.Я буду вводить в проект только свою собственную конфигурацию.Вы можете обратиться к ней.
Вот добавляю на основе одного из своих проектов, адрес проекта такойНажмите, чтобы просмотреть.
существуетgenerators/index.js
Я настроил четыре вида команд:
- компонент: генерировать общедоступные компоненты
- просмотры: создание страниц
- vuex: генерировать файл модулей в магазине
- API: создать файл конфигурации API
// 引入各模块配置文件
const componentGenerrator = require('./component/index.js')
const viewGenerrator = require('./view/index.js')
const storeGenerrator = require('./store/index.js')
const apiGenerrator = require('./api/index.js')
module.exports = plop => {
// component 相关
plop.setGenerator('component', componentGenerrator)
// views 相关
plop.setGenerator('views', viewGenerrator)
// vuex 相关
plop.setGenerator('vuex', storeGenerrator)
// api 相关
plop.setGenerator('api', apiGenerrator)
}
Сначала покажите структуру каталогов:
├ generators // 所在文件加
├─api // api 相关
├─component // component 相关
├─store // vue 相关
├─utils // 工具函数
├─view // view 相关
└─index.js // 入口文件
vuex-модуль
Сначала просмотрите эффект:
существуетvuex
модуль, в основном для созданияmodules
документ. Сгенерируйте файлы на основе файлов шаблонов и поместите их вstore/modules
под папку. Файл шаблона выглядит следующим образом:
// ./store/modules.hbs 模板文件
const state = {
}
const mutations = {
}
const actions = {
}
export default {
namespaced: true,
state,
mutations,
actions
}
Генерация этого шаблона по-прежнему очень проста, нам нужно только получить имя файла сгенерированного файла через «аск», который используется здесь.modules
Принимает имя папки, введенное пользователем в командной строке. затем вactions
В разделе Настройте путь к сгенерированному файлу. Соответствующая конфигурация подробно не описана, вы можете проверить соответствующие примечания.
Атрибуты | тип | значение |
---|---|---|
description | String | Краткое описание команды |
prompts | array | Спросите пользователя |
actions | Array/Function | эксплуатационное поведение, еслиFunction , входные параметры — это параметры, собранные после запроса, возвращаемыеactions настроить |
// ./store/index.js 配置文件
module.exports = {
description: 'vuex modules', // 这里是对该plop的功能描述
// 问题询问
prompts: [
{
type: 'input', // 问题类型 此处为输入
name: 'modules', // actions 和 hbs 模板文件中可使用该变量
message: '请输入模块名称', // 问题
default:'app' // 问题的默认答案
}
],
// 操作行为
actions: [
{
type: 'add', // 操作类型,这里是添加文件
path: '../src/store/modules/{{kebabCase modules}}.js', // 添加的文件的路径
templateFile: './store/modules.hbs' // 模板文件的路径
}
]
}
вkebabCase
Форматированные данные,modules
Преобразование в небольшой формат верблюжьего корпуса.
Следующие ключевые слова также часто используются для форматирования входных параметров пользователя:
- camelCase: changeFormatToThis маленький верблюжий случай
- правильныйCase/pascalCase: ChangeFormatToThis большой горб
Дополнительные ключевые слова см. в соответствующих документах.Нажмите, чтобы просмотреть
файл конфигурации апи
Сначала просмотрите эффект:
Конфигурация модуля API аналогична описанной выше операции, я вставлю соответствующую конфигурацию напрямую и представлю только различные части.
Подготовьте соответствующие файлы шаблонов следующим образом:
// ./api/api.hbs
import Request from '@/utils/request'
export const get{{properCase file}}List = data => Request.get('{{kebabCase dir}}/{{kebabCase file}}', data)
В проектеapi
файл конфигурации я положил/src/api
В каталоге имя папки — это имя модуля соответствующей страницы, а имя файла — имя конкретной страницы, поэтому его нужно получить, спросив.dir
параметрapi
Имя папки, которая будет создана в каталоге,file
Имя файла, соответствующего параметру.
// ./api/index.js
module.exports = {
description: 'api 配置文件',
// 询问
prompts: [
{
type: 'input',
name: 'dir',
message: '请输入文件夹名称'
},
{
type: 'input',
name: 'file',
message: '请输入文件名称'
}
],
// 操作行为
actions: [
{
type: 'add',
path: '../src/api/{{camelCase dir}}/{{camelCase file}}.js',
templateFile: './api/api.hbs'
}
]
}
просмотры страницы
Сначала просмотрите эффект:
Конфигурация немного сложнее предыдущей, но пошаговый анализ тоже понятен.
Ниже через заданный запрос, объясните медленно! ! !
-
Пожалуйста, входите
views
Имя папки!
В этом запросе добавлена проверка повторяющегося имени, при вводе повторяющегося имени будет запрашиваться и повторно вводиться имя папки. Сохранить пользовательский ввод вdir
в переменной. -
Пожалуйста, входите
views
название!
Он ничем не отличается от предыдущей настройки, в основном для получения имени вновь созданного файла. сохранить в переменнуюname
середина. -
Вам нужно отредактировать компонент всплывающего окна!
Сохранить результаты выбора пользователя вhasDialog
, так что вactions
в соответствии сhasDialog
Генерация динамического сужденияaction
. -
Вы хотите добавить файл конфигурации API?
Сохранить результаты выбора пользователя вhasApi
в , то вactions
судить в. Здесь вы можете напрямую выполнить настроенную команду для генерации. использовать здесьnode
серединаchild_process.exec
команда выполнения функцииnpm run g api ${dir} ${name}
Вот и все.
- добавить ли
vuex moudule
документ?
та же причинаhasVuex
значение, выполнитьnpm run g vuex ${name}
команда
Документация, связанная с child_process.exec
существуетactions
Атрибут может быть функцией, а параметр — входной переменной пользователя, которую нужно вернутьactions
массив конфигурации.
После вышеуказанного запроса мы также получилиhasDialog
, hasApi
, hasVuex
, name
, dir
связанные переменные. При этом также необходимо.hbs
Динамически отображать некоторые фрагменты кода в файле шаблона.
Файлов шаблонов слишком много, поэтому я не буду их здесь выкладывать, только ключевые части.
// ./view/components.hbs
import { pagination } from '@/mixins'
{{#if hasApi}}
import { get{{properCase name}}List } from '@/api/{{kebabCase dir}}/{{kebabCase name}}'
{{/if}}
{{#if hasDialog}}
import { {{properCase name}}Dialog } from './components'
{{/if}}
export default {
name: 'Role',
{{#if hasDialog}}
components: {
{{properCase name}}Dialog
},
{{/if}}
mixins: [pagination], // 封装分页相关函数
data () {
return {
{{#if hasApi}}
listApi: get{{properCase name}}List, // 列表请求地址
{{/if}}
searchForm: {}
}
},
mounted () {
{{#if hasApi}}
this.getListData()
{{/if}}
},
methods: {
handleCheck (row) {
{{#if hasDialog}}
this.$refs.{{properCase name}}Dialog.openDialog(row, 'check')
{{/if}}
}
}
}
Ниже приведены основные файлы конфигурации:
// ./view/index.js
const exec = require('child_process').exec
const componentExist = require('../utils/index')
module.exports = {
description: 'views 页面',
prompts: [
{
type: 'input',
name: 'dir',
default: 'container',
message: '请输入 views 所在文件夹名称!',
validate: value => {
if ((/.+/).test(value)) {
return componentExist(value) ? '组件名 或 views名已经存在' : true
}
return '请输入views 所在文件夹名称'
}
},
{
type: 'input',
name: 'name',
default: 'page',
message: '请输入 views 名称!'
},
{
type: 'confirm',
name: 'hasDialog',
default: true,
message: '是否需要 编辑弹窗 组件?'
},
{
type: 'confirm',
name: 'hasApi',
default: true,
message: '是否添加 api 配置文件?'
},
{
type: 'confirm',
name: 'hasVuex',
default: true,
message: '是否添加 vuex moudule 文件?'
}
],
actions: data => {
const { hasDialog, hasApi, hasVuex, name, dir } = data
const actions = []
actions.push({
type: 'add',
path: '../src/views/{{kebabCase name}}/{{properCase name}}.vue',
templateFile: './view/view.hbs'
})
if (hasDialog) {
actions.push({
type: 'add',
path: '../src/views/{{kebabCase name}}/components/{{properCase name}}Dialog.vue',
templateFile: './view/dialog.hbs'
})
actions.push({
type: 'add',
path: '../src/views/{{kebabCase name}}/components/index.js',
templateFile: './view/components.hbs'
})
}
if (hasApi) {
actions.push(data => {
const { name } = data
const cmd = `npm run g api ${dir} ${name}`
exec(cmd, (err, res, stderr) => {
if (err || stderr) return err || stderr
process.stdout.write(res)
})
return '已添加 api 配置文件'
})
}
if (hasVuex) {
actions.push(_ => {
const cmd = `npm run g vuex ${name}`
exec(cmd, (err, res, stderr) => {
if (err || stderr) {
return err || stderr
}
process.stdout.write(res)
})
return '已添加 vuex modules 配置文件'
})
}
return actions
}
}
Пожалуйста, обратитесь к полному примеруадрес проектаКстати, прошу для начала
Два последних слова
Выше приведена простая конфигурация, шаблоны можно настраивать в соответствии с характеристиками проекта для повышения эффективности работы.
Если у вас есть лучшие предложения, добро пожаловать, чтобы оставить комментарий, мы можем общаться и учиться вместе и добиваться прогресса вместе. Если вы найдете это полезным после прочтения, добро пожаловать, лайкайте, комментируйте и делитесь! ! ! Спасибо! ! !
Кроме того, я также открыл личный публичный аккаунт, пожалуйста, обратите внимание! ! !