diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..9c93109 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +|![icon](_media\svelte-logo-horizontal.svg)| +|--| +![logo](_media/sk.png) + +# Русская документация Svelte + +(доступна также [русская документация SvelteKit](https://romkar.github.io/sveltekit-docs-rus/)) + +Svelte — это принципиально новый подход к созданию пользовательских интерфейсов. Когда традиционные фреймворки, такие как React и Vue, выполняют основную часть своей работы в браузере, Svelte переносит эту работу на этап компиляции, который происходит при сборке приложения. + +Вместо использования таких тяжелых приёмов, как сравнение состояний виртуального DOM, Svelte пишет код, который точечно обновляет DOM при изменении состояния вашего приложения. + +Мы гордимся тем, что Svelte был признан самым [любимым web-фреймворком](https://insights.stackoverflow.com/survey/2021#section-most-loved-dreaded-and-wanted-web-frameworks) и [наиболее удовлетворившим](https://2020.stateofjs.com/en-US/technologies/front-end-frameworks/) в паре широких опросов разработчиков. Думаем, вы тоже полюбите его. [Прочтите вводную статью в блоге](/blog/2019-04-22-svelte-3-rethinking-reactivity), чтобы узнать больше. + + +--- + +> Оригинал перевода тут [https://github.com/AlexxNB/svelte3-translation-ru](https://github.com/AlexxNB/svelte3-translation-ru) +и тут [https://github.com/sveltejs-translations](https://github.com/sveltejs-translations) + +--- +**TODO:** +- [ ] Обновить перевод документации до текущей версии (актуализировать) +- [ ] Исправить внутренние ссылки + +--- +|![icon_docsify](_media/icon_docsify.svg)| +|--| +|[Работает на docsify](https://docsify.js.org)| \ No newline at end of file diff --git a/_media/favicon.png b/_media/favicon.png new file mode 100644 index 0000000..21bc302 Binary files /dev/null and b/_media/favicon.png differ diff --git a/_media/icon_docsify.svg b/_media/icon_docsify.svg new file mode 100644 index 0000000..6d6718b --- /dev/null +++ b/_media/icon_docsify.svg @@ -0,0 +1,30 @@ + + + + icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_media/sk.css b/_media/sk.css new file mode 100644 index 0000000..740ead1 --- /dev/null +++ b/_media/sk.css @@ -0,0 +1,887 @@ +@import url("https://fonts.googleapis.com/css2?family=Fira+Mono&family=Overpass:wght@300;600&display=swap"); +* { + -webkit-font-smoothing:antialiased; + -webkit-overflow-scrolling:touch; + -webkit-tap-highlight-color:rgba(0, + 0, + 0, + 0); + -webkit-text-size-adjust:none; + -webkit-touch-callout:none; + box-sizing:border-box +} +body:not(.ready) { + overflow:hidden +} +body:not(.ready) .app-nav, +body:not(.ready)>nav, +body:not(.ready) [data-cloak] { + display:none +} +div#app { + font-size:30px; + font-weight:lighter; + margin:40vh auto; + text-align:center +} +div#app:empty:before { + content:"Loading..." +} +img.emoji { + height:1.2em +} +img.emoji, +span.emoji { + vertical-align:middle +} +span.emoji { + font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji; + font-size:1.2em +} +.progress { + background-color:#42b983; + background-color:var(--theme-color,#42b983); + height:2px; + left:0; + position:fixed; + right:0; + top:0; + transition:width .2s,opacity .4s; + width:0; + z-index:999999 +} +.search .search-keyword, +.search a:hover { + color:#42b983; + color:var(--theme-color,#42b983) +} +.search .search-keyword { + font-style:normal; + font-weight:700 +} +body, +html { + height:100% +} +body { + -moz-osx-font-smoothing:grayscale; + -webkit-font-smoothing:antialiased; + /* color:#34495e; */ + color:#000; + font-family: "Overpass", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size:17px; + letter-spacing:0; + margin:0; + overflow-x:hidden +} +img { + max-width:100% +} +a[disabled] { + cursor:not-allowed; + opacity:.6 +} +kbd { + border:1px solid #ccc; + border-radius:3px; + display:inline-block; + font-size:12px!important; + line-height:12px; + margin-bottom:3px; + padding:3px 5px; + vertical-align:middle +} +li input[type=checkbox] { + margin:0 .2em .25em 0; + vertical-align:middle +} +.app-nav { + margin:25px 60px 0 0; + position:absolute; + right:0; + text-align:right; + z-index:10 +} +.app-nav.no-badge { + margin-right:25px +} +.app-nav p { + margin:0 +} +.app-nav>a { + margin:0 1rem; + padding:5px 0 +} +.app-nav li, +.app-nav ul { + display:inline-block; + list-style:none; + margin:0 +} +.app-nav a { + color:inherit; + font-size:16px; + text-decoration:none; + transition:color .3s +} +.app-nav a.active, +.app-nav a:hover { + color:#42b983; + color:var(--theme-color,#42b983) +} +.app-nav a.active { + border-bottom:2px solid #42b983; + border-bottom:2px solid var(--theme-color,#42b983) +} +.app-nav li { + display:inline-block; + margin:0 1rem; + padding:5px 0; + position:relative; + cursor:pointer +} +.app-nav li ul { + background-color:#fff; + border:1px solid; + border-color:#ddd #ddd #ccc; + border-radius:4px; + box-sizing:border-box; + display:none; + max-height:calc(100vh - 61px); + overflow-y:auto; + padding:10px 0; + position:absolute; + right:-15px; + text-align:left; + top:100%; + white-space:nowrap +} +.app-nav li ul li { + display:block; + font-size:14px; + line-height:1rem; + margin:8px 14px; + white-space:nowrap +} +.app-nav li ul a { + display:block; + font-size:inherit; + margin:0; + padding:0 +} +.app-nav li ul a.active { + border-bottom:0 +} +.app-nav li:hover ul { + display:block +} +.github-corner { + border-bottom:0; + position:fixed; + right:0; + text-decoration:none; + top:0; + z-index:1 +} +.github-corner:hover .octo-arm { + animation:octocat-wave .56s ease-in-out +} +.github-corner svg { + color:#fff; + fill:#42b983; + fill:var(--theme-color,#42b983); + height:80px; + width:80px +} +main { + display:block; + position:relative; + width:100vw; + height:100%; + z-index:0 +} +main.hidden { + display:none +} +.anchor { + display:inline-block; + text-decoration:none; + transition:all .3s +} +.anchor span { + color:#34495e +} +.anchor:hover { + text-decoration:underline +} + +.sidebar { + border-right:1px solid rgba(0,0,0,.07); + overflow-y:auto; + padding:40px 0 0; + position:absolute; + top:0; + bottom:0; + left:0; + transition:transform .25s ease-out; + width:300px; + z-index:20; +} +.sidebar>h1 { + margin:0 auto 1rem; + font-size:1.5rem; + font-weight:300; + text-align:center +} +.sidebar>h1 a { + color:inherit; + text-decoration:none +} +.sidebar>h1 .app-nav { + display:block; + position:static +} +.sidebar .sidebar-nav { + line-height:1.5em; + padding-bottom:40px +} +.sidebar li.collapse .app-sub-sidebar { + display:none +} +.sidebar ul { + margin:0 0 0 15px; + padding:0 +} +.sidebar li>p { + font-weight:700; + margin:0 +} +.sidebar ul, +.sidebar ul li { + list-style:none +} +.sidebar ul li a { + border-bottom:none; + display:block +} +.sidebar ul li ul { + padding-left:20px +} +.sidebar::-webkit-scrollbar { + width:4px +} +.sidebar::-webkit-scrollbar-thumb { + background:transparent; + border-radius:4px +} +.sidebar:hover::-webkit-scrollbar-thumb { + background:hsla(0,0%,53.3%,.4) +} +.sidebar:hover::-webkit-scrollbar-track { + background:hsla(0,0%,53.3%,.1) +} +.sidebar-toggle { + background-color:transparent; + background-color:hsla(0,0%,100%,.8); + border:0; + outline:none; + padding:10px; + position:absolute; + bottom:0; + left:0; + text-align:center; + transition:opacity .3s; + width:284px; + z-index:30; + cursor:pointer +} +.sidebar-toggle:hover .sidebar-toggle-button { + opacity:.4 +} +.sidebar-toggle span { + background-color:#42b983; + background-color:var(--theme-color,#42b983); + display:block; + margin-bottom:4px; + width:16px; + height:2px +} +body.sticky .sidebar, +body.sticky .sidebar-toggle { + position:fixed +} +.content { + padding-top:60px; + position:absolute; + top:0; + right:0; + bottom:0; + left:300px; + transition:left .25s ease +} +.markdown-section { + margin:0 auto; + max-width:80%; + padding:30px 15px 40px; + position:relative +} +.markdown-section>* { + box-sizing:border-box; + font-size:inherit +} +.markdown-section>:first-child { + margin-top:0!important +} +.markdown-section hr { + border:none; + border-bottom:1px solid #eee; + margin:2em 0 +} +.markdown-section iframe { + border:1px solid #eee; + width:1px; + min-width:100% +} +.markdown-section table { + border-collapse:collapse; + border-spacing:0; + display:block; + margin-bottom:1rem; + overflow:auto; + width:100% +} +.markdown-section th { + font-weight:700 +} +.markdown-section td, +.markdown-section th { + /* border:1px solid #ddd; */ + padding:6px 13px +} +.markdown-section tr { + /* border-top:1px solid #ccc */ +} +.markdown-section p.tip, +.markdown-section tr:nth-child(2n) { + background-color:#f8f8f8 +} +.markdown-section p.tip { + border-bottom-right-radius:2px; + border-left:4px solid #f66; + border-top-right-radius:2px; + margin:2em 0; + padding:12px 24px 12px 30px; + position:relative +} +.markdown-section p.tip:before { + background-color:#f66; + border-radius:100%; + color:#fff; + content:"!"; + font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif; + font-size:14px; + font-weight:700; + left:-12px; + line-height:20px; + position:absolute; + height:20px; + width:20px; + text-align:center; + top:14px +} +.markdown-section p.tip code { + background-color:#efefef +} +.markdown-section p.tip em { + color:#34495e +} +.markdown-section p.warn { + background:rgba(66,185,131,.1); + border-radius:2px; + padding:1rem +} +.markdown-section ul.task-list>li { + list-style-type:none +} +body.close .sidebar { + transform:translateX(-300px) +} +body.close .sidebar-toggle { + width:auto +} +body.close .content { + left:0 +} +@media print { + .app-nav, + .github-corner, + .sidebar, + .sidebar-toggle { + display:none + } +} +@media screen and (max-width:768px) { + .github-corner, + .sidebar, + .sidebar-toggle { + position:fixed + } + .app-nav { + margin-top:16px + } + .app-nav li ul { + top:30px + } + main { + height:auto; + min-height:100vh; + overflow-x:hidden + } + .sidebar { + left:-300px; + transition:transform .25s ease-out + } + .content { + left:0; + max-width:100vw; + position:static; + padding-top:20px; + transition:transform .25s ease + } + .app-nav, + .github-corner { + transition:transform .25s ease-out + } + .sidebar-toggle { + background-color:transparent; + width:auto; + padding:30px 30px 10px 10px + } + body.close .sidebar { + transform:translateX(300px) + } + body.close .sidebar-toggle { + background-color:hsla(0,0%,100%,.8); + transition:background-color 1s; + width:284px; + padding:10px + } + body.close .content { + transform:translateX(300px) + } + body.close .app-nav, + body.close .github-corner { + display:none + } + .github-corner:hover .octo-arm { + animation:none + } + .github-corner .octo-arm { + animation:octocat-wave .56s ease-in-out + } +} +@keyframes octocat-wave { + 0%, + to { + transform:rotate(0) + } + 20%, + 60% { + transform:rotate(-25deg) + } + 40%, + 80% { + transform:rotate(10deg) + } +} +section.cover { + position:relative; + align-items:center; + background-position:50%; + background-repeat:no-repeat; + background-size:cover; + min-height:100vh; + width:100%; + display:none +} +section.cover.show { + display:flex +} +section.cover.has-mask .mask { + background-color:#fff; + opacity:.8; + position:absolute; + top:0; + bottom:0; + width:100% +} +section.cover .cover-main { + flex:1; + margin:0 16px; + text-align:center; + position:relative +} +section.cover a { + color:inherit +} +section.cover a, +section.cover a:hover { + text-decoration:none +} +section.cover p { + line-height:1.5rem; + margin:1em 0 +} +section.cover h1 { + color:inherit; + font-size:2.5rem; + font-weight:300; + margin:.625rem 0 2.5rem; + position:relative; + text-align:center +} +section.cover h1 a { + display:block +} +section.cover h1 small { + bottom:-.4375rem; + font-size:1rem; + position:absolute +} +section.cover blockquote { + font-size:1.5rem; + text-align:center +} +section.cover ul { + line-height:1.8; + list-style-type:none; + margin:1em auto; + max-width:500px; + padding:0 +} +section.cover .cover-main>p:last-child a { + border-radius:2rem; + border:1px solid #42b983; + border-color:var(--theme-color,#42b983); + box-sizing:border-box; + color:#42b983; + color:var(--theme-color,#42b983); + display:inline-block; + font-size:1.05rem; + letter-spacing:.1rem; + margin:.5rem 1rem; + padding:.75em 2rem; + text-decoration:none; + transition:all .15s ease +} +section.cover .cover-main>p:last-child a:last-child { + background-color:#42b983; + background-color:var(--theme-color,#42b983); + color:#fff +} +section.cover .cover-main>p:last-child a:last-child:hover { + color:inherit; + opacity:.8 +} +section.cover .cover-main>p:last-child a:hover { + color:inherit +} +section.cover blockquote>p>a { + border-bottom:2px solid #42b983; + border-bottom:2px solid var(--theme-color,#42b983); + transition:color .3s +} +section.cover blockquote>p>a:hover { + color:#42b983; + color:var(--theme-color,#42b983) +} +.sidebar, +body { + background-color:#fff +} +.sidebar { + color:#364149 +} +.sidebar li { + margin:6px 0 +} +.sidebar ul li a { + color:#505d6b; + font-size:14px; + font-weight:400; + overflow:hidden; + text-decoration:none; + text-overflow:ellipsis; + white-space:nowrap +} +.sidebar ul li a:hover { + text-decoration:underline +} +.sidebar ul li ul { + padding:0 +} +.sidebar ul li.active>a { + border-right:2px solid; + color:#42b983; + color:var(--theme-color,#42b983); + font-weight:600 +} +.app-sub-sidebar li:before { + content:"-"; + padding-right:4px; + float:left +} +.markdown-section h1, +.markdown-section h2, +.markdown-section h3, +.markdown-section h4, +.markdown-section strong { + color:#2c3e50; + font-weight:600 +} +.markdown-section a { + color:#42b983; + color:var(--theme-color,#42b983); + font-weight:600 +} +.markdown-section h1 { + font-size:2.5rem; + margin:0 0 1rem +} +.markdown-section h2 { + font-size:1.75rem; + margin:45px 0 .8rem; + border-bottom: 1px solid hsl(206,44%,93%); +} +.markdown-section h3 { + font-size:1.3rem; + margin:40px 0 .6rem +} +.markdown-section h4 { + font-size:1.25rem +} +.markdown-section h5 { + font-size:1rem +} +.markdown-section h6 { + color:#777; + font-size:1rem +} +.markdown-section figure, +.markdown-section p { + margin: 1em 0 +} +.markdown-section ol, +.markdown-section p, +.markdown-section ul { + line-height:1.6rem; + word-spacing:.05rem +} +.markdown-section ol, +.markdown-section ul { + padding-left:1.5rem +} +.markdown-section blockquote { + background: white; + color: black; + border: 1px solid hsl(15,100%,50%); + border-radius: .4rem; + padding: 1rem; + filter: drop-shadow(2px 2px 6px hsla(15,100%,50%,.2)); +} +.markdown-section blockquote p { + font-weight:600; + margin:0 +} +.markdown-section iframe { + margin:1em 0 +} +.markdown-section em { + color:#7f8c8d; +} +.markdown-section code, +.markdown-section output:after, +.markdown-section pre { + font-family:Fira Mono, monospace +} +.markdown-section code, +.markdown-section pre { + /* background-color:#F6FBFF; */ + background-color:#F2F6F9; +} + +.markdown-section a code{ + background-color: #FFEBE5; + font-weight: 300; + color: --theme-color; +} + +.markdown-section a:link{ + text-decoration: none; +} + +.markdown-section a:hover{ + text-decoration: underline; +} + +.markdown-section output, +.markdown-section pre { + margin:1.2em 0; + position:relative +} +.markdown-section output, +.markdown-section pre>code { + border-radius:2px; + display:block +} +.markdown-section output:after, +.markdown-section pre>code { + -moz-osx-font-smoothing:initial; + -webkit-font-smoothing:initial +} +.markdown-section code { + border-radius:2px; + color:#454545; + margin:0 2px; + padding:3px 5px; + white-space:pre-wrap +} +.markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code { + font-size:.8rem +} +.markdown-section pre { + padding:0 1.4rem; + line-height:1.5rem; + overflow:auto; + word-wrap:normal +} +.markdown-section pre>code { + color:#525252; + font-size:.8rem; + padding: 1em 5px; + line-height:inherit; + margin:0 2px; + max-width:inherit; + overflow:inherit; + white-space:inherit +} +.markdown-section output { + padding:1.7rem 1.4rem; + border:1px dotted #ccc +} +.markdown-section output>:first-child { + margin-top:0 +} +.markdown-section output>:last-child { + margin-bottom:0 +} +.markdown-section code:after, +.markdown-section code:before, +.markdown-section output:after, +.markdown-section output:before { + letter-spacing:.05rem +} +.markdown-section output:after, +.markdown-section pre:after { + color:#ccc; + font-size:.6rem; + font-weight:600; + height:15px; + line-height:15px; + padding:5px 10px 0; + position:absolute; + right:0; + text-align:right; + top:0; + content:attr(data-lang) +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color:#8e908c +} +.token.namespace { + opacity:.7 +} +.token.boolean, +.token.number { + color:#c76b29 +} +.token.punctuation { + color:#525252 +} +.token.property { + color:#c08b30 +} +.token.tag { + color:#2973b7 +} +.token.string { + color:#42b983; + color:var(--theme-color,#42b983) +} +.token.selector { + color:#6679cc +} +.token.attr-name { + color:#2973b7 +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.url { + color:#22a2c9 +} +.token.attr-value, +.token.control, +.token.directive, +.token.unit { + color:#42b983; + color:var(--theme-color,#42b983) +} +.token.function, +.token.keyword { + color:#e96900 +} +.token.atrule, +.token.regex, +.token.statement { + color:#22a2c9 +} +.token.placeholder, +.token.variable { + color:#3d8fd1 +} +.token.deleted { + text-decoration:line-through +} +.token.inserted { + border-bottom:1px dotted #202746; + text-decoration:none +} +.token.italic { + font-style:italic +} +.token.bold, +.token.important { + font-weight:700 +} +.token.important { + color:#c94922 +} +.token.entity { + cursor:help +} +code .token { + -moz-osx-font-smoothing:initial; + -webkit-font-smoothing:initial; + min-height:1.5rem; + position:relative; + left:auto +} + + +img[alt="icon_docsify"]{ + width: 50px; +} \ No newline at end of file diff --git a/_media/sk.png b/_media/sk.png new file mode 100644 index 0000000..179fe9b Binary files /dev/null and b/_media/sk.png differ diff --git a/_media/svelte-logo-horizontal.svg b/_media/svelte-logo-horizontal.svg new file mode 100644 index 0000000..0ebb565 --- /dev/null +++ b/_media/svelte-logo-horizontal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/_sidebar.md b/_sidebar.md new file mode 100644 index 0000000..483022c --- /dev/null +++ b/_sidebar.md @@ -0,0 +1,46 @@ +* [Главная](/) + +* Документация + * [Важное замечание](docs/00-introduction.md) + * [Формат компонента](docs/01-component-format.md) + * [Синтаксис шаблонов](docs/02-template-syntax.md) + * [Рантайм](docs/03-run-time.md) + * [Компиляция](docs/04-compile-time.md) + * [Предупреждения a11y](docs/05-accessibility-warnings.md) + +* FAQ + * [FAQ](faq/faq.md) + +* Блог + * [Ускорение развития Svelte](blog/2022-01-13-accelerating-sveltes-development.md) + * [Что нового в Svelte: Январь 2022](blog/2022-01-01-whats-new-in-svelte-january-2022.md) + * [Что нового в Svelte: Декабрь 2021](blog/2021-12-01-whats-new-in-svelte-december-2021.md) + * [Что нового в Svelte: Ноябрь 2021](blog/2021-11-01-whats-new-in-svelte-november-2021.md) + * [Что нового в Svelte: Октябрь 2021](blog/2021-10-01-whats-new-in-svelte-october-2021.md) + * [Что нового в Svelte: Сентябрь 2021](blog/2021-09-01-whats-new-in-svelte-september-2021.md) + * [Что нового в Svelte: Август 2021](blog/2021-08-01-whats-new-in-svelte-august-2021.md) + * [Что нового в Svelte: Июль 2021](blog/2021-07-01-whats-new-in-svelte-july-2021.md) + * [Что нового в Svelte: Июнь 2021](blog/2021-06-01-whats-new-in-svelte-june-2021.md) + * [Что нового в Svelte: Май 2021](blog/2021-05-01-whats-new-in-svelte-may-2021.md) + * [Что нового в Svelte: Апрель 2021](blog/2021-04-01-whats-new-in-svelte-april-2021.md) + * [SvelteKit вышел в бета-версии](blog/2021-03-23-sveltekit-beta.md) + * [Что нового в Svelte: Март 2021](blog/2021-03-01-whats-new-in-svelte-march-2021.md) + * [Что нового в Svelte: Февраль 2021](blog/2021-02-01-whats-new-in-svelte-february-2021.md) + * [Что нового в Svelte: Январь 2021](blog/2021-01-01-whats-new-in-svelte-january-2021.md) + * [Что нового в Svelte: Декабрь 2020](blog/2020-12-01-whats-new-in-svelte-december-2020.md) + * [В чем дело со SvelteKit?](blog/2020-11-05-whats-the-deal-with-sveltekit.md) + * [Что нового в Svelte: Ноябрь 2020](blog/2020-11-01-whats-new-in-svelte-november-2020.md) + * [Что нового в Svelte: Октябрь 2020](blog/2020-10-01-whats-new-in-svelte-october-2020.md) + * [Svelte <3 TypeScript](blog/2020-07-17-svelte-and-typescript.md) + * [Svelte 3: Переосмысление реактивности](blog/2019-04-22-svelte-3-rethinking-reactivity.md) + * [Пишите меньше кода](blog/2019-04-20-write-less-code.md) + * [Svelte для новичков](blog/2019-04-16-svelte-for-new-developers.md) + * [Настройка редактора кода](blog/2019-04-15-setting-up-your-editor.md) + * [Svelte в подкасте The Changelog](blog/2019-01-31-svelte-on-the-changelog.md) + * [Виртуальный DOM — это реально оверхед](blog/2018-12-27-virtual-dom-is-pure-overhead.md) + * [Использование CSS-in-JS в Svelte](blog/2018-12-26-svelte-css-in-js.md) + * [Вышел Svelte v2!](blog/2018-04-18-version-2.md) + * [Sapper: На пути к идеальному фреймворку Web-приложений](blog/2017-12-31-sapper-towards-the-ideal-web-app-framework.md) + * [Дзэн CSS](blog/2017-09-06-the-zen-of-just-writing-css.md) + * [Легкий способ начать использовать Svelte](blog/2017-08-07-the-easiest-way-to-get-started.md) + * [Фреймворки без фреймворка: почему мы не подумали об этом раньше?](blog/2016-11-26-frameworks-without-the-framework.md) diff --git a/blog/2016-11-26-frameworks-without-the-framework.md b/blog/2016-11-26-frameworks-without-the-framework.md new file mode 100644 index 0000000..c19d4f5 --- /dev/null +++ b/blog/2016-11-26-frameworks-without-the-framework.md @@ -0,0 +1,56 @@ +--- +- title: "Фреймворки без фреймворка: почему мы не подумали об этом раньше?" +- description: Вы не можете писать серьезные приложения на ванильном JavaScript. Но компилятор может сделать это за вас. +- author: Rich Harris +- authorURL: https://twitter.com/Rich_Harris +- translator: Alexey Schebelev +--- + +> Этот новый фреймворк работает в *рантайме*? Фи. Спасибо, мне не надо. +> **- фронтендеры 2018 года** + +Мы отправляем слишком много кода нашим пользователям. Как и многие разработчики фронтендеры, я отрицал этот факт, думая, что ничего страшного в лишних 100 КБ JavaScript нет и при загрузке страницы можно просто убрать [один .jpg файлик](https://twitter.com/miketaylr/status/227056824275333120)- ведь в *реальности*, когда ваше приложение уже стало интерактивным, гораздо большее значение имеет производительность. + +Но я ошибался. 100 КБ .js не то же самое, что 100 КБ .jpg. Это не только время загрузки из сети, которое убивает производительность первого запуска вашего приложения, но и время, потраченное на анализ и оценку вашего скрипта, в течение которого браузер перестаёт отвечать на запросы. На мобильных устройствах эти миллисекунды копятся ещё быстрее. + +Если вы не уверены в существовании такой проблемы, почитайте Twitter [Алекса Рассела](https://twitter.com/slightlylate). Алекс [не приобрёл друзей в сообществе фреймворков](https://twitter.com/slightlylate/status/728355959022587905), но он прав. Но предложенный [Polymer](https://www.polymer-project.org/1.0/), в качестве альтернативы Angular, React и Ember ещё не завоевал популярность в мире фронтенда и, конечно,не из-за отсутствия маркетинга. + +Возможно, нам нужно полностью переосмыслить всё это. + + +## Какую *именно* проблему решают фреймворки? + +Общепринятое мнение состоит в том, что фреймворки облегчают управление сложностью вашего кода: фреймворк абстрагирует все скучные детали реализации с помощью таких методов, как, например, нахождение различий в виртуальном DOM. Но это не совсем так. В лучшем случае фреймворки *перемещают сложные штуки* из кода, который вы должны были бы написать, в код, который вы не писали. + +Вместо этого причина, по которой такие идеи, как React, настолько заслуженно популярны, заключается в том, что они облегчают управление сложностью ваших *концептов*. Фреймворки — это прежде всего инструмент для структурирования ваших мыслей, а не кода. + +Таким образом, что, если бы фреймворк *на самом деле не работал в браузере*? Что если бы вместо этого он преобразовывал ваше приложение в чистый ванильный JavaScript, точно так же, как Babel конвертирует ES2016 + в ES5? Вам не нужно тащить здоровенный рантайм, и ваше приложение будет работать очень быстро, потому что между вашим приложением и браузером не будет слоёв абстракции. + + +## Представляем Svelte + +Svelte — это новый фреймворк, который делает именно это. Вы пишете свои компоненты, используя HTML, CSS и JavaScript (плюс несколько дополнительных фишек, которые вы можете [изучить менее чем за 5 минут](https://v2.svelte.dev/guide)), и в процессе сборки Svelte компилирует их в крошечные автономные модули JavaScript. Статически анализируя шаблон компонента, мы можем быть уверены, что браузер будет выполнять необходимый минимум всей работы. + +[Реализация TodoMVC на Svelte](https://svelte-todomvc.surge.sh/) весит 3,6 КБ в сжатом виде. Для сравнения, React + ReactDOM *без кода приложения* весит около 45 КБ в сжатом виде. Для разбора React браузеру требуется примерно в 10 раз больше времени, чем для Svelte, чтобы только запустить интерактивный TodoMVC. + +И когда ваше приложение *уже* запущено и запущено, в соответствии с [js-framework-benchmark](https://github.com/krausest/js-framework-benchmark) **Svelte работает быстро, чёрт возьми**. Это быстрее, чем React. Это быстрее, чем Vue. Это быстрее, чем Angular, или Ember, или Ractive, или Preact, или Riot, или Mithril. В настоящее время он конкурирует с Inferno, который, вероятно, является самым быстрым фреймворком в мире, потому что [Доминик Ганнауэй](https://twitter.com/trueadm) — волшебник. (Svelte медленнее удаляет элементы, но мы над этим [работаем](https://github.com/sveltejs/svelte/issues/26).) + +По сути он такой же быстрый, как ванильный JS, что имеет смысл, потому что это и *есть* ванильный JS, который вам не нужно было писать. + + +## Но это не самое главное + +Конечно, производительность очень важна. Но что действительно впечатляет в этом подходе, так это то, что мы наконец-то можем решить некоторые из самых сложных проблем в веб-разработке. + +Проблемы с совместимостью. Хотите сделать `npm install cool-calendar-widget` и использовать его в своём приложении? Ранее вы могли сделать это только в том случае, если виджет был разработан под уже используемый вами фреймворк — если `cool-calendar-widget` был сделан в React и вы используете Angular, то, конечно, ничего не получится. Но если автор виджета использовал Svelte, приложения, которые его используют, могут быть созданы с использованием любой технологии, которая вам нравится. + +Или [разделение кода](https://twitter.com/samccone/status/797528710085652480). Это отличная идея (загрузить только тот код, который необходим для конкретной страницы), но есть проблема — даже если вы изначально посылаете только один компонент React вместо сотни, *вам всё равно придётся посылать сам React*. С Svelte разделение кода может быть намного более эффективным, потому что структура встроена в компонент, а сам компонент получается крошечный. + +И, наконец, кое-что, с чем я боролся как разработчик ПО с открытым исходным кодом: ваши пользователи всегда хотят, чтобы нужные им функции были в приоритете, и им всё равно, что это будет пустой балласт для других людей, которым эти функции не нужны. Автор фреймворка всегда должен сбалансировать долгосрочную работоспособность проекта с желанием удовлетворить потребности своих пользователей. Это невероятно сложно, потому что трудно предвидеть последствия постепенного раздувания фреймворка, и требуются серьёзные социальные навыки, чтобы сказать людям (которые, возможно, с энтузиазмом проповедовали ваш инструмент до этого момента), что интересующая их функциональность мягко говоря никому не нужна. Но с таким подходом, как в Svelte, любые функции могут быть добавлены абсолютно свободно, без ущерба для людей, которые их не используют, потому что код, реализующий эти функции, просто не генерируется компилятором, если он не требуется. + + +## И это только начало + +Svelte ещё очень молод. Ещё предстоит проделать большую работу — создание интеграций для сборщиков, добавление рендеринга на стороне сервера, горячая перезагрузка, переходы, дополнительная документация и примеры, стартовые наборы и так далее. + +Но вы уже можете создавать крутые компоненты с его помощью, поэтому мы начали сразу со стабильной версии 1.0.0. [Прочитайте руководство](https://v2.svelte.dev/guide), [попробуйте поиграть в REPL](https://v2.svelte.dev/repl) или перейдите на [GitHub](https://github.com/sveltejs/svelte), чтобы помочь начать новую эру разработки UI. diff --git a/blog/2017-08-07-the-easiest-way-to-get-started.md b/blog/2017-08-07-the-easiest-way-to-get-started.md new file mode 100644 index 0000000..649d170 --- /dev/null +++ b/blog/2017-08-07-the-easiest-way-to-get-started.md @@ -0,0 +1,66 @@ +--- +- title: Легкий способ начать использовать Svelte +- description: Это займет всего лишь 1 минуту. +- author: Rich Harris +- authorURL: https://twitter.com/Rich_Harris +- translator: Alexey Schebelev +--- + +Svelte — это [фреймворк нового типа](/blog/frameworks-without-the-framework). Не нужно помещать на страницу тег ` + diff --git a/blog/2019-04-15-setting-up-your-editor.md b/blog/2019-04-15-setting-up-your-editor.md new file mode 100644 index 0000000..68e7e93 --- /dev/null +++ b/blog/2019-04-15-setting-up-your-editor.md @@ -0,0 +1,71 @@ +--- +- title: Настройка редактора кода +- description: Инструкция по конфигурации линтера и подсветки синтаксиса +- author: Rich Harris +- authorURL: https://twitter.com/Rich_Harris +- draft: true +--- + +*__Coming soon__* + + This post will walk you through setting up your editor so that recognises Svelte files: + +* eslint-plugin-svelte3 +* svelte-vscode +* associating .svelte files with HTML in VSCode, Sublime, etc. + +## Atom + +Чтобы файлы `.svelte` воспринимались как HTML, в меню выберите *__Правка → Настройки__* и добавьте следующие две строки в раздел `core`: + +```cson +"*": + core: + … + customFileTypes: + "text.html.basic": [ + "svelte" + ] +``` + +## Vim/Neovim + +Лучше всего установить [расширение coc-svelte](https://github.com/coc-extensions/coc-svelte), которое использует официальный языковой сервер. + +Либо просто укажите редактору подсвечивать все `*.svelte` файлы HTML синтаксисом, добавив следующую строку в файл `init.vim`: + +``` +au! BufNewFile,BufRead *.svelte set ft=html +``` + +Чтобы временно включить подсветку синтаксиса HTML для текущего буфера используйте: + +``` +:set ft=html +``` + +Для того чтобы прописать тип для конкретного файла, используйте [modeline](https://vim.fandom.com/wiki/Modeline_magic): + +``` + +``` + +## Visual Studio Code + +Чтобы файлы `*.svelte` воспринимались как HTML, добавьте следующие строки в файл `settings.json`: + +```cson + "files.associations": { + "*.svelte": "html" + } +``` + +## JetBrains WebStorm + +Для добавления поддержки Svelte в WebStorm (или иную IDE от Jetbrains) следует установит плагин [Svelte Framework Integration](https://plugins.jetbrains.com/plugin/12375-svelte/). Подробнее об использовании плагинов вы можете узнать на [официальном сайте Jetbrains](https://www.jetbrains.com/help/webstorm/managing-plugins.html). + +## Sublime Text 3 + +Откройте любой файл `.svelte`. + +Выберите пункт меню *__View → Syntax → Open all with current extension as... → HTML__*. \ No newline at end of file diff --git a/blog/2019-04-16-svelte-for-new-developers.md b/blog/2019-04-16-svelte-for-new-developers.md new file mode 100644 index 0000000..84b7261 --- /dev/null +++ b/blog/2019-04-16-svelte-for-new-developers.md @@ -0,0 +1,110 @@ +--- +- title: Svelte для новичков +- description: Никогда не использовали Node.js или терминал? Не проблема! +- author: Rich Harris +- authorURL: https://twitter.com/Rich_Harris +--- + +Это краткое руководство предназначено для тех, кто уже прошёл наш [учебник](/tutorial) и горит идеями новых приложений на Svelte, но при этом не имеет большого опыта работы с инструментами сборки Javascript. + +Если встретите что-то непонятное или вам покажется, что какие-то вещи нужно описать подробнее, [напишите нам об этом](https://github.com/sveltejs/svelte/issues) или самостоятельно [отредактируйте эту страницу](https://github.com/sveltejs/svelte/blob/master/site/content/blog/2019-04-16-svelte-for-new-developers.md) — это поможет другим новичкам. + +Если у вас возникнут трудности с прохождением этого руководства, лучшее место для где вы можете спросить совета — это русскоязычный канал в Telegram ([@sveltejs](tg://resolve?domain=sveltejs)). + + +## Начнём с азов + +Вы будете использовать *командную строку*, также известную как терминал. В Windows вы можете открыть терминал запустив приложение **Командная строка** из меню Пуск. В MacOS нажмите вместе на клавиатуре клавиши `Cmd` и `Пробел` для запуска **Spotlight** и введите в строку поиска `Terminal.app`. На большинстве Linux дистрибутивах достаточно нажать вместе `Ctrl-Alt-T` для открытия терминала. + +Командная строка позволяет взаимодействовать с вашим компьютером(или удалённым компьютером, но об этом в другой раз) с гораздо большими возможностями и контролем, чем предоставляет GUI(графический интерфейс пользователя), который ежедневно используют большинство людей. + +Оказавшись в командной строке, вы можете перемещаться по файловой системе, используя команду `ls` (`dir` на Windows) для отображения списка файлов в текущей директории и команду `cd` для перемещения в другую директорию. Например, если в вашей домашней папке есть директория `Development`, то нужно напечатать + +```bash +cd Development +``` + +чтобы войти в нее. Тут вы можете создать директорию для нового проекта командой `mkdir`: + +```bash +mkdir svelte-projects +cd svelte-projects +``` + +Знакомство с обширным списком всех доступных команд в терминале выходит за рамки этого руководства, но запомните еще несколько полезных команд: + +* `cd ..` — перемещает в родителькую директорию +* `cat my-file.txt` — в Mac/Linux (`type my-file.txt` на Windows), отображает содержимое файла `my-file.txt` +* `open .` (или `start .` в Windows) — открывает текущую папку в Finder или Проводнике + + +## Установка Node.js + +[Node](https://nodejs.org/en/) позволяет запускать JavaScript в терминале. Это приложение используется множеством инструментов, включая Svelte. Если оно еще не установлено на вашем компьютере, то проще всего скачать последнюю версию прямо с [сайта Node](https://nodejs.org/en/). + +После установки Node у вас появится три новые команды: + +* `node my-file.js` — запустит выполнение JavaScript в файле `my-file.js` +* `npm [команда]` — [npm](https://www.npmjs.com/) способ установки 'пакетов', от которых зависит ваше приложение, например [svelte](https://www.npmjs.com/package/svelte). +* `npx [команда]` — удобный способ запуска приложений, доступных на npm, без их непосредственной установки на компьютере + + +## Установка редактора кода + +Чтобы писать код, необходим хороший редактор. Наиболее популярный выбор сейчас — это [Visual Studio Code](https://code.visualstudio.com/) или VSCode, что вполне оправдывается его продуманностью, полнофункциональностью и богатством расширений ([в т.ч. для Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode), которое обеспечивает подсветку синтаксиса и проверку ошибок при написании кода компонентов). + + +## Создание проекта + +Мы последуем инструкциям из второй части статьи [Легкий способ начать использовать Svelte](/blog/the-easiest-way-to-get-started). + + + +Сначала, воспользуемся npx для запуска приложения [degit](https://github.com/Rich-Harris/degit), которое умеет копировать шаблоны проектов из репозиториев [GitHub](https://github.com) и других подобных сервисов. Вы можете и не использовать готовый шаблон приложения, но он позволяет не делать первоначальную настройку проекта и экономит ваше время. Для того, чтобы `degit` заработал, на компьютере уже должен быть установлен [Git](https://git-scm.com/) (Позднее, вам скорее всего придется узнать как работать с [Git](https://git-scm.com/), который большинство разработчиков используют для управления своими проектами). + +В командной строке перейдите в директорию, где вы хотите создать новый проект, затем напечатайте следуюшие команды (вы, безусловно, можете скопировать все команды сразу и вставить их в терминал, но лучше вручную напишите каждую строчку, чтобы они отложились в вашей мышечной памяти): + +```bash +npx degit sveltejs/template my-svelte-project +cd my-svelte-project +npm install +``` + + +После этого будет создана новая директория, `my-svelte-project`, произойдёт загрузка в неё файлов шаблона из репозитория [sveltejs/template](https://github.com/sveltejs/template) и установка некоторого количества пакетов из npm. Откройте эту папку в редакторе кода и осмотритесь. 'Исходный код' приложения находится в директории `src`, а ресурсы, которые приложение сможет использовать, в папке `public`. + +В файле `package.json` есть раздел `"scripts"`. Это команды для работы с вашим приложением — `dev`, `build` и `start`. Чтобы запустить приложение в режиме разработки, выполните такую команду: + +```bash +npm run dev +``` + +Вызов скрипта `dev` приведёт к запуску программы, которая называется [Rollup](https://rollupjs.org/guide/en/). Rollup занимается тем, что берёт исходный код вашего приложения (на данный момент у нас есть только `src/main.js` и `src/App.svelte`), передаёт его в другие программы (в нашем случае Svelte) и на выходе собирает в код, который будет выполняться, когда вы откроете своё приложение в браузере. + +Раз мы упомянули браузер, то давайте откроем его и прейдем по адресу http://localhost:5000. Это ваше приложение, которое запущено на локальном *web сервере* на порту номер 5000. + +Попробуйте отредактировать `src/App.svelte` и сохранить его. Приложение перезагрузится и отобразит ваши изменения. + + +## Сборка приложения + +Ранее мы запускали приложение в 'режиме разработчика'. В этом режиме Svelte добавляет дополнительный код, который помогает отлаживать приложение. Кроме того, Rollup не минимизирует итоговый JavaScript код при помощи плагина [Terser](https://terser.org/). + +Когда настанет время поделиться вашим приложением с миром, нужно собрать его как можно более компактным и эффективным. Для этого используйте команду `build`: + +```bash +npm run build +``` + +После этого, в директории `public` уже будет минимизированный файл `bundle.js`, содержащий JavaScript код вашего приложения. Вы можете запустить его командой: + +```bash +npm run start +``` + +Приложение будет запущено по адресу http://localhost:5000. + + +## Дальнейшие шаги + +Для распространения вашего приложения необходимо его где-то разместить. Существует множество вариантов как это сделать — наиболее популярные описаны в файле `README.md`, который вы найдете в папке вашего проекта. diff --git a/blog/2019-04-20-write-less-code.md b/blog/2019-04-20-write-less-code.md new file mode 100644 index 0000000..157cdbd --- /dev/null +++ b/blog/2019-04-20-write-less-code.md @@ -0,0 +1,165 @@ +--- +- title: Пишите меньше кода +- description: Самый важный показатель, на который вы не обращаете внимания +- author: Rich Harris +- authorURL: https://twitter.com/Rich_Harris +- translator: Alexey Schebelev +--- + +В любом коде могут быть баги. Соответственно, число возможных багов в приложении растёт вместе с количеством кода, который вы пишите. + +Очевидно, что, чем больше кода нам приходится писать, тем больше это отнимает времени. Вскоре, его перестёт хватать для таких нужных вещей, как оптимизация, добавление новых возможностей в приложение, ну, или для прогулок на открытом воздухе вместо корпения за ноутбуком. + +На самом деле, широко известно, что, с увеличением кодовой базы приложения, [время разработки проекта](https://blog.codinghorror.com/diseconomies-of-scale-and-lines-of-code/) и [количество багов](https://www.mayerdan.com/ruby/2012/11/11/bugs-per-line-of-code-ratio) растут даже не с линейной, а с *квадратичной* зависимостью. Этим можно объяснить наше подсознательное поведение, когда пулл-реквесту на 10 строк мы с лёгкостью уделим такой уровень внимания, который редко достаётся коду размером более 100 строк. А как только код становится слишком длинным, и перестаёт помещаться на одном экране, когнитивные усилия, необходимые для его понимания, значительно возрастают. Мы пытаемся исправить ситуацию путём рефакторинга и добавлением комментариев — действия, которые почти наверняка приводят к ещё *бо́льшему количеству* кода. Это порочный круг. + +Мы все немного одержимы, верно? Мы следим за производительностью приложения, размером бандла и всего прочего, что мы можем хоть как-то измерить, но мы редко обращаем внимание на объём кода, который пишем. + + +## Читаемость кода — это важно + +Само собой, я не утверждаю, что мы должны использовать любые хитрые уловки, чтобы сделать наш код максимально компактным в ущерб читабельности. Также я не утверждаю, что уменьшение *строк* кода — это самоцель, так как это может способствовать превращению нормального читаемого кода, вроде этого... + +```js +for (let i = 0; i <= 100; i += 1) { + if (i % 2 === 0) { + console.log(`${i} — чётное`); + } +} +``` + +...во что-то неудобоваримое: + +```js +for (let i = 0; i <= 100; i += 1) if (i % 2 === 0) console.log(`${i} — чётное`); +``` + +Я просто хочу убедить вас, что лучше отдавать предпочтение языкам и шаблонам, которые позволяют нам писать меньше кода естественным образом. + +## Да, я говорю о Svelte + +Сокращение объёма кода, который нужно писать, является очевидным преимуществом Svelte. Чтобы проиллюстрировать это, давайте посмотрим на очень простой компонент, реализованный на React, Vue и Svelte. Сначала, версия Svelte: + +
+ +
+ +Как мы сделаем то же самое в React? Скорее всего, это будет выглядеть примерно так: + +```js +import React, { useState } from 'react'; + +export default () => { + const [a, setA] = useState(1); + const [b, setB] = useState(2); + + function handleChangeA(event) { + setA(+event.target.value); + } + + function handleChangeB(event) { + setB(+event.target.value); + } + + return ( +
+ + + +

{a} + {b} = {a + b}

+
+ ); +}; +``` + +И, наконец, в Vue: + +```html + + + +``` + + + +Иначе говоря, требуется 442 символа в React и 263 символа в Vue, чтобы достичь чего-то, что в Svelte занимает 145 символов. Версия React буквально в три раза больше! + +Такая *сильная* разница скорее исключение — из моего опыта, компонент React обычно примерно на 40% больше, чем его эквивалент на Svelte. Давайте теперь взглянем на особенности Svelte, которые позволяют компактнее излагать наши идеи. + + +### Элементы верхнего уровня + +В Svelte компонент может иметь столько элементов верхнего уровня, сколько вам нужно. В React и Vue компонент обязан иметь единственный элемент верхнего уровня — в случае React попытка вернуть два элемента верхнего уровня из функции компонента приведет к синтаксической ошибке. Вы можете использовать фрагмент — `<>` — вместо `
`, но дополнительный уровень вложенности никуда не денется. + +В Vue разметка должна быть размещена внутри элемента `