パヌセルの孊習-小芏暡プロゞェクト向けのWebパックの代替





良い䞀日、友達



WebpackやParcelなどのモゞュヌルビルダヌたたはバンドラヌの䞻な目的は、アプリケヌションの実行に必芁なすべおのモゞュヌルが、むンデックスに含たれる1぀の瞮小本番ビルド甚スクリプトに正しい順序で含たれるようにするこずです。 html。



実際、ビルダヌは、原則ずしお、JSだけでなく、HTML、CSSファむルも最適化でき、Less、SassをCSSに、TypeScript、React and VueJSXをJavaScriptに倉換し、画像、オヌディオ、ビデオなどを操䜜できたす。デヌタ圢匏、および次のような远加機胜も提䟛したす:(䜿甚枈みリ゜ヌスたたは゜ヌスのマップ゜ヌスマップの䜜成、バンドル党䜓ずその個々の郚分モゞュヌル、ラむブラリのサむズの芖芚的衚珟、コヌドを郚分チャンクに分割する以䞋を含む数、再利甚目的たずえば、耇数のモゞュヌルで䜿甚されるラむブラリが別々のファむルに取り出されお1回だけロヌドされる、npmからのパッケヌゞのスマヌトロヌドたずえば、moment.jsからロシアのロヌカリれヌションのみをロヌドする、特定のタスクを解決するためのあらゆる皮類のプラグむン等



この点で、Webpackが間違いなくリヌドしおいたす。しかし、この優れたツヌルによっお提䟛される機胜のほずんどが必芁ずされないプロゞェクトを開発しおいる堎合はどうなるでしょうか。習埗ず䜿甚が簡単なこのテクノロゞヌの代替手段はありたすか私にずっお、この質問に察する答えはパヌセルでした。ちなみに、Webpackに぀いお知りたい方は、こちらの動画をご芧になるこずをお勧めしたす。このチュヌトリアルのWebpack蚭定を含む私のファむルはここにありたす。



















あなたの蚱可を埗お、特にロシア語で利甚できるので、私は自分の蚀葉でドキュメントを再話したせんが、実甚的なコンポヌネントに焊点を圓おたすテンプレヌト文字列ず動的むンポヌトを䜿甚しお、JavaScriptで3ペヌゞで構成されるSPAを䜜成したす。 CSSでアプリケヌションのスタむルを蚭定し、TypeScriptで簡単な関数を蚘述し、それをアプリケヌションにむンポヌトし、Sassを䜿甚しおこの関数の結果のコンテナヌのスタむルを蚭定し、開発モヌドず本番モヌドの䞡方でParcelを䜿甚しおアプリケヌションを構築したす。



プロゞェクトコヌドはこちらです。



興味のある方はフォロヌしおください。



応甚



準備はいいですかそれでは行きたしょう。



parcel-tutorialディレクトリを䜜成したす。



そこに入り、を䜿甚しおプロゞェクトを初期化しnpm init -yたす。



index.htmlファむルを䜜成したす。暙準のブヌトストラップカバヌテンプレヌトの1぀を䜿甚したす。



<head>
    ...
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>

<!-- Bootstrap class -->
<body class="text-center">

    <! -- Main script -->
    <script src="index.js"></script>
</body>


Bootstrap の公匏Webサむトにアクセスし、[䟋]セクションに移動しお、カスタムコンポヌネントのカバヌを芋぀け、Ctrl + UCmd + Uを抌しおペヌゞコヌドを衚瀺したす。











srcディレクトリを䜜成するず、その䞭にjsずcssの2぀のフォルダがありたす。



jsディレクトリに次のファむルを䜜成したすheader.js、footer.js、home.js、projects.js、contact.js。これらはモゞュヌル、たたは必芁に応じお、アプリケヌションのコンポヌネントです。ヘッダヌ、フッタヌ、メむンペヌゞおよびその他のペヌゞのコンテンツです。



cssディレクトリに、style.cssファむルを䜜成したす。



珟時点では、プロゞェクトの構造は次のようになっおいたす。



-- parcel-tutorial
    -- src
        -- css
            -- style.css
        -- js
            -- contact.js
            -- footer.js
            -- header.js
            -- home.js
            -- projects.js
    -- index.html
    -- index.js
    -- package.json


ブヌトストラップに戻る。



小さな倉曎を加えお、ペヌゞコヌドを察応するモゞュヌルにコピヌしお貌り付けたす。



header.js



export default `
  <header class="masthead mb-auto">
      <div class="inner">
          <h3 class="masthead-brand">Parcel Tutorial</h3>
          <nav class="nav nav-masthead justify-content-center">
            <a class="nav-link active" name="home">Home</a>
            <a class="nav-link" name="projects">Projects</a>
            <a class="nav-link" name="contact">Contact</a>
        </nav>
      </div>
  </header>
`.trim()


リンクのhrefをnameに倉曎したこずに泚意しおください。



footer.js



export default `
  <footer class="mastfoot mt-auto">
    <div class="inner">
      <p>© 2020. All rights reserved.</p>
    </div>
  </footer>
`.trim()


home.js



export default `
  <h1 class="cover-heading">Home page</h1>
  <p class="lead">Home page content</p>
`.trim()


projects.js



export default `
  <h1 class="cover-heading">Projects page</h1>
  <p class="lead">Projects page content</p>
`.trim()


contact.js



export default `
  <h1 class="cover-heading">Contact page</h1>
  <p class="lead">Contact page content</p>
`.trim()


style.cssからstyle.cssにスタむルをコピヌするこずを忘れないでください。



index.jsを開きたす。



ヘッダヌ、フッタヌ、スタむルをむンポヌトしたしょう。



import header from './src/js/header.js'
import footer from './src/js/footer.js'
import './src/css/style.css'


リンクをクリックするず、メむンペヌゞず他のペヌゞのコンテンツが動的に読み蟌たれるため、次のようなオブゞェクトを䜜成したす。



const pages = {
    home: import('./src/js/home.js'),
    projects: import('./src/js/projects.js'),
    contact: import('./src/js/contact.js')
}


このオブゞェクトのプロパティの名前は、察応するナヌザヌが芁求したペヌゞです。



以前にむンポヌトしたヘッダヌおよびフッタヌコンポヌネントを䜿甚しお、スタヌトペヌゞを生成したす。



// Bootstrap classes
document.body.innerHTML = `
<div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column">
    ${header}
    <main role="main" class="inner cover"></main>
    ${footer}
</div>
`.trim()


ペヌゞのコンテンツはメむン芁玠に衚瀺されるため、次のように定矩したす。



const mainEl = document.querySelector('main')


ペヌゞレンダリング関数を䜜成したす。



const renderPage = async name => {
    const template = await pages[name]
    mainEl.innerHTML = template.default
}


察応するモゞュヌルがロヌドされるのを埅぀必芁があるため、async / awaitを䜿甚したすawaitキヌワヌドは関数の実行を䞀時停止したす。この関数は、芁求されたペヌゞの名前nameを受け取り、それを䜿甚しお、pagesオブゞェクトpages [name]の察応するプロパティにアクセスしたす。次に、結果のテンプレヌトをmainElに挿入したす。実際、awaitは、テンプレヌトを含むModuleオブゞェクトを返したす。したがっお、mainElにマヌクアップずしおテンプレヌトを挿入するずきは、Moduleオブゞェクトのデフォルトプロパティを参照する必芁がありたすモゞュヌルはデフォルトで゚クスポヌトされたす。そうしないず、゚ラヌが発生したす。オブゞェクトをHTMLに倉換できたせん。



メむンペヌゞをレンダリングしたす。



renderPage('home')


珟圚のペヌゞに察応するアクティブリンクには、アクティブクラスがありたす。新しいペヌゞをレンダリングするずきにクラスを切り替える必芁がありたす。ヘルパヌ関数を実装したしょう



const toggleClass = (activeLink, currentLink) => {
    if (activeLink === currentLink) {
        return;
    } else {
        activeLink.classList.remove('active')
        currentLink.classList.add('active')
    }
}


この関数は、クラスがアクティブなリンクactiveLinkずクリックされたリンクcurrentLinkの2぀の匕数を取りたす。指定されたリンクが䞀臎する堎合、䜕もしたせん。それ以倖の堎合は、クラスを倉曎したす。



最埌に、リンククリックハンドラヌを远加する必芁がありたす。もう1぀のヘルパヌ関数を実装したしょう



const initClickHandlers = () => {
    const navEl = document.querySelector('nav')

    navEl.addEventListener('click', ev => {
        if (ev.target.tagName === 'A') {
            const activeLink = navEl.querySelector('.active')
            const currentLink = ev.target
            toggleClass(activeLink, currentLink)
            renderPage(currentLink.name)
        }
    })
}


この関数では、最初にnav芁玠を芋぀けたす。次に、委任を通じお、リンクのクリックを凊理したす。タヌゲット芁玠がAタグの堎合、アクティブリンクアクティブクラスずのリンク、珟圚のリンククリックされたリンクを取埗し、クラスを倉曎しおペヌゞをレンダリングしたす。珟圚のリンクのname属性の倀は、renderPage匕数ずしお枡されたす。



アプリはほが完成です。ただし、Parcelを䜿甚しおプロゞェクトを構築する前に、次の点に泚意する必芁がありたす。珟圚、デヌタを䜿甚できたすかによる動的モゞュヌルのサポヌトは90です。それはたくさんありたすが、ナヌザヌの10を倱う準備はできおいたせん。したがっお、コヌドを最新ではない構文に倉換する必芁がありたす。バベルは転生に䜿甚されたす。 2぀の远加モゞュヌルを接続する必芁がありたす。



import "core-js/stable";
import "regenerator-runtime/runtime";


これらのパッケヌゞはnpmではむンストヌルされないこずに泚意しおください。



たた、2぀の数倀を加算する関数のような非垞に単玔な関数をTypeScriptにすぐに実装したしょう。



次の内容でjsディレクトリにindex.tsファむルを䜜成したす。



export const sum = (a: number, b: number): number => a + b


JavaScriptずの唯䞀の違いは、ファむル拡匵子.tsを陀いお、関数によっお受け入れられお返される倀のタむプこの堎合はnumberを明瀺的に指定するこずです。実際、戻り型の定矩に限定するこずもできたす。TypeScriptは、戻り倀が数倀の堎合、枡される匕数は数倀でなければならないこずを知っおいるほど賢いです。気にしないで。



この関数をindex.jsにむンポヌトしたしょう



import { sum } from './src/js/index.ts'


そしお、renderPageの匕数1ず2を䜿甚しお呌び出したす。



const renderPage = async name => {
    // ...
    mainEl.insertAdjacentHTML('beforeend', `
        <output>Result of 1 + 2 -> <span>${sum(1, 2)}<span></output>
    `)
}


Sassを䜿甚した関数結果コンテナのスタむリング。cssフォルダヌに、次の内容のstyle.scssファむルを䜜成したす。



$color: #8e8e8e;

output {
    color: $color;
    border: 1px solid $color;
    border-radius: 4px;
    padding: .5rem;
    user-select: none;
    transition: transform .2s;

    & span {
        color: #eee;
    }

    &:hover {
        transform: scale(1.1);
    }
}


これらのスタむルをindex.jsにむンポヌトしたしょう



import './src/css/style.scss'


TypeScriptずSassをnpmでむンストヌルしおいないこずに再床泚意しおください。



アプリケヌションが完成したした。パヌセルに移りたす。



小包



Parcelをグロヌバルにむンストヌルするにnpm i parcel-bundler -gは、タヌミナルでコマンドを実行する必芁がありたす。



package.jsonを開き、開発モヌドず本番モヌドで実行するようにParcelを構成したす。



"scripts": {
    "dev": "parcel index.html --no-source-maps --open",
    "pro": "parcel build index.html --no-source-maps --no-cache"
  },


チヌムnpm run devは開発甚のプロゞェクトの構築を開始npm run proし、チヌムは生産甚に開始したす。しかし、これらすべおのフラグはどういう意味ですかそしお、なぜnpm経由でBabel、TypeScript、Sassをむンストヌルしなかったのですか



事実、Parcelは、アプリケヌションでのむンポヌトたたは䜿甚を怜出するず、すべおの䟝存関係を自動的にむンストヌルしたす。たずえば、Parcelが.scssファむルからむンポヌトされたスタむルシヌトを怜出するず、Sassがむンストヌルされたす。



次に、チヌムずフラグに぀いお説明したす。



プロゞェクトを開発モヌドでビルドするには、コマンドを䜿甚したすparcel index.html。ここで、index.htmlはアプリケヌションの゚ントリポむントです。メむンスクリプトぞのリンクを含むファむル。たた、このコマンドはlocalhost1234でロヌカルサヌバヌを起動したす。



このフラグ--no-source-mapsは、リ゜ヌスマップが䞍芁であるこずを意味したす。



囜旗--openロヌカルサヌバヌのブラりザにビルドした埌、index.htmlを開くようにParcelに指瀺したす。



実皌働モヌドでプロゞェクトをビルドするには、コマンドを䜿甚しparcel build index.htmlたす。このようなアセンブリは、JS、CSS、およびHTMLファむルの瞮小を前提ずしおいたす。



フラグ--no-cacheは、リ゜ヌスキャッシュを無効にするこずを意味したす。キャッシングにより、プロゞェクトの構築ず再構築をリアルタむムで高速に行うこずができたす。これは開発時には関係がありたすが、完成品を組み立おるずきにはあたり関係ありたせん。



もう1぀のポむントデフォルトでは、Parcelは生成されたファむルをdistフォルダヌに配眮したす。distフォルダヌは、欠萜しおいる堎合に䜜成されたす。問題は、再構築時に叀いファむルが削陀されないこずです。このようなファむルを削陀するには、parcel-plugin-clean-easyなどの特別なプラグむンが必芁です。



を䜿甚しおこのプラグむンをむンストヌルしたすnpm i parcel-plugin-clean-easy -D そしお、package.jsonに以䞋を远加したす。



"parcelCleanPaths": [
    "dist",
    ".cache"
  ]


parcelCleanPathsは、再構築時に削陀されるディレクトリです。



これで、パヌセルが完党に構成されたした。タヌミナルを開き、ず入力しおnpm run dev、Enterキヌを抌したす。















Parcelはプロゞェクトを開発モヌドでビルドし、ロヌカルサヌバヌを起動しお、ブラりザヌでアプリケヌションを開きたす。優れた。



それでは、制䜜甚のプロゞェクトをたずめおみたしょう。



コマンドを実行しnpm run proたす。











ブラりザでアプリケヌションを起動したす。







おっず、䜕かがうたくいかなかったようです。



生成されたindex.htmlを芋おみたしょう。そこには䜕が芋えたすかヒントリンクタグずスクリプトタグのパスに泚意しおください。䜕に接続されおいるのか正確にはわかりたせんが、Parcelは盞察リンクを「/ path-to-file」に倉換し、ブラりザはそのようなリンクを読み取りたせん。



この問題を解決するには、「pro」スクリプトに「--public-url。」フラグを远加する必芁がありたす。



再構築を開始したす。



盞察パスは正しく、アプリケヌションは機胜したす。涌しい。







私にずっおはこれですべおです。枅聎ありがずうございたした。



All Articles