Vue, рд╕реНрдЯреЛрд░реАрдмреБрдХ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ - рдорди рдореЗрдВ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛


(рдореВрд▓ рд░реВрдк рд╕реЗ рдордзреНрдпрдо рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд)


рдореБрдЭреЗ рд░рд┐рдПрдХреНрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рд╣реИред рдпрд╣ Vue рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА рдХрд╛ рдПрдХ рдЕрдЬреАрдм рдкрд░рд┐рдЪрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ Vue рдХреА рдЪрд░реНрдЪрд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред


рдореБрдЭреЗ рд░рд┐рдПрдХреНрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рд╣реИ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдирдлрд░рдд рд╣реИред JSX рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдЖрдкрдХреЗ рдЕрдЧрд▓реЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ UI рдХреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрднреБрдд рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреЗрдПрд╕ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рд╕реАрдПрд╕рдПрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдмрд╣реБрдд рд▓рдЪреАрд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХреЛ рдкрдврд╝рдХрд░ рдЖрдкрдХреЛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдХреНрд░реВрдкреБрд▓рд╕ рдХреЛрдб рд░рд┐рд╡реНрдпреВ рдкреНрд░реИрдХреНрдЯрд┐рд╕ рд╕реЗ рднреА рдЖрдк рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдЦрд░реЛрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣реА рдЖрдк рдШрдЯрдХреЛрдВ рдХреЗ рдЬрдЯрд┐рд▓ рдШреЛрдВрд╕рд▓реЗ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред


рдореИрдВрдиреЗ Vue рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдмрд╛рддреЗрдВ рд╕реБрдиреА рд╣реИрдВ - рдмреНрд▓реЙрдХ рдкрд░ рдЗрддрдирд╛ рдирдпрд╛ рдмрдЪреНрдЪрд╛ рдирд╣реАрдВ - рдФрд░ рдореИрдВрдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЕрдкрдиреЗ рдкреИрд░реЛрдВ рдХреЛ рдЧреАрд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛; рд░рд┐рдПрдХреНрдЯ рдФрд░ рдкреЙрд▓рд┐рдорд░ (рдФрд░ рдХреЛрдгреАрдп рдХреЗ рдореЗрд░реЗ рд╕рднреА рдорд╛рдирд╕рд┐рдХ рд╕рд╛рдорд╛рдиреЛрдВ рдореЗрдВ рд▓рд╛рдирд╛, рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред


Vue рдкреЙрд▓рд┐рдорд░ рдХреА рддрд░рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦрдХ рдЗрд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВред *.vue рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкреЙрд▓рд┐рдорд░ рдХреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рднрд╛рдЧреЛрдВ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣реА рдереА рдФрд░ рдореИрдВ рд╕реАрдзреЗ рдХрдмреВрддрд░ рдореЗрдВред рдХреБрдЫ рджрд┐рдиреЛрдВ рдмрд╛рдж рдореИрдВрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдпреВрдЖрдИ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХрдИ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рджрд▓рджрд▓ рд╕реЗ рдмрд╛рд╣рд░ рд░реЗрдВрдЧ рд▓рд┐рдпрд╛ рдФрд░ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓рд╛, рдЙрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред


рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!


рд╣рдо рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП npx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ npx рдирд╣реАрдВ рд╣реИ рддреЛ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: npm install -g npx Npm рдПрдХ рдЬреАрд╡рди рд░рдХреНрд╖рдХ рд╣реИ рдЬрдм рдЖрдк npm рдХреНрд▓рд┐ рд╕рдВрдХреБрд▓ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджрд░реНрдЬрдиреЛрдВ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП npm install -g рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдпрд╛рд░реНрди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ npm install -g yarn рдЖрдкрдХреЛ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред


 $ npx vue create not-a-todo-app Vue CLI v3.3.0 ? Please pick a preset: Manually select features ? Check the features needed for your project: Babel, TS, PWA, Router, Vuex, CSS Pre-processors, Linter, Unit, E2E ? Use class-style component syntax? Yes ? Use Babel alongside TypeScript for auto-detected polyfills? Yes ? Use history mode for router? (Requires proper server setup for index fallback in production) Yes ? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS ? Pick a linter / formatter config: TSLint ? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)Lint on save ? Pick a unit testing solution: Jest ? Pick a E2E testing solution: Cypress ? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? In dedicated config files ? Save this as a preset for future projects? No 

Vue Cli рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬрд╛рджреВрдЧрд░ рд╣реИ; рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВрдЧреЗред Overkill? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ Vue рд╣рд░ рдЪреАрдЬ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рдкрд░ рд╡рд┐рдХрд▓реНрдк рдФрд░ рдХрд╛рд░рдг рджреЗрдЦреЗрдВред


рд╣рдореЗрдВ рдмрд╛рдмреЗрд▓ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЛрдиреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯреАрдПрд╕ рдкрд╕рдВрдж рдХреА рдкреНрд░рд╛рдердорд┐рдХ рднрд╛рд╖рд╛ рд╣реЛрдЧреА рдФрд░ рдмрд╛рдмреЗрд▓ рдмрд╛рд╣рд░реА рдХреЛрдб рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЗрдПрд╕ рдХреЛрдб рдХреЛ рднреА рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдФрд░ рд╡реАрдЯреАрдпреВрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд) рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЯреАрдПрд╕ *.ts рд▓рд┐рдП рдЯреАрдПрд╕ рд░рдЦрдирд╛ рдФрд░ рдмрд╛рдХреА рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмреИрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред


рд╕реАрдПрд╕рдПрд╕ рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд░ Vuetify рдХреЗ рдХрд╛рдо рдореЗрдВ рдЖрдПрдВрдЧреЗ; рдЬрдм рдпрд╣ рдкреНрд░реА-рдорд┐рдиреАрдлрд╛рдЗрдб рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ styl рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдВрдЯрд░ / рдлреЙрд░реНрдореИрдЯрд░ рдХрд┐рд╕реА рднреА рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЖрдкрдХреЛ рдПрдХ рдПрдХрд▓ рдХреЛрдб рд╢реИрд▓реА рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдк рдПрдХ рд╕рд╛рд▓ рдореЗрдВ рдореБрдЭреЗ рдзрдиреНрдпрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдЕрдкрдирд╛ рдкреБрд░рд╛рдирд╛ рдХреЛрдб рдкрдврд╝ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ)ред рд╣рдо рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдФрд░ E2E рджреЛрдиреЛрдВ рдкрд░реАрдХреНрд╖рдг рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ - рдЬрдмрдХрд┐ рдЖрдк рдкреВрд░реНрдг e2e рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рд╣рдо Vuetify рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдм рдРрдк (PWA) рд╕рдорд░реНрдерди , рд░рд╛рдЙрдЯрд░ рдФрд░ Vuex рдХреЛ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рдХрдбрд╝рд╛рдИ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рдкрд╛рдПрдВрдЧреЗред


рд╡рд░реНрдЧ-рд╢реИрд▓реА рдШрдЯрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рд╣рд╛рдВред рдХрдХреНрд╖рд╛рдПрдВ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдереЛрдХ рдмрдирд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рддрд░реНрдХ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди; рд╡реЗ рдЖрдкрдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреАрд╡рди рдХреЛ рднреА рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред


рдСрдЯреЛ-рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рд╣рд╛рдВред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдмрд╛рдмреЗрд▓ рдФрд░ рдЯреАрдПрд╕ рджреЛрдиреЛрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред


рд░рд╛рдЙрдЯрд░ рдХреЗ рд▓рд┐рдП рдЗрддрд┐рд╣рд╛рд╕ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рд╣рд╛рдВ (рд▓реЗрдХрд┐рди YMMV)ред рд╣рдо рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрд╕реЗ рдкрд░реЛрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреИрдХрдПрдВрдб рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдЗрддрд┐рд╣рд╛рд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред


CSS рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд░ (PostCSS, Autoprefixer рдФрд░ CSS Modules рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ) рдЪреБрдиреЗрдВ: рд╣рдо рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдХреЗрд╡рд▓ CSS рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ sass / рдХрдо / рд╕реНрдЯрд╛рдЗрд▓рд╕ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред


рд▓рд┐рдВрдЯрд░ / рдлреЙрд░реНрдореИрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдЪреБрдиреЗрдВ: TSlint рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд╕рдВрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд┐рдВрдЯ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЪреБрдиреЗрдВ: рджреЛрдиреЛрдВ ( a ) рд╕рдХреНрд╖рдо рдХрд░реЗрдВред рд▓рд╛рдЗрдирд┐рдВрдЧ рдЕрдЪреНрдЫреА рд╣реИред


рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдзрд╛рди рдЪреБрдиреЗрдВ: рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЬреЗрд╕реНрдЯ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


E2E рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдзрд╛рди рдЪреБрдиреЗрдВ: рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕рд░реВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред


рдЖрдк рдХреЛрд▓рд╛рд╣рд▓, PostCSS, ESLint, рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдБ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдереЛрдбрд╝реЗ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ package.json рдореЗрдВ рдЕрдзрд┐рдХ рдЪреАрдЬреЛрдВ рдХреЛ package.json рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдкрдардиреАрдп рддрд░реАрдХрд╛ рдЕрдм рд╣реИред рд╕рдорд░реНрдкрд┐рдд рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рд╡реЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдЧрд┐рдЯ рдЗрддрд┐рд╣рд╛рд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реЛрдЧрд╛ред


рд╕реЗрдЯрдЕрдк рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп, yarn serve рдЪрд▓рд╛рдПрдВ:


рдХрдВрд╕реЛрд▓ рдФрд░ http рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП : // localhost: 8080 / рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рдЕрднрд┐рд╡рд╛рджрди рд╣реЛрдЧрд╛:


рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛, yarn test:unit рдЪрд▓рд╛рдирд╛ yarn test:unit :


рдФрд░ e2e рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп ( yarn test:e2e --headless ):


рд╡рд╛рд╣! UI рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред


рд╕рд╛рдордЧреНрд░реА рджреБрд╡рд┐рдзрд╛


Vue рдХреЗ рд▓рд┐рдП рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рдкреЙрд▓рд┐рд╢ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рдордЯреЗрд░рд┐рдпрд▓ UI рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджрд░реНрдЬрдиреЛрдВ рдЕрдиреНрдп рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдВ рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ Vuetify рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ:


  • рдпрд╣ GitHub рдкрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рддрд╛рд░рд╛рдВрдХрд┐рдд рд╕рд╛рдордЧреНрд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ;
  • рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рд╣реА рджрд░реНрдж рдерд╛ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрди рд╕рднреА рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдбреЗрдореЛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдпрд╛рддреНрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд╢реНрд╡рд╕реНрдд? рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВ: vue add vuetify ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ (рдЙрдиреНрдирдд) рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред


рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? Vuetify рдбрд┐рдлрд╝реЙрд▓реНрдЯ App.vue рдФрд░ HelloWorld.vue рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╣рд╛рдВ рдореЗрдВ рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред


рдХрд╕реНрдЯрдо рдереАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рд╣рд╛рдВред рдЖрдкрдХреЛ рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддреЛ рдЪрд▓реЛ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИред рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдЧреБрдгреЛрдВ (рд╕реАрдПрд╕рдПрд╕ рдЪрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдВ рдореЗрдВ рдЙрддреНрддрд░ рджреЗрдВ ? ред


рдЖрдЗрдХрди рдлрд╝реЙрдиреНрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ: рд╕рд╛рдордЧреНрд░реА рдЖрдЗрдХрди (рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдлрд╝реЙрдиреНрдЯ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдмрд╛рдж рдореЗрдВ рднреА)ред рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдлреЛрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рдирд╣реАрдВред рд╣рдо рд╕реАрдбреАрдПрди рд╕реЗ рдлреЛрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред


рд▓рд╛-рдХрд╛рд░реНрдЯреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рд╣рд╛рдВред рдпрд╣ Vuetify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИред


рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк yarn serve рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдЕрдм рдЖрдк рдПрдХ рдЕрд▓рдЧ рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВрдЧреЗ:


(рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд▓рд┐рдВрдЯрд░ рд╕реЗ рдХреБрдЫ рджрд░реНрдЬрди рдЪреЗрддрд╛рд╡рдиреА рднреА рдорд┐рд▓реЗрдВрдЧреА)ред


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдпреВрдирд┐рдЯ рдХреЗ рдкрд░реАрдХреНрд╖рдг ...


рдЗрдХрд╛рдИ рдФрд░ e2e рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде Vuetify рдХрд╛рдо рдХрд░рдирд╛


рдЖрдЗрдП рджреЗрдЦреЗрдВ ./tests/unit/example.spec.ts ред рдкрд░реАрдХреНрд╖рдг рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ " рдирдП рд╕рдВрджреЗрд╢ " рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗрдЗрдЯреАрдлрд╛рдИ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрдм рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рд╣реИрд▓реЛрд╡рд░реНрд▓реНрдб рдШрдЯрдХ рдФрд░ рдЙрд╕рдХреЗ рдкрд░реАрдХреНрд╖рдг рджреЛрдиреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдЙрд╕ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:


 const msg = 'Welcome to Vuetify'; 

рдЕрдм рдкрд░реАрдХреНрд╖рдг рдЧреБрдЬрд░рддрд╛ рд╣реИ ( yarn test:unit рд╕рд╛рде рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ yarn test:unit ) рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдПрдХ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рд╕рдорд╛рди рд╣реИрдВ


 [Vue warn]: Unknown custom element: <v-layout> - did you register the component correctly? For recursive components, make sure to provide the "name" option. 

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ Vuetify рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЬреЛрдбрд╝рддрд╛ рд╣реИ ./src/plugins/vuetify.ts рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ Vuetify рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ ./src/main.ts рд╕реЗ рд╕реНрд░реЛрдд рд╣реИред рдЬрдм рдЖрдк рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ main.ts рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдкрд╣рд▓реА рдмрд╛рдд, рдЖрдЗрдП рдЙрддреНрдкрдиреНрди vuetify.ts рднреАрддрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВред


рдЕрдкрдирд╛ ./tsconfig.json рдЦреЛрд▓реЗрдВ рдФрд░ compilerOptions.types рд▓рд┐рдП vuetify рдЬреЛрдбрд╝реЗрдВред рдЕрдиреБрднрд╛рдЧ рдЕрдиреБрднрд╛рдЧ:


  "types": [ "webpack-env", "vuetify", "jest" ], 

рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ Vuetify рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ ./src/plugins/vuetify.ts рдореЗрдВ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢реИрд▓реА рдХреА рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдареАрдХ рдХрд░реЗрдВ:


 import Vue from 'vue'; import Vuetify from 'vuetify/lib'; import 'vuetify/src/stylus/app.styl'; Vue.use(Vuetify, { theme: { primary: '#ee44aa', secondary: '#424242', accent: '#82B1FF', error: '#FF5252', info: '#2196F3', success: '#4CAF50', warning: '#FFC107', }, customProperties: true, iconfont: 'md', }); 

рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ Vuetify рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде ./tests/jest-setup.js / ./tests/jest-setup.js рдкрд░ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:


 import '@/plugins/vuetify'; 

рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ./jest.config.js рдЗрд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


 module.exports = { ... setupFiles: ['./tests/jest-setup.js'], } 


рдкрд░реАрдХреНрд╖рдг рдЕрднреА рднреА рд╡рд┐рдлрд▓ рд▓реЗрдХрд┐рди рдПрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЧреБрдкреНрдд рддрд░реАрдХреЗ рд╕реЗред рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?


vuetify/lib рдХрд╛ рдПрдХ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рдХрдЪреНрдЪрд╛ рд╕реНрд░реЛрдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ ES рдореЙрдбреНрдпреВрд▓ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред node_modules рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╣ node_modules рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ Vue рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рдЬреЗрдПрд╕ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкреАрд▓ рдЬреЗрдПрд╕ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ / ./jest.config.js рджреЛ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ ./jest.config.js :


 module.exports = { ... transform: { '^.+\\.vue$': 'vue-jest', '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', '^.+\\.tsx?$': 'ts-jest', '^.+\\.jsx?$': 'babel-jest', // <-- (1) }, transformIgnorePatterns: [ 'node_modules/(?!(vuetify)/)', // <-- (2) ], } 

(1) рд╣рдо рдЬреЗрд╕реНрдЯ рдХреЛ рдХрд┐рд╕реА рднреА *.js рдпрд╛ *.jsx рдлрд╛рдЗрд▓ рдХреЛ *.jsx (рдФрд░ *.jsx рдХреЛ Vue Cli рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ (2) рд╣реИ ? transformIgnorePatterns рдЙрди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЬреЗрд╕реНрдЯ рдХреЛрдб рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рд╛рди рдХрд░рддреЗ рд╕рдордп рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдЧрд╛ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдВ node_modules рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣рд╛рдБ рд╣рдо рдПрдХ рдХреНрд░рд┐рдкреНрдЯрд┐рдХ рд░реЗрдЧреЗрдХреНрд╕ node_modules/(?!(vuetify)/) рд╕рд╛рде рдбрд┐рдлреЙрд▓реНрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдХрд┐рд╕реА рднреА рдкрде рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдЬреЛ node_modules/ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ node_modules/ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ vuetify рдХреЗ рдмрд╛рдж рди рд╣реЛ":


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рджреЛ рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреАрд╕рд░рд╛ рдирд╣реАрдВред рдпрд╣ рдЯреНрд░рд┐рдХ рддрдм рдХрд╛рдо рдЖрдПрдЧреА рдЬрдм рд╣рдо рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдПред


рдкрд░реАрдХреНрд╖рдг рдлрд┐рд░ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ...


рдЕрдЬреНрдЮрд╛рдд рдХрд╕реНрдЯрдо рддрддреНрд╡ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ; рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рд╣реИ рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЪрд▓рддрд╛ рд╣реИред Vuetify рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкреЛрдВрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ ( рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдбреЙрдХреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ ); рд╣рдо рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ рд╡реЗрд╡ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВрдЧреЗред рдЦреЛрд▓реЗрдВ ./src/plugins/vuetify.ts рдлрд┐рд░ рд╕реЗ рдФрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:


 import Vue from 'vue'; import Vuetify, { VFlex, VLayout, VContainer, VImg } from 'vuetify/lib'; import 'vuetify/src/stylus/app.styl'; Vue.use(Vuetify, { components: { VFlex, VLayout, VContainer, VImg }, theme: { primary: '#ee44aa', secondary: '#424242', accent: '#82B1FF', error: '#FF5252', info: '#2196F3', success: '#4CAF50', warning: '#FFC107', }, customProperties: true, iconfont: 'md', }); 

рдЕрдВрдд рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕:


E2E рдкрд░реАрдХреНрд╖рдг рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ ( yarn test:e2e --headless ), рд▓реЗрдХрд┐рди рдпрд╣ ./tests/e2e/specs/test.js рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ рдЬреЛ рдЕрдм рдирд╣реАрдВ рд╣реИред E2E рдкрд░реАрдХреНрд╖рдг рдЖрдкрдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реНрдкрд┐рди рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреЛрдб рди рд╣реЛ - Vuetify рд╕рднреА рдЖрдкрдХреЗ рдРрдк рдореЗрдВ рд╕реЗрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдирдпрд╛ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП test.js рдХреЛ рдареАрдХ рдХрд░реЗрдВ:


 cy.contains('h1', 'Welcome to Vuetify') 

рдФрд░ рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╣рд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ Vuetify рдХреЛ рдЬреЛрдбрд╝рд╛, рдПрдХ рдирдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдФрд░ e2e рдкрд░реАрдХреНрд╖рдг рддрдп рдХрд┐рдП рдФрд░ Jest рдХреЛ Vuetify рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ред рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ рдФрд░ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░реА рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╣рд╛рдирд┐рдпреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛!


storybooks


рд╕реНрдЯреЛрд░реАрдмреБрдХ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рдЪрд╛рд░ рд╣реИ: рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ: рдкреВрд░реНрдг рдРрдк рдХреЗ рдЫреЛрдЯреЗ рдШрдЯрдХред рдЖрдк рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЗ рдпреВрдЖрдИ рдбрд┐рдЬрд╛рдЗрдирд░ рдиреЗ рдлрд╝реЛрдЯреЛрд╢реЙрдк рдореЗрдВ рд░рдЦрд╛ рдерд╛, рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдЪрд▓реЛ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ!


рдПрдХ Vue рд╕реНрдЯреЛрд░реАрдмреБрдХ рдкреНрд▓рдЧрдЗрди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ sb init рдЕрдЪреНрдЫреЗ рдбрд┐рдлреЙрд▓реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред npx -p @storybook/cli sb init рдЪрд▓рд╛рдПрдВ рдФрд░ рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ yarn storybook рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪрд▓реЛ рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:


рдЪрд▓реЛ рдПрдХ рдирдИ рдХрд╣рд╛рдиреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ! рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде ./src/components/LoveButton.stories.ts рдмрдирд╛рдПрдБ:


 import { storiesOf } from '@storybook/vue'; import LoveButton from './LoveButton.vue'; storiesOf('LoveButton', module) .add('default', () => ({ components: { LoveButton }, template: `<love-button love="vue"/>`, })); 

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк LoveButton.stories.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдвреАрд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЛ рд▓рд╛рдкрддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк yarn add -D @types/storybook__vue рд╕рд╛рде рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде ./src/components/LoveButton.vue рдмрдирд╛рдПрдВ:


 <template> <v-btn color="red"> <v-icon>favorite</v-icon> {{love}} </v-btn> </template> <script lang="ts"> import Vue from 'vue'; export default Vue.extend({ props: ['love'], }); </script> 

рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдЖрдкрдХреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ./stories рдирдЬрд╝рд░ ./stories , рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ (рдЬреИрд╕реЗ рд╣рдордиреЗ рдХрд┐рдпрд╛ рдерд╛) рдХреЗ рдХрд░реАрдм рд░рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рджреЗрдЦреЗрдВ ./.storybook/config.js :


 import { configure } from '@storybook/vue'; const req = require.context('../src', true, /.stories.(j|t)s$/); function loadStories() { req.keys().forEach(filename => req(filename)); } configure(loadStories, module); 

рдЕрдм, рдлрд┐рд░ рд╕реЗ yarn storybook рдЪрд▓рд╛рдПрдВ:


рдмрд╣реБрдд рд░реЛрдорд╛рдВрдЪрдХ рдирд╣реАрдВ рд╣реИред рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рднрд░рд╛ рдХрдВрд╕реЛрд▓:


рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред рд╕реНрдЯреЛрд░реАрдмреБрдХ рдПрдХ рдФрд░ "рд░реВрдЯ" рд╕рдВрджрд░реНрдн рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ; рдпрд╣ main.ts рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреИрд╕реЗ рдХрд┐ Vuetify рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрджреНрдпрддрди рдХрд░реЗрдВ ./.storybook/config.js :


 import { configure } from '@storybook/vue'; import '../src/plugins/vuetify'; // <-- add this const req = require.context('../src', true, /.stories.(j|t)s$/); function loadStories() { req.keys().forEach(filename => req(filename)); } configure(loadStories, module); 

рд╣рдо рдЕрдкрдирд╛ рдореМрдЬреВрджрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдРрдк рдХреЗ рд╕рдорд╛рди рдереАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ yarn storybook рдЕрдм рдЕрд╕рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА:


рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдпрд╣ vuetify.ts рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде ./.storybook/webpack.config.js рдмрдирд╛рдПрдВ:


 const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); module.exports = (baseConfig, env, defaultConfig) => { defaultConfig.resolve.extensions.push('.ts', '.tsx', '.vue', '.css', '.less', '.scss', '.sass', '.html') defaultConfig.module.rules.push({ test: /\.ts$/, exclude: /node_modules/, use: [ { loader: 'ts-loader', options: { appendTsSuffixTo: [/\.vue$/], transpileOnly: true }, } ], }); defaultConfig.module.rules.push({ test: /\.less$/, loaders: [ 'style-loader', 'css-loader', 'less-loader' ] }); defaultConfig.module.rules.push({ test: /\.styl$/, loader: 'style-loader!css-loader!stylus-loader' }); defaultConfig.plugins.push(new ForkTsCheckerWebpackPlugin()) return defaultConfig; }; 

рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП ts-loader рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдХрдо рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЬреЛ Vuet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред


рдЪреЗрддрд╛рд╡рдиреА рдЕрднреА рднреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЙрди рдШрдЯрдХреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдереЗред рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░ рд╕реНрдерд╛рдиреАрдп рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЕрдВрддрд░ рджреЗрдЦ рд╕рдХреЗрдВ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрддреНрдкрд╛рджрди рдРрдк рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ vuetify.ts рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ)ред рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ./src/components/LoveButton.vue :


 <template> <v-btn color="red"> <v-icon>favorite</v-icon> {{love}} </v-btn> </template> <script lang="ts"> import Vue from 'vue'; import { VBtn, VIcon } from 'vuetify/lib'; // <-- add this export default Vue.extend({ components: { VBtn, VIcon }, // <-- and this props: ['love'], }); </script> 

рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕рд╣реЗрдЬрдиреЗ рдкрд░ рддрд╛рдЬрд╝рд╛ рд╣реЛрддреА рд╣реИ:


рдорд╛рд░реНрдЬрд┐рди рдмреЗрд╣рддрд░ рд╣реИред рдХреНрдпрд╛ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ? Vuetify рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдиреЗ рдлреЛрдВрдЯ css рдХреЛ рд╕реАрдзреЗ ./public/index.html рдкрд░ рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд▓рд╛рдкрддрд╛ рд╕рд╛рдордЧреНрд░реА рдЖрдЗрдХрди рдлрд╝реЙрдиреНрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде (/ ./.storybook/preview-head.hmtl рдмрдирд╛рдПрдБ (рдХреЙрдкреА рдХрд░рдирд╛ ./public/index.html ):


 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons"> 

(рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП CSS @import рдХрд╛ рдЙрдкрдпреЛрдЧ @import )ред


рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдкреБрдирдГ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреА yarn storybook рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╕рдмрдкрд░: рдкрд╛рда рдлрд╝реЙрдиреНрдЯ рдЧрд▓рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Vuetify рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХ v-app рднреАрддрд░ рдиреЗрд╕реНрдЯреЗрдб рд╣реЛрдВрдЧреЗ рдЬреЛ рдкреГрд╖реНрда рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдмрдЯрди рдореЗрдВ v-app рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд╣рд╛рдиреА рдХреЛ рд╕рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдкрдиреЗ ./src/components/LoveButton.stories.ts рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:


 import { storiesOf } from '@storybook/vue'; import { VApp, VContent } from 'vuetify/lib'; // <-- add the import import LoveButton from './LoveButton.vue'; // add the decorator const appDecorator = () => { return { components: { VApp, VContent }, template: ` <v-app> <div style="background-color: rgb(134, 212, 226); padding: 20px; width: 100%; height: 100%;"> <v-content> <story/> </v-content> </div> </v-app> `, }; }; storiesOf('LoveButton', module) .addDecorator(appDecorator) // <-- decorate the stories .add('default', () => ({ components: { LoveButton }, template: `<love-button love="vue"/>`, })); 

рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ VApp рдФрд░ VContent рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдкрдиреЗ ./src/plugins/vuetify.ts рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ ./src/plugins/vuetify.ts :


 import Vue from 'vue'; import Vuetify, { VFlex, VLayout, VContainer, VImg, VApp, VContent } from 'vuetify/lib'; import 'vuetify/src/stylus/app.styl'; Vue.use(Vuetify, { components: { VFlex, VLayout, VContainer, VImg, VApp, VContent }, theme: { primary: '#ee44aa', secondary: '#424242', accent: '#82B1FF', error: '#FF5252', info: '#2196F3', success: '#4CAF50', warning: '#FFC107', }, customProperties: true, iconfont: 'md', }); 

рдЕрдВрдд рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдирджрд╛рд░ рд╣реИ:


рд╕реНрдЯреЛрд░реАрдмреБрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдирд╛


рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдХрд╣рд╛рдирд┐рдпрд╛рдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХреА рдЧрдИ рд╣реИрдВред рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ: yarn add -D @storybook/addon-storyshots jest-vue-preprocessor babel-plugin-require-context-hook рдФрд░ рдмрдирд╛рдПрдБ ./test/unit/storybook.spec.js :ред


 import registerRequireContextHook from 'babel-plugin-require-context-hook/register'; import initStoryshots from '@storybook/addon-storyshots'; registerRequireContextHook(); initStoryshots(); 

рд╕рднреА рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░реАрдмреБрдХ require.context рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рд╡реЗрдмрдкреИрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП babel-plugin-require-context-hook рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА babel-plugin-require-context-hook ред рдЕрдкрдиреЗ ./babel.config.js рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ:


 module.exports = api => ({ presets: ['@vue/app'], ...(api.env('test') && { plugins: ['require-context-hook'] }), }); 

рдпрд╣рд╛рдВ рд╣рдо require-context-hook рдкреНрд▓рдЧрдЗрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдмреЗрдмрд▓ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИред


рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреЛ рдХрд╣рд╛рдиреА рдХреА *.vue рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ ./jest.config.js рд░реЗрдЧреЗрдХреНрд╕ рдЗрди ./jest.config.js ? рдЖрдЗрдП рдЕрдм рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ:


 module.exports = { ... transformIgnorePatterns: [ 'node_modules/(?!(vuetify/|@storybook/.*\\.vue$))', ], } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдирджреЗрдЦрд╛ рдкреИрдЯрд░реНрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдкрд╣рд▓рд╛ рдкреИрдЯрд░реНрди рд╕рдм рдХреБрдЫ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Vuetify рддреЛ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЬреЗрд╕реНрдЯ рджреВрд╕рд░реЗ рд░реЗрдЧреЗрдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред


рдирдП рдкрд░реАрдХреНрд╖рдг рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:


рдпрд╣ рдкрд░реАрдХреНрд╖рд╛ рдЖрдкрдХреА рд╕рднреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдПрдЧреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд╡рд┐рд░реБрджреНрдз ./tests/unit/__snapshots__/ snapshots ./tests/unit/__snapshots__/ рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд ./tests/unit/__snapshots__/ ред рдЗрд╕реЗ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЕрдкрдиреЗ рдмрдЯрди рдШрдЯрдХ рд╕реЗ <v-icon>favorite</v-icon> рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдлрд▓ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреБрди: рдЪрд▓рд╛рдПрдБ:


yarn test:unit -u рдирдП рдмрдЯрди рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ред


рд╕рдВрдХреНрд╖рд┐рдкреНрдд


рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ Vue рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдХреИрд╕реЗ рд╕рд╛рдордЧреНрд░реА рдпреВрдЖрдИ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде Vuetify рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдордиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реА рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдФрд░ e2e рдкрд░реАрдХреНрд╖рдг рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ рд╣рдордиреЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛, рдПрдХ рдирдореВрдирд╛ рдХрд╣рд╛рдиреА рдмрдирд╛рдИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдпреВрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣рдорд╛рд░реА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред


рд╡рд┐рдЪрд╛рд░ рдмрдВрдж рдХрд░рдирд╛


JS рдЧрддрд┐ рдореЗрдВ рдПрдХ рджреБрдирд┐рдпрд╛ рд╣реИ, рдЪреАрдЬреЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓рддреА рд╣реИрдВ, рдирдП рдкреЗрдЯреЗрдВрдЯ рдЙрднрд░рддреЗ рд╣реИрдВ, рдкреБрд░рд╛рдиреЗ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗрд╡рд▓ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рд╣реИрдВред


рдЕрдкрдиреЗ рдЯреВрд▓реАрдВрдЧ рдХреЛ рдЬрд╛рдиреЗрдВред рдЬрдм рддрдХ рдЖрдкрдХрд╛ рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рддрдм рддрдХ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╢реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрджрд▓рд╛рд╡ рдиреЗ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ред рдбреЙрдХреНрд╕ рдкрдврд╝реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдкрдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд┐рд▓рд╛ рд╣реИ - рдПрдХ рдХрдорд┐рдЯ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдкреНрд░рдЧрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ рдЬрдм рдЖрдкрдХреЗ рдЖрдЧреЗ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреБрдЫ рддреЛрдбрд╝ рджреЗрдВрдЧреЗред


рдкреНрд░рдпреЛрдЧ! рдЕрдЧрд░ рдХреБрдЫ рдЖрдкрдХреЗ рд╕реЛрдЪрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЙрдХреНрд╕ рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ! рдлрд╝реНрд░рдВрдЯреЗрдВрдб рд╡рд░реНрд▓реНрдб рдЬреНрдпрд╛рджрд╛рддрд░ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╣реИ рдЗрд╕рд▓рд┐рдП рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдЦреЛрджреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдбрд┐рдмрдЧ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрджрд░ рд╕реЗ рдЕрдкрдиреЗ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi438354/


All Articles