ビルドなしの開発( 2 ) : ES devサーバ
12163 ワード
ビルドせずに開発する
この記事はビルドなしで開発するシリーズの一部です.
es-dev-server
, そしてそれはどのようにビルドせずに開発することができます.ESサーバ
es-dev-server ビルドステップなしで開発するときに開発者の生産性に焦点を合わせる、構成可能なWebサーバーです.オプションを使用すると、キャッシュのような余分な機能、ファイルの変更、スパルーティングのリロード、古いモジュールのインポートと互換性モードの古いブラウザーをサポートする解決することができます.
セットアップ
空のNPMプロジェクトを作成し、インストールする
es-dev-server
:npm init
npm i -D es-dev-server
クリエイトアindex.html
プロジェクトのルートで<!DOCTYPE html>
<html>
<head></head>
<body>
<div id="app"></div>
<script type="module" src="./src/app.js"></script>
</body>
</html>
ダミーを作成するsrc/app.js
ファイルconsole.log('hello world');
我々は今、アプリケーションを実行することができますes-dev-server
:npx es-dev-server --open
余分なフラグなしでes-dev-server
通常の静的ファイルサーバのように動作します.余分な機能を明示的に有効にする必要があります.輸入
ビルドツールなしで開発するときに最初に実行されることの一つは、以下のような裸のモジュールインポートを扱う方法です.
import foo from 'foo';
ボックスから、これらの種類のインポートを処理する方法がわからないので、ブラウザはエラーをスローします.我々はインポートマップを使用して、これらのインポートを使用する方法を検討し、今後のブラウザAPI.インポートマップが適切にブラウザでサポートされるまでは、
--node-resolve
devサーバのフラグ.これは、ブラウザにそれらを提供する前にnodejsモジュールの解像度を使用してモジュール内のインポートを書き換えるでしょう.どのように動作するかを確認するには
lit-html
, HTMLテンプレートライブラリnpm i -D lit-html
チェンジsrc/app.js
インポートするimport { render, html } from 'lit-html';
const template = html`<p>Hello world!</p>`;
render(template, document.getElementById('app'));
では、ノード解決フラグを追加してサーバーを再起動しましょう.npx es-dev-server --node-resolve --open
ネットワークタブを検査すると、モジュールが期待通りに正しく表示されます.src/app.js
に書き換える.import { render, html } from './node_modules/lit-html/lit-html.js';
const template = html`<p>Hello world!</p>`;
render(template, document.getElementById('app'));
ウォッチモード
あなたがファイルを編集している間、大きな生産性ブースターはブラウザーを再読み込みしています.
このオプションを有効にするには、
watch
フラグ:npx es-dev-server --watch --node-resolve --open
今、提供されたファイルの1つの中の何かを変えてくださいapp.js
. ブラウザが更新されたコードで自動的に再読み込みされます.リロードは
EventSource
APIとIE 11ではサポートされていません.devサーバは小さなスクリプトを注入します.キャッシング
es-dev-server
ファイルシステムの最後の修正されたタイムスタンプを使ってファイルが変更されなかった場合は304を返す.これはかなりリロードを高速化します.オフにすることで、ブラウザでこれをテストすることができますDisable cache
さわやかフォルダ構造
すべてのプロジェクトがシングルであるというわけではありません
index.html
プロジェクトのルートで.だってes-dev-server
通常のWebサーバーと同じように、任意のフォルダからファイルを提供することができます.例えば、新しいフォルダを作成しましょう
demo
, そして、我々を動かしてくださいindex.html
インサイド.この変更を反映するために、スクリプトsrc pathを調整する必要があります.
<script type="module" src="../src/app.js"></script>
そして、サーバーにデモフォルダ内で開くように指示する必要があります.npx es-dev-server --node-resolve --open /demo/
アプリケーションを変更せずに表示する必要があります.ルートディレクトリの変更
Webサーバーのルートディレクトリを変更したくなるかもしれません
/demo/
URLの一部:npx es-dev-server --root-dir /demo/ --open
しかし、これは動作しません.なぜなら、Webサーバはルートディレクトリ内のファイルしか提供できないからです.デフォルトでは、現在の作業ディレクトリです.私たちの場合、Webサーバはsrc
フォルダだけでなく、node_modules
フォルダ.これはパッケージサブディレクトリからファイルを提供したいときにmonorepoで動作するときに一般的な問題です.サーブする必要があるモジュールの多くは、プロジェクトのルートにあるので、ルートディレクトリを2つのレベルに移動する必要があります.
npx es-dev-server --root-dir ../../ --open packages/my-package/index.html
スパルーティング
あなたが1つのページ・アプリケーションを構築しているならば、あなたは何らかの形のフロントエンドルーティングをしていそうです.Deeplinkingまたはリフレッシュを有効にするには、Webサーバーを返す必要があります
index.html
より深いパスこれは時々歴史APIフォールバックと呼ばれます.ルータを設定するのはこの記事の範囲を超えていますが、オプションは
--app-index
フラグ:npx es-dev-server --node-resolve --app-index index.html --open
使用する場合--app-index
フラグは、サーバーが自動的にあなたのアプリケーションのインデックスには、明示的なパスを渡さない場合はサーバーを開きます--open
.古いブラウザとの互換性
我々は開発のための主要なブラウザの最新バージョンを使用することができますが、我々はまだ生産の古いブラウザをサポートする必要があります.また、すべての主要ブラウザの最新バージョンではまだサポートされていないいくつかの新しいブラウザ機能を使用することがあります.
我々が我々のアプリをこれらのブラウザーのうちの1つに走らせるたびに、生産構築を走らなければならないならば、それは恥です.
es-dev-server
これを支援する複数の互換モードをサポートします.互換モードが有効になっている場合、サーバーは古いブラウザーに必要なポリフィルとコード変換を処理します.これは、ビルドツール領域に私たちを連れて行くので、私たちはもはや純粋に“ビルドせずに開発ツール”です.私はブラウザの互換性のためだけに使用しているので、それは素晴らしいと思う.あなたは明示的にこの行動を選ぶ必要があります.
どのように動作するかを見てみましょう.動的インポートを追加
app.js
ボタンをクリックするとモジュールが遅延します.import { html, render } from 'lit-html';
async function lazyLoad() {
await import('lit-html/directives/until.js');
}
const template = html`
<button @click=${lazyLoad}>Click me!</button>
`;
render(template, document.getElementById('app'));
動的インポートは本当に何も機能しません.我々がクロム、サファリとFirefoxでこれを走らせるならば、それはちょうどうまくいきます.EDGEがまだ動的なインポートをサポートしていないため、このコードを実行できません.我々は、最も軽い互換性モードをオンにすることができます.
esm
, この場合はnpx es-dev-server --node-resolve --compatibility esm --open
With esm
有効es-dev-server
注射するes-module-shims ローダスクリプトをインデックスに追加します.このコードを変更する必要はありません.注入されたスクリプトをインデックスファイルに表示できます.他の互換モードがより多くのポリフィルを加えるかもしれないので、若干の余分のボイラー板があります.ポリフィルは、ブラウザで積極的にキャッシュできるようにハッシュされます.
その他
esm
があるmodern
and all
互換モード.これらのモードは、一般的なブラウザAPIと使用のためのポリフィルを注入する@babel/preset-env
最新のJavaScript構文を互換性のある形式に変換するには.イン
modern
互換性モードのコードは、クロム、サファリ、Firefoxの最新バージョンの2つのバージョンとの互換性が作られ、エッジ.イン
all
互換性モードのサポートは以前のブラウザ、IE 11へのすべての方法に拡張されます.ESモジュールをサポートしていないブラウザでは、systemjs modules .変換はサーバーを少し遅くするので、私は
modern
or all
通常の開発中のモード.別のスクリプトを作成することができますpackage.json
, と互換性モードでは、以前のブラウザでアプリケーションを表示するときのみ実行します.esm
modeにはパフォーマンスに対して無視できる効果があります.インポートマップ
前の記事では、裸のモジュール輸入を扱う今後のブラウザ機能として、インポートマップを簡潔に議論しました.
es-module-shims
and systemjs
両方のインポートマップをサポートします.互換モードが有効になっている場合、devサーバはインポートマップをこれらのライブラリで動作させるようにし、開発中に実行可能なワークフローを実行します.インポートマップAPIはまだ完全に安定していないので、もしあなたがこのパスを降りているなら、それはこの標準がどのように進化するかを保つために良いです.インポートマップを使用してワークフロー.
より多くのオプション
Check out the official documentation その他のオプションについては、devサーバーを他のツールとライブラリとして統合し、カスタムミドルウェアをインストールします.
始める
あなたのためにdevサーバをセットアップするプロジェクトから始めるために、使用してください
open-wc
プロジェクトの足場npm init @open-wc
プロジェクトをセットアップするlit-element
, Webコンポーネントライブラリ.これをあなたが選んだどんなライブラリのためにでも交換することができます、セットアップはウェブ構成要素に特有でありません.Reference
この問題について(ビルドなしの開発( 2 ) : ES devサーバ), 我々は、より多くの情報をここで見つけました https://dev.to/open-wc/developing-without-a-build-2-es-dev-server-1cf5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol