目次
Webpack パッケージ化の原則を知りたい場合は、事前に 2 つの知識ポイントを知っておく必要があります。
require とexports を理解したら、パッケージ化を開始できます
step1: 次のように新しいindex.js、a.js、b.jsの依存関係を作成します。
step2: Webpack を作成します
总结
ホームページ ウェブフロントエンド jsチュートリアル パッケージ化プロセスと webpack の原則の詳細な分析

パッケージ化プロセスと webpack の原則の詳細な分析

Aug 09, 2022 pm 05:11 PM
webpack パック

Webpack はどのようにパッケージ化を実装しますか?次の記事では、Webpack のパッケージ化原則について詳しく説明します。お役に立てば幸いです。

パッケージ化プロセスと webpack の原則の詳細な分析

フロントエンドの「包囲ライオン」として、Webpack は非常によく知られています。Webpack は非常に多くのことができます。すべてのリソース (JS、TS、JSX を含む) を組み合わせることができます。 、画像、フォント、CSS など)がパッケージ化されて依存関係に配置されるため、必要に応じて依存関係を参照してリソースを使用できます。 Webpack は、フロント エンドで複数のファイル リソースを変換し、複雑なモジュールの依存関係を分析するという優れた仕事を行っています。また、ローダーをカスタマイズして、独自のリソースを自由にロードすることもできます。では、Webpack はどのようにパッケージ化を実装するのでしょうか? 今日来て見てみましょう。

Webpack パッケージ化の原則を知りたい場合は、事前に 2 つの知識ポイントを知っておく必要があります。

1. require とは何ですか?

require というと、最初に思い浮かぶのは import かもしれません。import は es6 の標準構文です。

– require はランタイム呼び出しなので、require は実行できます。 Place;

– import はコンパイル中に呼び出されるため、ファイルの先頭に配置する必要があります;

Webpack を使用してコンパイルする場合、 babel を使用して import を require に変換します。CommonJS には、モジュールをロードするために使用されるグローバル メソッド require() があります。AMD と CMD も参照に require メソッドを使用します。

例:

var add = require('./a.js');
add(1,2)
ログイン後にコピー

簡単に言えば、require は実際には関数であり、参照される ./a.js は関数の単なるパラメーターです。

2. 輸出とは何ですか?

ここでは、エクスポートをオブジェクトとして考えることができます。MDN エクスポート 具体的な使用方法を確認できます。

require とexports を理解したら、パッケージ化を開始できます

まず、パッケージ化後のコード構造を見てみましょう。パッケージ化後に require とexports が表示されることがわかります。

すべてのブラウザが require エクスポートを実行できるわけではありません。コードが正常に動作するようにするには、require とエクスポートを自分で実装する必要があります。パッケージ化されたコードは自己実行関数であり、パラメータには依存関係情報とファイルのコードが含まれており、実行される関数本体は eval を通じてコードを実行します。

パッケージ化プロセスと webpack の原則の詳細な分析

全体的な設計図は次のとおりです。

パッケージ化プロセスと webpack の原則の詳細な分析

ステップ 1: 構成を記述するファイル

構成ファイルは、後続に生成されるファイルを準備するために、パッケージ化されたエントリ エントリとパッケージ化された終了出力を構成します。

const path = require("path");
module.exports = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "./dist"),//打包后输出的文件地址,需要绝对路径因此需要path
    filename:"main.js"
  },
  mode:"development"
ログイン後にコピー

第 2 ステップ: モジュール分析

全体的なアイデア : fs ファイルの読み取りを使用すると要約できます。 file は、AST を通じてインポート依存ファイルのパスを取得します。依存ファイルにまだ依存関係がある場合は、依存関係の分析が明確になり、マップに保持されるまで再帰されます。

詳細な解体: AST はこの関数で生まれているため、なぜ AST が使用されるのか疑問に思う人もいるかもしれません。その ImportDeclaration は、インポート構文をすばやくフィルタリングするのに役立ちます。もちろん、通常のマッチングも可能です。結局のところ、ファイルは読み取られた後は単なる文字列であり、ファイルの依存関係パスは素晴らしい正規表現を記述することで取得できますが、十分エレガントではありません。

step1: 次のように新しいindex.js、a.js、b.jsの依存関係を作成します。

index.jsファイル

import { str } from "./a.js";
console.log(`${str} Webpack`)
ログイン後にコピー

a.jsファイル

import { b} from "./b.js"
export const str = "hello"
ログイン後にコピー

b.js ファイル

export const b="bbb"
ログイン後にコピー

step2: Webpack を作成します

モジュール分析: AST の @babel/parser を使用しますファイルから読み取った文字列を AST ツリーに変換し、@babel/traverse を使用して構文分析を実行し、ImportDeclaration を使用してインポートをフィルター処理してファイルの依存関係を見つけます。

    const content = fs.readFileSync(entryFile, "utf-8");
    const ast = parser.parse(content, { sourceType: "module" });
  
    const dirname = path.dirname(entryFile);
    const dependents = {};
    traverse(ast, {
      ImportDeclaration({ node }) {
        // 过滤出import
        const newPathName = "./" + path.join(dirname, node.source.value);
        dependents[node.source.value] = newPathName;
      }
    })
    const { code } = transformFromAst(ast, null, {
      presets: ["@babel/preset-env"]
    })
    return {
      entryFile,
      dependents,
      code
    }
ログイン後にコピー

結果は次のとおりです:

パッケージ化プロセスと webpack の原則の詳細な分析

再帰またはループを使用して、依存関係分析のためにファイルを 1 つずつインポートします。ここでは for ループを使用していることに注意してください。すべての依存関係を分析する、ループがすべての依存関係を分析できる理由は、モジュールの長さが変化することに注意してください。

 for (let i = 0; i <p><strong><span style="font-size: 18px;">ステップ 3: WebpackBootstrap 関数を記述して出力ファイルを生成する</span></strong></p><p><strong>编写</strong> <strong>WebpackBootstrap</strong> <strong>函数</strong>:这里我们需要做的首先是 WebpackBootstrap 函数,编译后我们源代码的 import 会被解析成 require 浏览器既然不认识 require ,那我们就先声明它,毕竟 require 就是一个方法,在编写函数的时候还需要注意的是作用域隔离,防止变量污染。我们代码中 exports 也需要我们声明一下,保证代码在执行的时候 exports 已经存在。</p><p><strong>生成输出文件</strong>:生成文件的地址我们在配置文件已经写好了,再用 fs.writeFileSync 写入到输出文件夹即可。</p><pre class="brush:php;toolbar:false">  file(code) {
    const filePath = path.join(this.output.path, this.output.filename)
    const newCode = JSON.stringify(code);
    // 生成bundle文件内容
    const bundle = `(function(modules){
      function require(module){
        function pathRequire(relativePath){
          return require(modules[module].dependents[relativePath])
        }
        const exports={};
        (function(require,exports,code){
          eval(code)
        })(pathRequire,exports,modules[module].code);
        return exports
      }
      require('${this.entry}')
    })(${newCode})`;
      //  WebpackBoostrap
    // 生成文件。放入dist 目录
    fs.writeFileSync(filePath,bundle,'utf-8')
  }
ログイン後にコピー

パッケージ化プロセスと webpack の原則の詳細な分析

第四步:分析执行顺序

パッケージ化プロセスと webpack の原則の詳細な分析

我们可以在浏览器的控制台运行一下打包后的结果,如果能正常应该会打印出 hello Webpack。

パッケージ化プロセスと webpack の原則の詳細な分析

总结

通过以上的分析,我们应该对 Webpack 的大概流程有基本的了解,利用 AST 去解析代码只是本次演示的一种方式,不是 Webpack 的真实实现,Webpack 他自己有自己的 AST 解析方式,万变不离其宗都是拿到模块依赖,Webpack 生态是很完整,有兴趣的童鞋可以考虑以下三个问题:

  • 如果出现组件循环引用那又应该如何处理?
  • Webpack 是如何加载 loader 的?
  • 犹大大极力推荐的 vite 可以实现按需打包,大大提升开发时候打包速度,如果是 webapck 又是应该如何实现?

更多编程相关知识,请访问:编程视频!!

以上がパッケージ化プロセスと webpack の原則の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PyCharm プロジェクトをパッケージ化する簡単な方法を共有する PyCharm プロジェクトをパッケージ化する簡単な方法を共有する Dec 30, 2023 am 09:34 AM

シンプルでわかりやすい PyCharm プロジェクトのパッケージ化方法を共有する Python の人気に伴い、Python 開発のメイン ツールとして PyCharm を使用する開発者が増えています。 PyCharm は、開発効率の向上に役立つ多くの便利な機能を提供する強力な統合開発環境です。重要な機能の 1 つはプロジェクトのパッケージ化です。この記事では、PyCharmでプロジェクトをパッケージ化する方法をシンプルかつ分かりやすく紹介し、具体的なコード例を示します。プロジェクトをパッケージ化する理由Pythonで開発

VUE3 入門チュートリアル: Webpack を使用したパッケージ化とビルド VUE3 入門チュートリアル: Webpack を使用したパッケージ化とビルド Jun 15, 2023 pm 06:17 PM

Vue は、インタラクティブで効率的な Web アプリケーションを迅速に構築するのに役立つ優れた JavaScript フレームワークです。 Vue3 は、多くの新機能が導入された Vue の最新バージョンです。 Webpack は現在最も人気のある JavaScript モジュール パッケージャーおよびビルド ツールの 1 つで、プロジェクト内のさまざまなリソースの管理に役立ちます。この記事では、Webpack を使用して Vue3 アプリケーションをパッケージ化してビルドする方法を紹介します。 1.Webpackをインストールする

vite と webpack の違いは何ですか vite と webpack の違いは何ですか Jan 11, 2023 pm 02:55 PM

相違点: 1. Webpack サーバーの起動速度は Vite より遅いですが、Vite は起動時にパッケージ化する必要がなく、モジュールの依存関係を解析してコンパイルする必要がないため、起動速度が非常に速くなります。 2. Vite ホット アップデートは webpack よりも高速です。Vite の HRM の観点から、特定のモジュールのコンテンツが変更された場合、ブラウザーにモジュールを再リクエストさせるだけです。 3. Vite は esbuild を使用して依存関係を事前構築しますが、webpack はノードに基づいています。 4. Vite のエコロジーは webpack ほど良くなく、ローダーとプラグインが十分に豊富ではありません。

コードのパッケージ化と配布に Python 正規表現を使用する方法 コードのパッケージ化と配布に Python 正規表現を使用する方法 Jun 23, 2023 am 09:31 AM

Python プログラミング言語の人気が高まるにつれて、Python でコードを書き始める開発者が増えています。しかし、実際に使用する場合は、多くの場合、これらのコードをパッケージ化し、他の人に配布して使用する必要があります。この記事では、コードのパッケージ化と配布に Python 正規表現を使用する方法を紹介します。 1. Python コードのパッケージ化 Python では、setuptools や distutils などのツールを使用してコードをパッケージ化できます。これらのツールは Python ファイル、モジュールを変換できます

pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化するにはどうすればよいですか? pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化するにはどうすればよいですか? Jul 26, 2022 pm 07:33 PM

Nodejs実行可能ファイルをpkgでパッケージ化するにはどうすればよいですか?次の記事では、pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法を紹介します。

モジュール開発に PHP と webpack を使用する方法 モジュール開発に PHP と webpack を使用する方法 May 11, 2023 pm 03:52 PM

Web 開発テクノロジーの継続的な発展に伴い、フロントエンドとバックエンドの分離とモジュール開発が広く普及する傾向になりました。 PHP は一般的に使用されるバックエンド言語です。モジュラー開発を行う場合、モジュールの管理とパッケージ化にいくつかのツールを使用する必要があります。Webpack は非常に使いやすいモジュラー パッケージング ツールです。この記事では、モジュール開発に PHP と webpack を使用する方法を紹介します。 1. モジュラー開発とは何ですか? モジュラー開発とは、プログラムを、それぞれが独自の機能を持つ独立したモジュールに分解することを指します。

VSCodeの機能を詳しく解説:業務効率化にどう役立つのか? VSCodeの機能を詳しく解説:業務効率化にどう役立つのか? Mar 25, 2024 pm 05:27 PM

VSCodeの機能を詳しく解説:業務効率化にどう役立つのか?ソフトウェア開発業界の継続的な発展に伴い、開発者の作業効率とコードの品質の追求は、仕事における重要な目標となっています。このプロセスでは、コード エディターの選択が重要な決定になります。数あるエディターの中でも、Visual Studio Code (略して VSCode) は、その強力な機能と柔軟な拡張性により、大多数の開発者に愛されています。この記事では、VSCode のいくつかの機能を詳しく紹介し、説明します。

Webpack はどのように es6 モジュールを es5 モジュールに変換しますか? Webpack はどのように es6 モジュールを es5 モジュールに変換しますか? Oct 18, 2022 pm 03:48 PM

設定方法: 1. import メソッドを使用して ES6 コードをパッケージ化された js コード ファイルに配置します; 2. npm ツールを使用して babel-loader ツールをインストールします。構文は「npm install -D babel-loader @babel/core」です。 @babel/preset-env"; 3. babel ツールの構成ファイル「.babelrc」を作成し、トランスコーディング ルールを設定します。 4. webpack.config.js ファイルでパッケージ化ルールを構成します。

See all articles