SapperはSvelteの上にあるフレームワークです。サーバーのレンダリング、リンクのプリロード、およびサービスワーカーを作成する機能を備えたボックスからの速度に焦点を当てます。 SVELTEと組み合わせると、最終的な結果は高度にカスタマイズ可能で、フットプリントが小さい雷速いサイトです。
このチュートリアルでは、Svelteコンポーネントを使用して軽量ブログサイトを構築するためにSapperを使用します(私たちの
ブログを起動する方法
ブログ上のいくつかの少ない技術的なヒントのための投稿)。 Svelteは違いを持つフレームワークです。コンパイル時にコードを分析し、Vanilla JavaScriptに一連のモジュールを作成します。これにより、ランタイムの必要性が回避されます。レイアウトのさらなるヘルプが必要な場合は、完璧なものを手に入れる方法についての投稿をチェックしてください。
ウェブサイトのレイアウト
。または他のオプションについては、これらのトップを参照してください
ウェブサイトのビルダー
そして覚えておいて、あなたはまたあなたを得る必要があります
ウェブホスティング
ポイント上のサービス。
ここでFileSiloでチュートリアルファイルをダウンロードしてください
まず、依存関係をダウンロードしてインストールする必要があります。それはSvelteに働くように依存し、サーバーを構築するための別のフレームワークが必要ですが、残りは構築されているアプリケーションによって異なります。この場合、後でマークダウンファイルを抽出するのに役立つパッケージが必要です。
チュートリアルファイル(上)をダウンロードし、コマンドラインでそれらを見つけて依存関係をインストールします。
> npm install
Sapperは、クライアント側のフレームワークとそのフレームワークのサーバー側のレンダリングの2つの部分に構築されています。これは、より遅いネットワーク上のそれらのためにその余分な速度を後押しするのに役立ちます。それはノードを使用して構築されています。
server.jsを開き、Expressでサーバーを作成します。彼らの勧告を使って、我々は含みます 圧縮 送信するファイルを縮小するには シルフ 静的ファイルを提供する。
Express()
。使用する(
圧縮({しきい値:0})、
SIRV( "static"、{dev})、
sapper.middleware()
)
.Listen(ポート);
クライアント側では、Sapperにアプリケーションをマウントするために伝える必要があります。これはReact Dom'sに似ています 寝る またはVUEの $マウント 方法client.jsの内側に、Sapperを起動してrootにマウントします < div> 素子。その要素はテンプレートファイルに含まれています。
「@ Sapper / App」からSapperとしてインポート*をインポートします。
sapper.start({
ターゲット:Document.GetElementByID(
"ルート")
;);
基本的なサーバーとクライアントファイルが設定されていると、開発サーバーを起動できます。これにより、サーバー、クライアントおよびサービスワーカーファイルのビルドを開始し、デフォルトでポート3000で起動します。ファイルが変更されるたびに、変更されたアプリケーションの一部を再構築します。
コマンドラインでサーバーを実行します。サイトを開発しながらこのウィンドウを開いたままにしてください。
&gt。 NPM RUN DEV
"routes"ディレクトリ内の内部には、アプリケーションのルートが表示されます。のファイル
js.
拡張機能は、呼ばれるサーバールートになります。これらのルートにはUIがありませんが、代わりにアプリケーションによってデータを取得するように要求されます。私たちの場合は、ブログ投稿をロードするためにそれらを使用します。
the routes / blog / index.json.js. ファイルを作成します /blog.json. サーバー上のエンドポイント。ブログ投稿をインポートし、それらからいくつかのJSONを作成します。
「./_posts.js」から投稿をインポートします。
const contents = json.stringify(
Posts.map(ポスト=>({
著者:Post.Author、
画像:Post.image、
タイトル:
スラッグ:Post.Slug
))))
);
HTTPメソッドに対応するエクスポート関数をサーバールーティングします。たとえば、GETリクエストに応答するには、呼び出された関数をエクスポートします。 取得する サーバールートファイルから。 Aを作成する 取得する 前の手順で収集したデータでJSON形式のデータで応答する関数。開いた http:// localhost:3000 / blog.json. ブラウザで投稿をチェックしていることを確認してください。
エクスポート関数Get(Req、Res){
res.writehead(200、{
"content-type": "application / json"
});)
res.end(内容);
Sapperのページは通常のSvelteコンポーネントです。各コンポーネントはAの単一のファイルです .svelte. 拡張子、管理するためのすべてのロジックとスタイリングを含みます。このコンポーネントを実行する必要があるJavaScriptは任意のJavaScriptに住みます。 <スクリプト> タグ - 任意のHTMLページと同じように。
内部
ルート/ index.svelte.
このページを構築するために使用できる他のSvelteコンポーネントをいくつかインポートします。輸出
投稿
私たちが後で埋める変数。
<スクリプト&gt。
からコンテナを輸入する
"../components/container.svelte";
から出荷後の輸入
"../components/postsummary.svelte";
エクスポートして投稿しましょう。
&script>
ページが設定されているので、ブログ投稿を入手し始めることができます(あなたはそれらの上に取り戻したいかもしれません クラウドストレージ )。ページがロードされるとすぐにこれを行う必要があります。サーバーがこれに注意してからこのデータを要求するために、ページをレンダリングしたときにこのデータを要求する場合は、別のものに入る必要があります。 < script context = "Module"&Gt。 鬼ごっこ。
サーバー上で、SapperはAを探します
prel
ファンクション、ページを表示する前に完了するのを待ちます。ここでは、私たちはに携帯しています
投稿
前のステップからの変数。
script context = "モジュール">
export async関数preload(){
const res = await.
this.fetch( "blog.json");
const data = asit.json();
戻る{投稿:データ};
}
&script>
SVELTEでは、変数はデフォルトで反応します。つまり、更新されると、当社のコンポーネントも更新されることを意味します。のように 投稿 変数は今すぐブログ投稿の配列を保持しています。これらをループして表示することができます。
ANを使ってこれを行うことができます #各 ブロック。これらはアレイ内の各項目の角かっこの内側にあるものを繰り返します。コンポーネントの下部にあるタグの外側に、POSTを表示するためにHTMLを追加します。
<コンテナ&GT;
&lt; ul&gt;
{#eachの投稿としての投稿}
&lt; li&gt;
&lt; PostSummary {... POST} / gt;
&lt; li&gt;
{/各}
&lt; / ul&gt;
&lt; /コンテナ&gt;
コンポーネントを使用して、繰り返しロジックを含めて、必要なところでそれらを使用します - スタイルが含まれています。 the &lt;コンテナ&gt。 コンポーネントは現在何もしませんが、内部のコンテンツに最大の幅を付けるために使用できます。
open コンポーネント/ container.svelte そしてAの中にいくつかのスタイルを追加します &lt;スタイル&gt; 鬼ごっこ。コンポーネント内に適用されるスタイルは、そのコンポーネントにスコープされています。つまり、一般セレクタを使用できます。
&lt;スタイル&gt;
div {
マージン:0自動車;
パディング:0 1リム;
最大幅:50リム;
}
&lt; /スタイル&gt;
コンポーネントが他のコンポーネントへの親になるように設計されている場合は、それらのコンポーネントを通過させる方法が必要です。 the &lt;スロット&gt; 要素はそれだけであり、コンポーネントのマークアップの中で理にかなっている場所に配置することができます。
withう &lt;コンテナ&gt。 、私たちはスタイルの内容を包んでいます &lt; div&gt; 。使用する &lt;スロット&gt; 内側に &lt; div&gt; 他のすべてを通り抜けるために。
DIV&GT。
&lt;スロット/ gt;
&lt; / div&gt;
すべてのコンポーネントがデータを取得しようとしているわけではありません。メインページコンポーネントから投稿をロードしているので、属性を介してレンダリングするコンポーネントに渡すことができます。
開いた コンポーネント/ PostSummary.Svelte. ファイルの上部にある属性をいくつか定義します。これらは、ステップ09で追加したスプレッドオペレータによって埋められています。
&lt;スクリプト&gt。
エクスポートされた作者。
エクスポートします。
エクスポートさせましょう。
エクスポートされたタイトル
&script&gt;
属性が入力されると、その後、他の変数のようにアクセスされます。 POST要約の各部分に別々の属性を持つことで、マークアップを読みやすくします。
コンポーネントの下部にあるHTMLを追加して要約を作成します。クラスは事前定義されたスタイルに関連しています。
&lt; gt。
&lt; divクラス= "画像の画像" style = "
背景画像:URL({image}) "/ gt;
{title}
Next.jsなどの類似のフレームワークとは異なり、Sapperは通常のアンカーリンクで動作します。ビルド時には、内部リンクを検出し、また独自の最適化を行うことができます。
リンク内でラップすることで、前の手順からマークアップを更新します。スラグ化されたURLを作成するためにテンプレート文字列を作成する必要はありません。
rel = "プリフェッチ" href = "/ blog / {slug}"&gt;
&lt; gt; ...&lt;
&lt; / A&GT;
SapperはURLパラメータに基づいてページを作成することができます。私たちの場合は、リンクします /ブログ/スラグ、 これは、それがコンポーネントをレンダリングすることを意味します /routes/blog/[slug].svelte. 。
そのコンポーネントの内側に、インデックスページのようにブログデータを取得します。 the パラメータ オブジェクトにはURLからのパラメータが含まれています。この場合はスラグです。
script context = "モジュール"&gt;
Async関数を輸出します
preload({params}){
const res = this.fetch(
`blog / $ {params.slug} .json`);
const data = asit.json();
}
&script&gt;
インデックスページとは異なり、URLにブログ投稿がない可能性があります。その場合はエラーが表示されます。に加えて フェッチ 、 prel 方法も含まれます エラー 代わりにエラーページへの応答を変更します。
PRELOADメソッドの最後に、POSTが見つからない場合はエラーが表示されます。それ以外の場合は、を設定してください 役職 ページの変数。
if(res.status === 200){
戻る{post:data};
} そうしないと {
this.Error(res.status、
data.message);
データを取得した状態で、ページ上の投稿を表示できるようになりました。 PostSumaryコンポーネントと同様に、ポストのコンテンツの各部分をカーリーブラケット内に表示します。コンポーネントの下部にあるページに表示するマークアップをいくつか追加します。
{post.title}
&lt; divクラス= "BYLINE"&GT;によって
{post.author.name}&lt; / div&gt;
&lt; / div&gt;
&lt; img class = "Post-image" src = {post.image} alt = "" / gt;
{post.html}
&lt; /コンテナ&gt;
&lt; / gt;
今ページを見て、すべてが実際の投稿コンテンツから正しく表示されます。マークダウン変換はHTMLを生成しますが、ポスト自体にテキストとして印刷されているのがわかります。 Sapperには、この場合は組み込まれているHTMLパーサーがあります。配置する @html. その前にこのパーサを使います。
{@ html post.html}
私たちのブログは正しく機能しますが、それを終えるために必要ないくつかの変更があります。その一つは更新することです &lt;&gt; ページ上に表示されているタブを再配置します。
SvelteはAをサポートします &lt; Svelte:ヘッド&gt; その中に何かを注入する要素 &lt;頭&gt; ページのこれを使用してPOSTのタイトルを設定する &lt;&gt; 。
Svelte:ヘッド&gt;
&lt; title&gt; {post.title} |
Sapperブログ&lt; / title&gt;
&lt; / svelte:ヘッド&gt;
ページの残りのページのHTMLを刻印するために、すべてのページがテンプレートを通過します。これが、フォントインポートやメタタグなどの設定が入力される場所です。 template.htmlを開き、の内容のフックに追加します。 &lt; Svelte:ヘッド&gt; 前のステップからの要素閉会の直前にこれを追加してください &lt; / gt; 鬼ごっこ。
&lt;ヘッド&GT。
[...]%sapper.head%
&lt; / head&gt。追加する必要がある最後のことはブログのレイアウトです。コンポーネント内の各ページをラップする代わりに、Sapperはこのジョブを実行するための "_layout.svelte"ファイルを探します。
_layout.svelteの内側に、<&lt; header&gt;コンポーネントとすべてのページの上部に表示されます。それはホームページに便利なリンクを提供します。
追加する必要がある最終的なことはブログのレイアウトです。コンポーネント内の各ページを折り返す代わりに、Sapperは _layout.svelte. 私たちのためにこの仕事をするためのファイル。内部 _layout.svelte. &lt;ヘッダー&gtをインポートします。コンポーネントとすべてのページの上部に表示されます。ホームページに便利なリンクを提供します。
&lt;スクリプト&gt。
からヘッダーをインポートします
"../components/header.svelte";
&lt;&script&gt。
&lt; main&gt;
&lt;ヘッダ/ gt;
&lt;スロット/ gt;
&lt; / main&gt;
このコンテンツはもともとWeb Designerに登場しました。
現代のサイトは、JavaScriptの全てを単一の、大きく組み合わせることがよくあります main.js...
決定、決定、決定...タイプを操作するプロセスに1つの重要な側面がある場合は、デザイナまたはタイポグラフィチャが最終的なデザインとレ�..