Especificación técnica de desarrollo front-end

Convenciones de nombres
nomenclatura del proyecto
Se adopta el nombre minúsculasCamelCase , y los nombres en el código no se pueden subrayar, ni se pueden concluir con un guión bajo o un signo de dólar.
manojo;
nombres de directorios
Todos los nombres son lowerCamelCase en minúsculas . Cuando hay una estructura plural, use nomenclatura plural y las abreviaturas no usen plurales.
Nombre de archivo JS , CSS , HTML , PNG
Se adopta el nombre minúsculasCamelCase , y los nombres en el código no se pueden subrayar, ni se pueden concluir con un guión bajo o un signo de dólar.
manojo;
rigor de nombres
1. Está estrictamente prohibido usar pinyin e inglés en el nombre del código, y no está permitido usar chino directamente. Descripción: Inglés correcto
La ortografía y la gramática pueden facilitar la comprensión de los lectores y evitar la ambigüedad. Tenga en cuenta que incluso los métodos de nomenclatura pinyin puros deben evitarse;
// bien
sistema de gestión de centros comerciales
// malo
mall_management-system / centro-management-sistema
// bien
scripts/estilos/componentes/imágenes/utilidades/diseños/demoStyles/
scripts de demostración / img / doc
// malo
script/estilo/demo_scripts/demo-styles/imgs/docs
// bien
renderDom.js / signup.css / index.html / companyLogo.png
// malo
renderizar-dom.js / UserManagement.html
// bien
Los nombres de uso internacional como henan / luoyang / rmb pueden considerarse como los mismos que en inglés.
// malo
DaZhePromotion [ descuento ] / getPingfenByName() [ puntuación ] / int una determinada variable = 3 2. Ponga fin a las abreviaturas completamente no estándar y evite la ignorancia del significado.
Especificación HTML
Etiquetas HTML
Las etiquetas deben ser legales, cerradas y anidadas correctamente, y los nombres de las etiquetas deben estar en minúsculas ;
No hay ningún error en la sintaxis de la etiqueta y debe ser semántica;
El atributo personalizado de la etiqueta comienza con data - , como: <a href="#" data - num='18'> </a> ;
A menos que haya funciones específicas, requisitos de componentes, etc., está prohibido usar ids para definir estilos de elementos.
Enlace
Agregue el atributo de título a la etiqueta <a> ;
El atributo href de la etiqueta <a> debe escribirse con una dirección de enlace y, si no hay ninguna, agregar javascript:alert(' ¡Estad atentos! ') ;
Saltar entre páginas que no están en este tema, use el modo de abrir una nueva ventana: target="_blank" .
tipo HTML
Se recomienda usar la declaración de tipo de documento de HTML5 : ( Se recomienda HTML en formato de texto/html . Evite usar XHTML . XHTML
Y sus atributos, como application/xhtml+xml, tienen soporte de aplicaciones y espacio de optimización muy limitados en los navegadores).
sangría
Utilice 2 espacios (un tabulador ) para la sangría ;
Los nodos anidados deben estar sangrados.
Etiquetas semánticas
// malo
La " abreviatura " de AbstractClass se denomina AbsClass ;
La condición " abreviatura " se llama condi , y tales abreviaturas aleatorias reducen seriamente la legibilidad del código.
especificar la codificación de caracteres
Modo de compatibilidad de IE
especificar la codificación de caracteres
tipo de documento en mayúsculas
// bien
<!DOCTYPEhtml>
<html>
<cabeza>
<meta http-equiv = "X-UA-Compatible" content = "IE=Edge" />
< juego de caracteres meta = "UTF-8" />
<título> Título de la página </título>
</cabeza>
<cuerpo>
<img src = "images/company-logo.png" alt = "Empresa" />
</cuerpo>
</html> Hay muchas etiquetas semánticas nuevas en HTML5 , por lo que las etiquetas semánticas se usan primero para evitar una página con etiquetas div o p .
Cotizaciones ( html , plantilla vue )
Utilice comillas dobles (" ") en lugar de comillas simples ('') .
Especificación CSS
nombre
Los nombres de ID y clase siempre usan nombres que reflejan el propósito y el uso del elemento, u otros nombres genéricos, en lugar de apariencia y oscuridad.
El nombre.
Orden de escritura de atributos
Se recomienda la siguiente secuencia:
Propiedades de posicionamiento del diseño: visualización/posición/flotante/claro/visibilidad/desbordamiento
// bien
<encabezado></encabezado>
<pie de página></pie de página>
// malo
<div>
<p></p>
</div>
Los nombres de las clases usan letras minúsculas, separadas por guiones
id se nombra en caso de camello
Las variables, funciones, mixins y marcadores de posición en scss y menos se nombran en camel case
// malo
.fw-800 {
peso de fuente : 800 ;
}
.rojo {
color : rojo ;
}
// bueno
.pesado {
peso de fuente : 800 ;
}
.importante {
color : rojo ;
} Atributos propios: ancho/alto/margen/relleno/borde/fondo
Atributos de texto: color/fuente/decoración de texto/alineación de texto/alineación vertical/espacio en blanco/palabra de ruptura
Otras propiedades ( CSS3 ): content / cursor / border-radius / box-shadow / text-shadow /
fondo: gradiente lineal …
Selector
Evite el uso de nombres de etiquetas en los selectores css Desde la perspectiva del principio de separación de estructura, rendimiento y comportamiento, debe intentar evitar HTML en css
tags, y existen problemas potenciales con los nombres de las etiquetas que aparecen en los selectores css .
Muchos desarrolladores front-end no usan selectores secundarios directos cuando escriben cadenas de selectores (Nota: la diferencia entre los selectores secundarios directos y los selectores descendientes).
A veces, esto puede causar problemas de diseño dolorosos y, a veces, puede ser costoso. Sin embargo, en cualquier caso, es muy
Mala práctica. Si no está escribiendo selectores muy generales que deben coincidir con el final del DOM , siempre debe considerar los selectores secundarios inmediatos.
Utilice atributos abreviados tanto como sea posible
.acerca de {
pantalla : bloque ;
posición : relativa ;
flotante : izquierda ;
desbordamiento : automático ;
ancho : 100px ;
altura : 100px ;
margen : 0 10px ;
relleno : 20px 0 ;
fondo : rgba ( 0 , 0 , 0 , .5 );
borde : 1px rojo sólido ;
color : #333 ;
familia de fuentes : Arial , 'Helvetica Neue' , Helvetica , sans-serif ;
alineación de texto : centro ;
cursor : puntero ;
borde-radio : 10px ;
}
// bueno
.contenido > .título {
tamaño de fuente : 2rem ;
}
// malo
.contenido .título {
tamaño de fuente : 2rem ;
}
// bueno
borde superior : 0 ;
fuente : 100% / 1.6 palatino , georgia , serif ;
relleno : 0 1em 2em ;
// malo
border-top-style : none ; cada selector y atributo en su propia línea
omitir unidades después de 0
Evite el uso de selectores de ID y selectores de etiquetas globales para evitar contaminar los estilos globales
familia de fuentes : palatino , georgia , serif ;
tamaño de fuente : 100% ;
altura de línea : 1.6 ;
parte inferior acolchada : 2em ;
relleno-izquierda : 1em ;
relleno derecho : 1em ;
acolchado superior : 0 ;
// bueno
botón {
ancho : 100px ;
altura : 50px ;
color : #fff ;
fondo : #00a0e9 ;
}
// malo
botón {
ancho : 100px ; altura : 50px ; color : #fff ; fondo : #00a0e9 ;
}
// bueno
división {
relleno inferior : 0 ;
margen : 0 ;
}
// malo
división {
relleno inferior : 0px ;
margen : 0em ;
} Escritura de prefijo privado del navegador CSS3
Los prefijos privados del navegador CSS3 son lo primero, seguidos por los prefijos estándar.
Especificación de Javascript
nombre
1. Use minúsculas camel case para nombrar lowerCamelCase . El nombre en el código no se puede subrayar, ni se puede concluir con un guión bajo o un signo de dólar.
manojo;
2. El nombre del método método debe estar en forma de verbo o de verbo + sustantivo;
// bueno
.encabezado {
relleno inferior : 0px ;
margen : 0em ;
}
// malo
#encabezado {
relleno inferior : 0px ;
margen : 0em ;
}
.acerca de {
borde-radio : 10px ;
-webkit- borde-radio : 10px ;
-moz- borde-radio : 10px ;
-o- borde-radio : 10px ;
-ms- border-radius : 10px ;
}
// bien
valor local / getHttpMessage () / inputUserId
// malo
_name / name_ / name$ 2 ) Los nombres de métodos, nombres de parámetros, variables miembro y variables locales usan el estilo lowerCamelCase
formato, debe seguir la forma joroba.
// bien
saveShopCarData / openShopCarInfoDialog
// malo
guardar / abrir / mostrar / ir 3. Por la presente explique, agregue, elimine, verifique y modifique, las siguientes 5 palabras se usan de manera uniforme para los detalles, y otras palabras no están permitidas (el propósito es unificar cada extremo) ;
`añadir/actualizar/eliminar/detallar/obtener`
Adjunto: Verbos comúnmente usados ​​en métodos de función :
/**
obtener obtener /establecer configuración
agregar aumentar /eliminar eliminar
crear crear /destory eliminar
empezar empezar /parar parar
abrir abrir /cerrar cerrar
leer leer /escribir escribir
cargar cargar /guardar guardar
crear crear / destruir destruir
comienzo comienza / final termina
copia de seguridad copia de seguridad /restauración recuperación
importar importar /exportar exportar
dividir / fusionar _
inyectar inyección /extraer extracción
adjuntar / separar _
unión unión / separación separada
ver ver / navegar navegar
editar / modificar _
seleccionar seleccionar / marcar marcar
copiar copiar /pegar pegar
deshacer deshacer /rehacer rehacer
insertar insertar /eliminar eliminar
agregar unirse / agregar agregar
limpiar limpiar /limpiar limpiar
índice índice / ordenar
encontrar encontrar /buscar buscar ,
aumentar aumentar /disminuir disminuir
reproducir reproducir /pausar pausa
iniciar iniciar /ejecutar ejecutar
compilar compilar /ejecutar ejecución
depuración depuración / seguimiento de seguimiento
observar observar /escuchar monitorear
compilar compilar /publicar versión
entrada entrada / salida salida
codificar codificar / decodificar decodificar
cifrar cifrado /descifrar descifrar
comprimir compresión /descomprimir descompresión
empaquetar empaquetar /desempacar desempacar ,
Análisis de análisis / generación de emisiones
conectar conexión /desconectar desconexión ,
enviar enviar /recibir recibir
descargardescargar / cargarcargar _
actualizar actualizar /sincronizar sincronización
actualizar actualizar /revertir recuperación
bloquear bloquear / desbloquear desbloquear
salida salida /entrada entrada
enviar enviar / confirmar entrega
empujar empujar / tirar tirar
expandirExpandir / contraerContraer _
empezar empezar / terminar terminar
Inicio /finalización 4. Los nombres de las constantes están todos en mayúscula, y las palabras están separadas por guiones bajos, y la expresión semántica debe ser completa y clara, y el nombre no debe ser demasiado largo .
formato de código
1. Utilice 2 espacios para la sangría ;
2. Inserte una línea en blanco entre códigos con lógica diferente, semántica diferente y negocios diferentes para separarlos y mejorar la legibilidad.
Nota: En cualquier caso, no es necesario insertar varias líneas en blanco para la separación.
cadena
Utilice uniformemente comillas simples ('') en lugar de comillas dobles ("") . Esto es muy útil al crear cadenas HTML :
declaración de objeto
1. Usar valores literales para crear objetos ;
entrar para entrar /salir para salir
abortar rendirse / dejar de fumar
obsoleto obsoleto / depreciado obsoleto
recopilar colección / colección agregada
**/
// bien
constante MAX_STOCK_COUNT
// malo
constante MAX_COUNT
// bien
si ( x < y ) {
x += 10 ;
} más {
x += 1 ;
}
// bien
let str = 'foo' ;
let pruebaDiv = '<div id="prueba"></div>' ;
// malo
let str = 'foo' ;
let testDiv = "<div id='test'></div>" 2. Use literales en lugar de constructores de objetos.
soportes
Se requieren llaves después de las siguientes palabras clave (incluso si el contenido del bloque de código es solo una línea):
Juicio condicional y bucle de hasta tres capas
Si el juicio condicional se puede resolver usando operadores ternarios y operadores lógicos, no use el juicio condicional, pero recuerde no escribir una operación ternaria demasiado larga.
operador. Si supera las 3 capas, extráigalo en una función y escriba un comentario claro.
El nombre de conversión de este
Las referencias al contexto esto solo se pueden nombrar usando 'eso'
alcance del bloque
1. vamos a reemplazar var ;
// bien
dejar usuario = {};
// malo
dejar usuario = nuevo objeto ();
// bien
var usuario = {
edad : 0 ,
nombre : 1 ,
ciudad : 3
};
// malo
var usuario = nuevo Objeto ();
usuario _ edad = 0 ;
usuario _ nombre = 0 ;
usuario _ ciudad = 0 ;
if , else , for , while , do , switch , try , catch , finalmente , with
// bien
si ( condición ) {
hacer algo ();
}
// Cuando hay una sola línea de contenido después de if
condición && hacerAlgo ()
// malo
if ( condition ) doSomething (); ES6 propone dos nuevos comandos para declarar variables: let y const . Entre ellos, let puede reemplazar completamente var , porque los dos tienen la misma semántica,
Y no tiene efectos secundarios.
Por lo tanto, se recomienda no usar el comando var , sino usar el comando let en su lugar.
2. Constantes globales y seguridad de subprocesos.
Entre let y const , se recomienda usar const primero , especialmente en el entorno global No se deben establecer variables, solo se deben establecer constantes.
Se prefiere const a let por varias razones. Una es que const puede recordar a las personas que leen el programa que esta variable no debe cambiar; la otra es
const está más en línea con la idea de programación funcional.La operación no cambia el valor, sino que solo crea un nuevo valor, y esto también es propicio para futuras operaciones distribuidas;
La última razón es que el compilador de JavaScript optimizará const , por lo que usar más const ayudará a mejorar la eficiencia de ejecución del programa.
Rate, es decir , la diferencia esencial entre let y const es en realidad la diferencia en el procesamiento interno del compilador.
Hay otras dos ventajas de declarar constantes const . Una es que las personas que leen el código se darán cuenta de inmediato de que este valor no debe modificarse, y la otra es evitar cambios inadvertidos.
Errores causados ​​por la modificación de los valores de las variables.
Todas las funciones deben establecerse como constantes.
cadena
Las cadenas estáticas siempre usan comillas simples o acentos graves, no comillas dobles. Las cadenas dinámicas usan acentos graves.
asignación de desestructuración
1. Cuando se utilizan miembros de matriz para asignar valores a variables, se prefiere la asignación de desestructuración;
2. Si el parámetro de la función es un miembro del objeto, se prefiere la asignación de desestructuración;
// malo
const a = "foobar" ;
const b = 'foo' + a + 'bar' ;
// aceptable
const c = `foobar` ;
// bien
const a = 'foobar' ;
const b = `foo${ a }bar` ;
constante arr = [ 1 , 2 , 3 , 4 ];
// malo
const primero = arr [ 0 ];
const segundo = arr [ 1 ];
// bien
const [ primero , segundo ] = arr ;
// malo
función getFullName ( usuario ) {
const nombre = usuario . primerNombre ;
const apellido = usuario .apellido 3. Si la función devuelve varios valores, se prefiere la asignación de desestructuración del objeto a la asignación de desestructuración de la matriz . Esto facilita volver a agregar más tarde
valor, y cambiar el orden en que se devuelven los valores.
objeto
1. Para los objetos definidos en una sola línea, el último miembro no termina con una coma. Objetos definidos en varias líneas, el último miembro termina con una coma;
}
// bien
función getFullName ( obj ) {
constante {
primer nombre ,
apellido
} = objeto ;
}
// mejor
función getFullName ({
primer nombre ,
apellido
}) {}
// malo
función procesarEntrada ( entrada ) {
volver [ izquierda , derecha , arriba , abajo ];
}
// bien
función procesarEntrada ( entrada ) {
volver {
izquierda ,
cierto ,
arriba ,
abajo
};
}
constante {
izquierda ,
bien
} = procesarEntrada ( entrada );
// malo
constante a = { k1 : v1 , k2 : v2 , };
constante b = {
k1 : v1 ,
k2 : v2
};
// bien
constante a = { k1 : v1 , k2 : v2 }; constante b = {
k1 : v1 ,
k2 : v2 ,
};
2. El objeto debe ser lo más estático posible, una vez definido no se pueden añadir nuevos atributos a voluntad. Si agregar atributos es inevitable, use
método Object.assign ;
// malo
constante a = {};
un . x = 3 ;
// si la remodelación es inevitable
constante a = {};
objeto _ asignar ( a , { x : 3 });
// bien
constante a = { x : nulo };
un . x = 3 ;
3. Si el nombre de atributo del objeto es dinámico, puede utilizar la definición de expresión de atributo al crear el objeto;
// malo
constante obj = {
identificación : 5 ,
nombre : 'San Francisco' ,
};
obj [ getKey ( 'habilitado' )] = verdadero ;
// bien
constante obj = {
identificación : 5 ,
nombre : 'San Francisco' ,
[ getKey ( 'habilitado' )]: verdadero ,
};
4. Además, las propiedades y métodos del objeto deben expresarse de la manera más concisa posible, para que sea fácil de describir y escribir.
var ref = 'algún valor' ;
// malo
átomo constante = {
ref .: ref .,
valor : 1 ,
addValue : función ( valor ) {
átomo de retorno . valor + valor ;
},
};
// bien
const átomo = { matriz
1. Utilice el operador de propagación ( ... ) para copiar la matriz;
2. Use el método Array.from para convertir un objeto similar a una matriz en una matriz.
función
1. Las funciones de ejecución inmediata se pueden escribir en forma de funciones de flecha;
2. Para aquellas ocasiones en las que se utilizan funciones anónimas como parámetros, intente utilizar funciones de flecha en su lugar. Porque esto es más conciso y une esto ;
ref .,
valor : 1 ,
agregarValor ( valor ) {
átomo de retorno . valor + valor ;
},
};
// malo
const len ​​= artículos . longitud ;
const itemsCopy = [];
déjame ; _
para ( i = 0 ; i < len ; i ++ ) {
itemsCopy [ i ] = items [ i ];
}
// bien
const elementosCopiar = [ ... elementos ];
const foo = documento . querySelectorAll ( '.foo' );
const nodos = Array . de ( foo );
//La diferencia entre Array.from y el operador de propagación
El método Array.from también admite objetos tipo matriz . Los llamados objetos similares a arreglos tienen solo una característica esencial, es decir, deben tener una propiedad de longitud .
Por lo tanto , cualquier objeto con un atributo de longitud se puede convertir en una matriz a través del método Array.from y el operador de extensión no se puede convertir en este momento.
matriz _ desde ({ longitud : 3 });
// [ indefinido, indefinido, indefinido ]
En el código anterior, Array.from devuelve una matriz con tres miembros, y el valor de cada posición es indefinido . conversión de operador de propagación
No se puede obtener este objeto.
(() => {
consola _ log ( 'Bienvenido a Internet.' );
})(); // malo
[ 1 , 2 , 3 ]. mapa ( función ( x ) {
devuelve x * x ;
});
// bien
[ 1 , 2 , 3 ]. mapa (( x ) => {
devuelve x * x ;
});
// mejor
[ 1 , 2 , 3 ]. mapa ( x => x * x );
3. La función de flecha reemplaza a Function.prototype.bind , y self/_this/that no debe usarse para enlazar this ;
// malo
const self = esto ;
constboundMethod = función ( ... parámetros ) {
método de devolución . aplicar ( auto , params );
}
// aceptable
constboundMethod = método . _ atar ( esto );
// mejor
constboundMethod = ( ... params ) = > método . aplicar ( esto , parámetros );
4. Las funciones de flecha se recomiendan para funciones simples, de una línea y no reutilizables. Si el cuerpo de la función es más complicado y el número de líneas es mayor, aún debe
Use el método tradicional de escritura de funciones;
5. Todos los elementos de configuración deben concentrarse en un objeto y colocarse en el último parámetro.Los valores booleanos no se pueden usar directamente como parámetros;
// malo
función dividir ( a , b , opción = falso ) {}
// bien
función dividir ( a , b , {
opciones = falso
} = {}) {}
6. No use la variable arguments en el cuerpo de la función , use el operador resto ( ... ) en su lugar. porque el operador resto dice explícitamente que quieres
Para obtener parámetros y argumentos es un objeto similar a una matriz, y el resto del operador puede proporcionar una matriz real: 7. Use la sintaxis de valor predeterminado para establecer el valor predeterminado del parámetro de función.
Deconstrucción de mapas
Preste atención a la distinción entre Object y Map , y solo use Object cuando simule objetos de entidad del mundo real . Si solo necesita la clave: valor
La estructura de datos utiliza la estructura Map . Porque Map tiene un mecanismo transversal incorporado.
módulo
La sintaxis del módulo ES6 es la forma estándar de escribir módulos de JavaScript , insista en usar esta forma de escritura y reemplace el lenguaje CommonJS de Node.js
Ley.
1. Use import en lugar de require() ;
// malo
función concatenarTodos () {
const argumentos = Array . prototipo _ rebanada _ llamada ( argumentos );
devolver argumentos . unir ( '' );
}
// bien
función concatenarTodos ( ... argumentos ) {
devolver argumentos . unir ( '' );
}
// malo
función manejarCosas ( opciones ) {
opta = opta || {};
}
// bien
función manejarCosas ( opciones = {}) {
// ...
}
let mapa = nuevo Mapa ( arr );
for ( let key of map . keys ()) {
consola _ registro ( clave );
}
for ( let valor del mapa . valores ()) {
consola _ registro ( valor );
}
for ( let elemento del mapa . entradas ()) {
consola _ registro ( elemento [ 0 ], elemento [ 1 ]);
} // Manera de escribir CommonJS
const móduloA = require ( 'móduloA' );
const func1 = móduloA . func1 ;
const func2 = móduloA . func2 ;
// ES6 forma de escribir
importar { func1 , func2 } desde 'moduleA' ;
2. Use export para reemplazar module.exports ;
// Cómo escribir commonJS
var Reaccionar = requerir ( 'reaccionar' );
var Migas de pan = Reaccionar . crear clase ({
renderizar () {
volver < navegación / > ;
}
});
módulo _ exportaciones = Pan rallado ;
// ES6 forma de escribir
importar Reaccionar desde 'reaccionar' ;
La clase Breadcrumbs extiende React . componente {
renderizar () {
volver < navegación / > ;
}
};
exportar migas de pan predeterminadas ;
Si el módulo tiene solo un valor de salida, use export default , si el módulo tiene múltiples valores de salida, a menos que uno de los valores de salida sea especial
Importante, de lo contrario se recomienda no utilizar export default , es decir, si varios valores de salida están en una relación igual, export default y ordinario
No utilice exportar al mismo tiempo.
3. Si el módulo genera una función de forma predeterminada, la primera letra del nombre de la función debe estar en minúsculas, lo que indica que se trata de un método de herramienta;
función hacerStyleGuide () {}
exportar por defecto makeStyleGuide ;
4. Si el módulo genera un objeto de forma predeterminada, la primera letra del nombre del objeto debe estar en mayúscula, lo que indica que se trata de un objeto de valor de configuración.
const StyleGuide = {
es6 : {}
};
exportar StyleGuide predeterminado ; Especificación de escritura Vue
Orden de introducción de componentes
Al importar componentes, deben introducirse en el orden de global a local, de vue a js
Los nombres de los componentes son varias palabras
Los nombres de los componentes siempre deben constar de varias palabras, excepto el componente raíz App y cosas como <transition> , <component>
Componentes incorporados de Vue .
Al hacerlo, se evitan conflictos con elementos HTML existentes y futuros , ya que todos los nombres de elementos HTML son de una sola palabra.
archivo de componentes
Siempre que haya un sistema de compilación capaz de unir archivos, separe cada componente en archivos.
Cuando necesite editar un componente o buscar el uso de un componente, este enfoque puede ayudarlo a encontrarlo más rápidamente.
<script>
importar { mapGetters } de 'vuex' ;
importar eventBus desde '../event/eventBus.js'
import TodoLtem from '@/component/todoList.vue' // Este componente es una lista de tareas // Introducir el archivo vue
, debe llevar el sufijo .vue
importar {
getUserInfo , // Obtener información básica del usuario
getUserLoginInfo // Obtener detalles de usuario de inicio de sesión
} de '@/api/common/userInfo.js'
</script>
// bien
aplicación _ componente ( 'elemento pendiente' , {
// ...
})
exportación predeterminada {
nombre : 'TodoItem' ,
// ...
}
// malo
aplicación _ componente ( 'todo' , {
// ...
})
exportación predeterminada {
nombre : 'TodoItem' ,
// ...
} Caso de archivo componente de un solo archivo
El nombre de archivo de un componente de un solo archivo debe usar el método de nomenclatura lowerCamelCase , y la nomenclatura en el código no puede estar subrayada ni discontinua
conectar
El nombre de un componente de un solo archivo debe usar UpperCamelCase , que debe nombrarse cuando se registra el componente.
Cuando se usa en la plantilla, también se nombra con una gran joroba
// bien
componentes /
|- TodoLista . vista
| -TodoItem.vue_ _ _
// malo
aplicación _ componente ( 'TodoLista' , {
// ...
})
aplicación _ componente ( 'TodoItem' , {
// ...
})
// bien
componentes /
|- miComponente . visto
// malo
componentes /
|- mi - componente . vista
//bien
exportación predeterminada {
nombre : 'MiComponente'
}
<plantilla>
<MiComponente> </MiComponente>
</plantilla>
<script>
importar MyComponent desde './myComponent.vue'
exportación predeterminada {
componente :{
micomponente
}
}
</script> Nombre del componente básico
Los componentes básicos que aplican estilos y convenciones específicos ( es decir, componentes de presentación, sin lógica o sin estado ) deben comenzar todos con un prefijo específico.
prefijo, como Base , App o V.
Nombres de componentes estrechamente acoplados
Los componentes secundarios que están estrechamente relacionados con el componente principal deben nombrarse con el nombre del componente principal como prefijo.
Si hay muchos elementos característicos, deberían envolverse activamente
// bien
componentes /
|- Botón Base . vista
|- Tabla base . vista
|- BaseIcon . vue
componentes /
| -Botón de la aplicación . visto
| -AppTable . visto
| -Icono de aplicación . vista
componentes /
|- Botón V. vista
| -VTable . visto
| - FILA ver
// malo
componentes /
|- MiBoton . vista
|- Vista de tabla . visto
|- Icono . vista
// bien
componentes /
|- lista de tareas . vista
|- todos los elementos de la lista . vista
|- botóntodoListItem . vista
// malo
componentes /
|- TodoLista . vista
| -TodoItem.vue_ _ _
| - TodoButton.vue_ _
// bien
<MiComponente
fo = "un"
barra = "b"
baz = "c"
foo = "a" Definición de propiedad
La definición de prop debe ser lo más detallada posible
En el código enviado, la definición de prop debe ser lo más detallada posible, al menos especificando su tipo.
Las definiciones cuidadosas de accesorios tienen dos ventajas:
Describen la API del componente , por lo que el diseño y el uso del componente pueden entenderse fácilmente;
En un entorno de desarrollo, Vue le advertirá si se proporciona un apoyo malformado a un componente para ayudarlo a capturar el potencial.
fuente de error
Establezca el valor clave para v - para
Utilice siempre la clave con v - para .
barra = "b"
baz = "c"
fo = "un"
barra = "b"
baz = "c"
/>
// malo
<MiComponente foo = "a" bar = "b" baz = "c" foo = "a" bar = " b " baz = "c" foo = "a" bar = "b"
baz = "c" foo = "a" bar = "b" baz = "c" />
// bien
accesorios : {
estado : Cadena
}
// mejor ejemplo
accesorios : {
estado : {
tipo : Cadena ,
requerido : cierto ,
validador : valor => {
volver [
'sincronizando' ,
'sincronizado' ,
'conflicto de versión' ,
'error'
]. incluye ( valor )
}
}
}
// malo
// Esto solo es aceptable para la creación de prototipos
props : [ 'status' ] siempre se debe teclear con v - for en el componente para mantener el estado del componente interno y su subárbol. Incluso para elementos, manteniendo predecible
El comportamiento de las pruebas también es una buena práctica. Está prohibido utilizar el índice del ciclo como clave del componente.
Evite usar v - if y v - for juntas (vue2.x)
Nunca utilice tanto v - if como v - for en el mismo elemento .
Generalmente tendemos a hacer esto en dos situaciones comunes:
Para filtrar elementos en la lista ( por ejemplo, v - for="user in users" v - if="user.isActive" ) . en este tipo de
En este caso, reemplace los usuarios con una propiedad calculada ( como activeUsers ) y devuelva la lista filtrada.
Para evitar mostrar listas que deberían estar ocultas ( como v - for="user in users" v - if="shouldShowUsers" ) .
En este caso, mueva v - if al elemento contenedor ( como ul , ol ) .
// bien
< ul >
< li
v - for = "todo en todos"
: clave = "todo.id"
>
{ { todo . text }}
< /li>
</ul> _
// malo
< ul >
< li v - for = "todo en todos" >
{ { todo . text }}
< /li>
</ul> _
< ul >
< li v - for = "(todo,idx) en todos" : tecla = "idx" >
{ { todo . text }}
< /li>
</ul> _
// bien
<ul>
<template v-for = "usuario en usuarios" :key = "user.id" >
<li v-if = "usuario.isActive" >
{ { nombre.usuario }}
</li>
</template>
</ul>
// bad
<ul>
<li
v-for = "user in users"
v-if = "user.isActive"
:key = "user.id"
>
{ { user.name }} 为组件样式设置作用域
对于应用来说,样式在顶层 App 组件和布局组件中可以是全局的,但是在其它所有组件中都应该是有
作用域的。
这条规则只适用于 单文件组件 。你 不一定 要使用 scoped attribute 。作用域也可以通过 CSS Modules
( 一个基于 class 的,类似 BEM 的策略 ) 或者其它的库 / 约定来实现。
不管怎样,对于组件库来说,我们应该更倾向于选用基于 class 的策略,而不是 scoped attribute
Esto facilita la anulación de estilos internos: use nombres de clases comprensibles para los humanos , no tenga una prioridad de selector alta y no
provocará un conflicto.
Expresiones simples utilizadas en plantillas
Las plantillas de componentes solo deben contener expresiones simples y las expresiones complejas deben refactorizarse en propiedades o métodos calculados.
</li>
</ul>
// bien
<plantilla>
< clase de botón = "botón botón-cerrar" > × </botón>
</plantilla>
<!-- usar el atributo `ámbito` -->
< ámbito de estilo >
.botón {
borde : ninguno ;
borde-radio : 2px ;
}
.boton-cerrar {
color de fondo : rojo ;
}
</estilo>
// malo
<plantilla>
< clase de botón = "btn btn-cerrar" > × </botón>
</plantilla>
<estilo>
.btn-cerrar {
color de fondo : rojo ;
}
</estilo>
// bien
<plantilla>
<p> { { normalizedFullName }} </p> Abreviatura de comando
Las abreviaturas de las directivas ( con : para v - bind: , @ para v - on: y # para v - slot ) deben usarse siempre o nunca
usar.
</plantilla>
// la expresión compleja se ha movido a una propiedad calculada
calculado: {
nombre completo normalizado: función () {
devuelve this.fullName.split(' ').map(función (palabra) {
devolver palabra[0].toUpperCase() + palabra.slice(1)
}).unirse(' ')
}
}
// malo
<plantilla>
<p>
{ { fullName.split(' ').map(función (palabra) { return palabra[0].toUpperCase() +
palabra.slice(1) }).join(' ') }}
</p>
</plantilla>
// bien
<entrada
:valor = "nuevoTodoTexto"
:placeholder = "nuevoTodoInstrucciones"
>
<entrada
v-bind:valor = "nuevoTodoTexto"
v-bind:placeholder = "nuevoTodoInstructions"
>
<entrada
@input = "enEntrada"
@focus = "enfocar"
>
<entrada
v-on:entrada = "enEntrada"
v-on:focus = "onFocus"
>
<plantilla ranura en V: encabezado >
<h1> Aquí podría haber un título de página </h1>
</plantilla>
<plantilla ranura en V: pie de página >
<p> Aquí hay información de contacto </p>
El orden de las etiquetas </template> es consistente
Los componentes de un solo archivo siempre deben mantener el orden de las etiquetas como
Opciones v-show y v-if
Si en tiempo de ejecución, necesita cambiar con mucha frecuencia, use v-show ; si en tiempo de ejecución, la condición rara vez cambia, use v-if .
Opciones de orden de componente / instancia
Las opciones para componentes / instancias deben tener un orden uniforme.
<plantilla #encabezado >
<h1> Aquí podría haber un título de página </h1>
</plantilla>
<plantilla #pie de página >
<p> Aquí hay información de contacto </p>
</plantilla>
// malo
<entrada
v-bind:valor = "nuevoTodoTexto"
:placeholder = "nuevoTodoInstrucciones"
>
<entrada
v-on:entrada = "enEntrada"
@focus = "enfocar"
>
<plantilla ranura en V: encabezado >
<h1> Aquí podría haber un título de página </h1>
</plantilla>
<plantilla #pie de página >
<p> Aquí hay información de contacto </p>
</plantilla>
// bien
<plantilla> ... </plantilla>
<guión> ... </guión>
<estilo> ... </estilo>
// malo
<plantilla> ... </plantilla>
<estilo> ... </estilo>
<script> ... </script> Este es el orden predeterminado que recomendamos para las opciones de componentes. Se dividen en varias categorías, por lo que puede saber que la nueva propiedad debe colocarse en
dónde.
1. Percepción global ( se requiere que se perciba fuera del componente )
nombre
2. Opciones de compilación de plantillas ( cambiar la forma en que se compilan las plantillas )
opciones del compilador
3. Dependencia de la plantilla ( recursos utilizados en la plantilla )
componentes
directivas
4. Combinación ( combinar propiedad en opciones )
extiende
mezclando
proporcionar / inyectar
5. Interfaz ( interfaz del componente )
heredarAttrs
accesorios
emite
exponer
6. API de composición ( punto de entrada para usar la API de composición )
configuración
7. Estado local ( propiedad sensible local )
datos
calculado
8. Eventos ( devoluciones de llamadas activadas por eventos de respuesta )
mirar
Eventos del ciclo de vida ( en el orden en que se invocan )
antes de crear
creado
antes del monte
montado
antes de Actualizar
actualizado
activado
desactivado
antes de desmontar
desmontado
error capturado
renderRastreado
render Triggered
9. Propiedades no receptivas ( propiedades de instancia que no dependen de sistemas receptivos )
métodos
10. Representación ( descripción declarativa de la salida del componente )
El orden de los atributos de la plantilla / elemento de representación
Los atributos de los elementos ( incluidos los componentes ) deben tener un orden uniforme.
Este es el orden predeterminado que recomendamos para las opciones de componentes. Se dividen en varias categorías, por lo que puede conocer el atributo personalizado recién agregado
y dónde debe colocarse la directiva.
1. Definición ( proporcionar opciones para los componentes )
es
2. Representación de listas ( creando múltiples variantes del mismo elemento )
v - para
3. Condición ( si el elemento se representa / muestra )
v - si
v - si no - si
v - más
v - mostrar
v - capa
4. Modificadores de renderizado ( cambiando cómo se renderizan los elementos )
en - para
v - una vez
5. Percepción global ( se requiere que se perciba fuera del componente )
identificación
6. Atributo de unicidad ( atributo que requiere un valor único )
árbitro
llave
7. Enlace bidireccional ( combina enlaces y eventos )
v - modelo
8. Otros atributos ( todos los atributos normales, vinculados o no vinculados)
9. Evento ( escucha de eventos componente )
v - en
10. Contenido ( anular el contenido del elemento )
v - html
v - texto
Selectores de elementos en ámbito
Los selectores de elementos deben evitar scoped .
En los estilos con ámbito , los selectores de clase son preferibles a los selectores de elementos porque el uso intensivo de los selectores de elementos es lento.
// bien
<plantilla>
< clase de botón = "btn btn-cerrar" > × </botón>
</plantilla>
< ámbito de estilo >
.btn-cerrar {
color de fondo : rojo ; especificación del enrutador Vue
Transferencia de datos de salto de página utilizando parámetros de enrutamiento
Utilice el mecanismo de carga diferida de ruta (lazy loading)
Convención de nomenclatura en el enrutador
La convención de nomenclatura de path y childrenPoints adopta la convención de nomenclatura de pequeña joroba (trate de mantener la estructura de directorios del archivo vue consistente, porque el destino
El directorio y los nombres de los archivos están todos en humpcase, lo que facilita encontrar el archivo correspondiente)
**La convención de nomenclatura de nombres adopta la convención de nomenclatura de la gran joroba y es coherente con el nombre del componente del componente . (Porque mantener vivo
característica, keep-alive se almacena en caché de acuerdo con el nombre del componente , por lo que los dos deben ser altamente consistentes)
}
</estilo>
// malo
<plantilla>
<botón> × </botón>
</plantilla>
< ámbito de estilo >
botón {
color de fondo : rojo ;
}
</estilo>
// bien
sea ​​id = '123' ;
esto _ $enrutador . empujar ({
nombre : 'Centro de usuario' ,
consulta : {
identificación : identificación
}
});
// bien
{
ruta : '/uploadAttachment' ,
nombre : 'Subir archivo adjunto' ,
meta : {
título : ' Subir archivo adjunto '
},
componente : () => importar ( '@/view/components/uploadAttachment/index.vue' )
},
// Carga dinámicamente la especificación del directorio del proyecto Vue
Base
Todos los nombres en el proyecto vue deben ser consistentes con los nombres del backend. Por ejemplo, permisos: privilegio de back-end, front-end independientemente del enrutador, tienda,
¡ API y demás deben usar palabras privilegiadas !
Descripción del catálogo
exportar const recargar = [{
ruta : '/recargar' ,
nombre : 'Recargar' ,
componente : Principal ,
meta : {
título : ' Carga Dinámica ' ,
icono : 'icono iconfont'
},
niños : [{
ruta : '/recargar/smartReloadList' ,
nombre : 'SmartReloadList' ,
componente : () =>
importar ( '@/views/reload/smartReload/smartReloadList.vue' )
}]
}
];
directorio fuente src
|-- api todas las interfaces api
|-- activos recursos estáticos, imágenes, iconos, estilos , etc.
|-- componentes componentes comunes
|-- config información de configuración
|-- constantes información constante, proyecto todo Enum, constantes globales, etc.
|-- datos datos de simulación, almacenamiento temporal
|-- interfaz simulada, almacenamiento temporal
|-- enrutamiento de enrutador, administración unificada
|-- store vuex, gestión unificada
|-- temas tema de estilo personalizado
|-- vistas ver directorio
| |-- rol rol nombre del módulo
| |-- |-- página de lista de roles roleList.vue
| |-- |-- roleAdd.vue rol nueva página
| |-- |-- página de actualización de roles roleUpdate.vue
| |-- |-- estilo de módulo de función index.less
|-- |-- carpeta de componente común del módulo de funciones de componentes
| |-- directorio api del módulo empleado empleado
directorio de activos
directorio de componentes
Los nombres de archivos y variables deben ser consistentes con el backend.
Este directorio corresponde a la interfaz API de back-end , de acuerdo con el controlador de back-end y un archivo api js . Si el proyecto es grande, puede presionar
Divida los subdirectorios según el negocio y mantenga la coherencia con el backend.
El nombre del método en la API debe ser lo más coherente posible desde el punto de vista semántico con la URL de la API de backend.
Agregue anotaciones a cada método en la API , y las anotaciones son consistentes con la documentación de swagger de back-end.
extremo posterior:
URL : EmployeeController.java
/empleado/añadir
/empleado/eliminar/{id}
/empleado/actualizar
Interfaz:
empleado.js
// agregar empleado
agregarEmpleado: (datos) => {
volver postAxios('/empleado/agregar', datos)
},
// Actualizar la información del empleado
actualizarEmpleado: (datos) => {
volver postAxios('/empleado/actualizar', datos)
},
// eliminar empleado
eliminarEmpleado: (IdEmpleado) => {
volver postAxios('/empleado/eliminar/' + id de empleado)
},
Los activos son recursos estáticos, que almacenan imágenes, estilos, íconos y otros recursos estáticos. El formato de nomenclatura de los recursos estáticos es
kebabCaso
|activos
|-- iconos
|-- imágenes
| |-- colordefondo.png
| |-- uploadHeader.png
|-- directorio de constantes de estilos
Este directorio debe dividirse en directorios de acuerdo con los componentes. El directorio se llama kebabCase y la regla de nomenclatura de los componentes también es kebabCase .
|componentes
|-- registro de errores
| |-- index.view
| |-- sin índice
|-- editor de rebajas
| |-- index.view
| |-- index.js
|-- kebabCase
Este directorio almacena todas las constantes del proyecto. Si las constantes se usan en vue , use el complemento vue - enum
( https://www.npmjs.com/package/vue-enum ) _
Estructura de directorios:
| constantes
|-- índice . js
|-- rol . js
|-- empleado . js
Ejemplo : empleado.js _
exportar const EMPLOYEE_STATUS = {
NORMALES : {
valor : 1 ,
descripción : ' normal '
},
DESHABILITADO : {
valor : 1 ,
desc : ' deshabilitado '
},
ELIMINADO : {
valor : 2 ,
desc : ' Eliminado '
}
};
exportación const EMPLOYEE_ACCOUNT_TYPE = {
Q Q : {
valor : 1 ,
desc : ' Inicio de sesión QQ '
},
WECHAT : {
valor : 2 ,
desc : ' Inicio de sesión de WeChat '
},
DING DING : {
valor : 3 ,
desc : ' Inicio de sesión de DingTalk '
}, directorios de enrutadores y tiendas
directorio de vistas
notas
requisitos de anotación
NOMBRE DE USUARIO : {
valor : 4 ,
desc : ' nombre de usuario contraseña inicio de sesión '
}
};
exportación predeterminada {
EMPLEADO_ESTADO ,
EMPLOYEE_ACCOUNT_TYPE
};
Estos dos directorios deben dividir el negocio y no se pueden colocar en un archivo js .
El enrutador intenta ser coherente con la estructura de las vistas .
store recomienda dividir diferentes archivos js según el negocio. Cuando el negocio es complejo, debe dividirse en diferentes módulos
El nombre debe ser coherente con el backend, el enrutador , la API , etc.
Los componentes en componentes deben usar reglas pascal-case
|-- vistas ver directorio
| |-- rol rol nombre del módulo
| | |-- página de lista de roles roleList.vue
| | |-- roleAdd.vue rol nueva página
| | |-- página de actualización de roles roleUpdate.vue
| | |-- estilo de módulo de función index.less
| | |-- carpeta de componentes comunes del módulo de función de componentes
| | | |-- componente de encabezado de rol roleHeader.vue
| | | |-- componente de cuadro emergente de rol roleModal.vue
| |-- módulo empleado empleado
| |-- BehaviorLog módulo de registro de registro de comportamiento
| |-- codeGenerator módulo generador de código organiza los lugares que deben ser comentados
otro
Trate de no manipular manualmente el DOM
Debido al uso del marco vue , intente usar el DOM de actualización basado en datos de vue en el desarrollo del proyecto e intente (no como último recurso) no
Manipule manualmente DOM , incluyendo: agregar, eliminar, modificar elementos dom , cambiar estilos, agregar eventos, etc.
Eliminar código inútil
Debido al uso de la herramienta de versión de código svn , el código inútil debe eliminarse a tiempo, por ejemplo: algunas declaraciones de consola de depuración,
depurador , código inútil para funciones obsoletas.
especificación de compromiso svn
nota
Para el código enviado a la base de código svn , cada compromiso debe completar las modificaciones realizadas por este envío. Cuando hay múltiples modificaciones, use la secuencia
pantalla de mesa
integridad del código
El código enviado a la base de código svn debe garantizar que pueda ejecutarse normalmente después de Checkout , y está prohibido mostrar un mensaje de error o advertencia en la consola.
Envíe el código, se prohíbe cargar información de configuración personal en la base de código svn para evitar conflictos con los desarrolladores conjuntos , y la baseUrl de la solicitud está prohibida en el código
Conmutación multientorno codificada de forma rígida, use la configuración del entorno del nodo para determinar qué ruta usar, debe asegurarse de que los archivos en la base del código se puedan empaquetar después de pagar
Trabaja bien en todos los entornos.
Para los comentarios de la página, el siguiente contenido debe escribirse en la parte superior de la página ()
<!--
des : la descripción de esta página debe indicar la función de esta página o componente
creador : Creador (el autor original del archivo puede escribir)
createTime : Hora de creación (puede ser escrita por el autor original del archivo)
-->
Para el método en el que la página debe modificarse debido a requisitos o errores , también se debe indicar el siguiente contenido
/*
des : la descripción de este cambio debe indicar el motivo de este cambio
actualizador : Creador (el autor de la modificación , no el autor del archivo actual que necesita escribir)
updateTime : Hora de creación (el autor de la modificación)
*/
Instrucciones de uso de componentes públicos
El archivo js de la interfaz en el directorio api debe anotarse para describir la función de la interfaz
El estado, la mutación, la acción, etc. en la tienda deben anotarse para describir la función del atributo.
Cuando un archivo vue presenta un componente, se debe agregar una nota para explicar el propósito del componente
Cuando un archivo vue introduce un método en la API , se debe agregar una nota para explicar el propósito del método.
Para los métodos del archivo vue , se deben agregar comentarios para cada método , y se deben agregar comentarios adicionales para el procesamiento comercial complejo en el método.
Los datos del archivo vue , nombres de atributos muy comunes, deben comentarse, por ejemplo: tableData/searchForm no necesita agregar comentarios,
scaleEffectKey necesita agregar anotaciones
1.xxx
2.xxx ignorar
//bien
servicio _ baseURL = proceso . env . VUE_APP_BASE_URL ;
//malo
servicio _ baseURL = 'http://127.0.0.1:9999' ;
// Varios tipos de archivos que no necesitan ser enviados
. DS_Tienda
node_modules
/ dist
. historia
# Archivos de registro
npm - depuración . registro *
hilado - depuración . registro *
error de hilo . registro *
pnpm - depuración . registro *
# Editor de directorios y archivos
. idea
. vscode
* . su
* . ntvs *
* . njspros
* . sln
* . sw ?

Supongo que te gusta

Origin blog.csdn.net/z1093541823/article/details/125102169
Recomendado
Clasificación