Webpack 4のシンプルな静的サむト


倚数の蚘事たずえば、 この蚘事を読んだ埌、「恐竜」アプロヌチを䜿甚しお単玔なサむトを䜜成するずきに、Node.jsを䜿甚した最新のアプロヌチに切り替えるこずにしたした。 以䞋は、 Webpack 4を䜿甚しお単玔な静的サむトを構築する解析䟋です。 問題を解決するための指瀺が芋぀からなかったため、この蚘事は曞かれたした。すべおを断片的に収集しなければなりたせんでした。


問題の声明


サむトは、独自のCSSスタむルずJavaScriptファむルを備えたHTMLペヌゞの単玔なセットです。 サむトを゜ヌスから組み立おるプロゞェクトを䜜成する必芁がありたす。



組み立おられたサむトでは、React、Vue.jsを䜿甚しないでください。


テクノロゞヌを遞択するずき、珟時点で最も人気のあるものが遞択されたす。 このため、私はGruntずGulpの䞡方をWebpackに賛成しお拒吊したしたが、正盎なずころ、単調さのためにGulp構文がより奜きでした。


たずえば、Bootstrap 4に基づく耇数のペヌゞがコンパむルされたすが、これは単なる䟋です。


Node.jsがむンストヌルされおいるず想定されWindowsでは、むンストヌラヌは「次、次」のスタむルでダりンロヌドおよびむンストヌルされるだけです、コマンドラむンで䜜業できたす。


曎新する 远加の蚭定なしでGitHubペヌゞなどでホスティングにアップロヌドするか、コンピュヌタヌでロヌカルに開くこずができる既補のHTMLペヌゞのセットを取埗する必芁がありたす。


プロゞェクト構造


プロゞェクトの䞀般的な構造は次のずおりです。


. ├── dist - ,     ├─┬ src -     │ ├── favicon -       │ ├── fonts -    │ ├─┬ html -   HTML  │ │ ├── includes -     (header, footer) │ │ └── views -    HTML  │ ├── img -     (,   .) │ ├── js -   JavaScript  │ ├── scss -   SSS  │ └── uploads -     (,   .) ├── package.json -   Node.js └── webpack.config.js -   Webpack 

同じ構造ですが、䟋に存圚するファむルを衚瀺しおいたす
 . ├── dist ├─┬ src │ ├─┬ favicon │ │ └── favicon.ico │ ├─┬ fonts │ │ └── Roboto-Regular.ttf │ ├─┬ html │ │ ├─┬ includes │ │ │ ├── footer.html │ │ │ └── header.html │ │ └─┬ views │ │ ├── index.html │ │ └── second.html │ ├─┬ img │ │ └── logo.svg │ ├─┬ js │ │ └── index.js │ ├─┬ scss │ │ └── style.scss │ └─┬ uploads │ └── test.jpg ├── package.json └── webpack.config.js 

ファビコンの䞋でフォルダ党䜓が遞択されたす。これは、最新のWebでは1぀のicoファむルだけではできないためです。 しかし、たずえば、この単䞀のファむルのみが䜿甚されたす。


物議をかもす決定は、画像をimgずuploads 2぀のフォルダヌに分割するように芋えるかもしれたせん。 しかし、ここではWordpressのファむルレむアりトのむデオロギヌを䜿甚したした。 私の意芋では、すべおの画像を1぀のフォルダヌに入れるこずはお勧めできたせん。


このプロゞェクトで䜜業するには、 Visual Studio Codeを䜿甚したす。 コマンドラむンがプログラムに組み蟌たれ、 Ctrl + `を介しお呌び出されるこずが特に気に入っおいたす。



プロゞェクトNode.jsを空癜にしたす。 これを行うには、䞊蚘の構造を䜿甚しおプロゞェクト甚のフォルダヌを䜜成し、コマンドラむンでそのフォルダヌに移動したす。そこで、コマンドを呌び出しおpackage.jsonファむルを䜜成したす。


 npm init 

詳现な情報をEnterたくない堎合は、 Enterを抌すだけですべおの質問に答えるこずができたす。


いずれの堎合でも必芁になる3぀の䞀般的なパッケヌゞをむンストヌルしたす webpack 、 webpack-cli  webpack-cliのコマンドラむンでの䜜業は別のパッケヌゞに取り蟌たれたしたおよびwebpack-dev-server 保存されたプロゞェクトの倉曎がブラりザヌにすぐに衚瀺されるようにロヌカルサヌバヌを起動するため 。


 npm install webpack webpack-cli webpack-dev-server --save-dev 

package.jsonファむルは次のようになりたす。
 { "name": "static-site-webpack-habr", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "license": "ISC", "devDependencies": { "webpack": "^4.1.1", "webpack-cli": "^2.0.11", "webpack-dev-server": "^3.1.1" } } 

package-lock.jsonファむルも䜜成されたすが、これには䞀切觊れたせん。 ただし、gitリポゞトリでは、 node_modulesフォルダヌずは異なり、このファむルを远加する必芁がありたすnode_modulesフォルダヌは、gitを䜿甚する堎合は.gitignoreファむルに曞き蟌む必芁がありたす。


JavaScriptを構築する


Webpackは䞻にjsファむルを䜜成するために䜜成されおいるため、この郚分が最も簡単です。 ブラりザでサポヌトされおいないES2015の最新の圢匏でjavascriptを蚘述できるように、パッケヌゞbabel-core 、 babel-loader 、 babel-preset-envをむンストヌルしたす。


 npm install babel-core babel-loader babel-preset-env --save-dev 

次の内容でwebpack.config.js蚭定webpack.config.jsを䜜成した埌


 const path = require('path'); module.exports = { entry: [ './src/js/index.js', ], output: { filename: './js/bundle.js' }, devtool: "source-map", module: { rules: [{ test: /\.js$/, include: path.resolve(__dirname, 'src/js'), use: { loader: 'babel-loader', options: { presets: 'env' } } }, ] }, plugins: [ ] }; 

entryセクション entryポむントでは、収集するjsファむルを瀺し、 outputセクションでは、収集したファむルが配眮されるdistフォルダのパスを瀺したす。 outputパスのwebpack 4では、 distフォルダヌ自䜓を指定する必芁がないこずに泚意しおください そしお、はい、私はそれを1぀のwebpackファむルで奜きではない堎合は、盞察パスを曞く必芁がある堎合があり、他の堎合は特別なフォルダヌに盞察パスを曞く必芁があり、3番目の堎合は絶察パスが必芁ですたずえば、このコマンドpath.resolve(__dirname, 'src/js')それを取埗したす。 path.resolve(__dirname, 'src/js') 。


たた、 devtoolパラメヌタヌ倀はsource-map等しく蚭定されsource-map 。これにより、jsおよびcssファむルの゜ヌスマップを䜜成できたす。


特定のファむル拡匵子、堎所を凊理するには、webpackのrulesセクションにルヌルを䜜成しrules 。 ここで、すべおのjsファむルをBabelトランスレヌタに枡すずいうルヌルがありたす。Babelトランスレヌタは、新しく䜜成されたES2015をブラりザが理解できる暙準のjavascriptバヌゞョンに倉換したす。


テストケヌスでは、Boostrap 4にペヌゞを課しおいたす。したがっお、 bootstrap 、 jquery 、 popper.js 3぀のパッケヌゞをむンストヌルする必芁がありたす。 ブヌトストラップでオンデマンドでむンストヌルする2番目ず3番目のパッケヌゞ。


 npm install bootstrap jquery popper.js --save 

これらの3぀のパッケヌゞは、サむトではなく、アセンブリ甚に必芁であるこずに泚意しおください。 したがっお、これらのパッケヌゞは--save-devではなく--save-devフラグでむンストヌルしたす。


これで、 index.jsファむルの䜜成を開始できたす。


 import jQuery from 'jquery'; import popper from 'popper.js'; import bootstrap from 'bootstrap'; jQuery(function() { jQuery('body').css('color', 'blue'); }); 

カスタムコヌドの䟋ずしお、jsはテキストの色を青に塗り盎したした。


これで、jsファむルのビルドに進むこずができたす。 これを行うには、 scriptsセクションのpackage.jsonファむルに、次のnpmスクリプトを蚘述したす。


  "scripts": { "dev": "webpack --mode development", "build": "webpack --mode production", "watch": "webpack --mode development --watch", "start": "webpack-dev-server --mode development --open" }, 

これで、コマンドラむンでnpm run dev行を実行するず、プロゞェクトがアセンブルされcssおよびhtmlファむルもこのコマンドによっお収集されたす、 bundle.jsおよびbundle.js.mapファむルが/dist/js bundle.js.map 。


npm run buildコマンドを実行するず、プロゞェクトもアセンブルされたすが、最終的なもの最適化、最倧ファむル最小化はホスティングにアップロヌドできたす。


npm run watchを開始するず、倉曎されたファむルが自動的に远加され、プロゞェクトファむルぞの倉曎を自動的に衚瀺するモヌドが開始されたす。 はい、コマンドラむンでこのモヌドを無効にするたずえば、他のコマンドを曞くには、 Ctrl + C抌したす少なくずもPowerShellで。


npm run startを起動するず、ロヌカルサヌバヌが起動し、htmlペヌゞが起動し、ファむルの倉曎も远跡されたす。 ただし、珟時点では、HTMLペヌゞのアセンブリが远加されおいないため、このコマンドは䜿甚しおいたせん。


プロゞェクトビルドモヌドは、 distフォルダヌ内のファむルを䜜成たたは䞊曞きしたす。 ただし、異なるアセンブリを䜿甚したプロゞェクトの開発䞭に、ファむルの名前を倉曎したり、削陀したりできたす。 たた、Webpackは、以前のビルドで残った䞍芁なファむルがdistフォルダヌから削陀されるこずを保蚌したせん。 したがっお、各プロゞェクトをビルドする前にdistフォルダヌをクリアする別のclean-webpack-pluginを远加したす。


2018.04.11。を曎新 clean-webpack-pluginを攟棄しなければなりclean-webpack-plugin 。 なんで npm run start webpack-dev-server --mode development --open  webpack-dev-server --mode development --open でwebpack-dev-server --mode development --open 、webpackはファむルをdistフォルダヌに保存せずに自動的にコンパむルしたす。 これは正垞です。 ただし、同時にclean-webpack-pluginが存圚するため、 distフォルダヌは消去されclean-webpack-plugin 。 その結果、ロヌカルサヌバヌの動䜜モヌドでは、 distフォルダヌが空になり、これがgitの䜜業に悪圱響を及がしたす私のようにgitリポゞトリにプロゞェクトアセンブリを保存する堎合のみ。各サヌバヌの起動埌、削陀されたファむルにより倚くの倉曎が衚瀺されたす。 たずえば、 npm run build-and-beautify 以䞋のこのコマンドに぀いおのように、 npm run build-and-beautify䞭にのみdistフォルダヌがクリヌンアップされるず䟿利です。 clean-webpack-plugin必芁な方法で構成できたせんでした。 したがっお、別のdel-cliを䜿甚しdel-cli 。これは、webpackに接続されおおらず、個別に動䜜したす。


 npm install del-cli --save-dev 

package.jsonファむルに倉曎を加えたす。


 { ... "scripts": { ... "clear": "del-cli dist" }, ... } 

CSSファむルアセンブリ


src/scssを予玄したSCSSファむルからCSSファむルを収集しsrc/scss 。 その䞭に、たずえば次の内容のstyle.scssファむルを䜜成したす。


 $font-stack: -apple-system, BlinkMacSystemFont,Roboto,'Open Sans','Helvetica Neue',sans-serif; @import "~bootstrap/scss/bootstrap"; @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; src: url(../fonts/Roboto-Regular.ttf); } body { font-family: $font-stack; #logo { width: 10rem; } .container { img { width: 20rem; } } } 

Bootstrapスタむルは、CSSファむルではなくSSS @import "node_modules/bootstrap/scss/bootstrap" @import "~bootstrap/scss/bootstrap"; 、必芁に応じお、ラむブラリの特定のプロパティを曞き換えたり、ミックスむンを䜿甚したりするこずができたす。 jsファむルのアセンブリ䞭にjsファむルをBootstrapラむブラリに接続するずきにWebpackが必芁なファむルの堎所を認識しおいる堎合、スタむルを接続するずきにnode_modulesフォルダヌぞのパスを指定する必芁がありたす。


cssファむルを凊理するには、 node-sass 、 sass-loader 、 css-loader 、およびextract-text-webpack-pluginモゞュヌルが必芁です extract-text-webpack-pluginの次のバヌゞョンでは、最埌のプラグむンはそれを必芁ずしなくなりたす。


重芁 執筆時点では、安定バヌゞョンのextract-text-webpack-pluginはWebpack 4で動䜜したせん。したがっお、 @nextを介しおベヌタバヌゞョンをむンストヌルする必芁がありたす。


 npm install node-sass sass-loader css-loader extract-text-webpack-plugin@next --save-dev 

すべおのプラグむンを通垞の方法ですぐにむンストヌルできるようになるこずを願っおいたす。


 npm install node-sass sass-loader css-loader extract-text-webpack-plugin --save-dev 

webpack.config.js 、次の倉曎を远加したす。


 ... const ExtractTextPlugin = require("extract-text-webpack-plugin"); ... module.exports = { entry: [ ... './src/scss/style.scss' ], ... module: { rules: [{ ... { test: /\.(sass|scss)$/, include: path.resolve(__dirname, 'src/scss'), use: ExtractTextPlugin.extract({ use: [{ loader: "css-loader", options: { sourceMap: true, minimize: true, url: false } }, { loader: "sass-loader", options: { sourceMap: true } } ] }) }, ] }, plugins: [ new ExtractTextPlugin({ filename: './css/style.bundle.css', allChunks: true, }), ... ] }; 

゚ントリentryポむントに新しい入力ファむルstyle.scssを远加したしたが、出力ファむルはoutputでは指定されず、 pluginsセクションのExtractTextPluginプラグむンの呌び出しで指定されおいるこずに泚意しおください。 sass-loaderおよびcss-loaderパッケヌゞのsourceMap゜ヌスマップのサポヌトが含たれおいたす。


たた、 style-loaderパッケヌゞがないこずにも気付くこずができたす。 style-loaderパッケヌゞは、Webpackでcssを䜿甚するずきに最もよく蚀及されたす。 このパッケヌゞはcssコヌドをHTMLファむルに埋め蟌みたす。これは単䞀ペヌゞのアプリケヌションには䟿利ですが、耇数ペヌゞのアプリケヌションには䟿利ではありたせん。


そしお、最も物議を醞す瞬間。 css-loaderパッケヌゞの堎合、 false等しいurlパラメヌタヌを远加したした。 なんで デフォルトでは、 url=trueであり、CSSを構築するずきにWebpackが倖郚ファむルぞのリンクを芋぀けた堎合背景画像、フォントたずえば、この堎合、 url(../fonts/Roboto-Regular.ttf)フォントファむルurl(../fonts/Roboto-Regular.ttf)ぞのリンクがありたす、それ圌はこれらのファむルを䜕らかの圢で凊理するように頌みたす。 このため、最も䞀般的に䜿甚されるパッケヌゞは、 file-loader ビルドフォルダヌにファむルをコピヌするたたはurl-loader HTMLコヌドに埋め蟌みを詊みる小さなファむルです。 この堎合、アセンブルされたcss内のファむルぞの所定の盞察パスを倉曎できたす。


しかし、実際にはどんな問題に遭遇したしたか SCSSコヌドをsrc/scssがありたす。 SCSSコヌドで参照される画像を含むsrc/imgフォルダヌがありたす。 すべおが順調です。 しかし、たずえば、サヌドパヌティのラむブラリをサむトに接続する必芁がありたしたたずえば、lightgallery。 圌女のSCSSコヌドはnode_modules/lightgallery/src/sassにありnode_modules/lightgallery/src/sass 。このフォルダヌは、盞察パスを介しおnode_modules/lightgallery/src/imgフォルダヌの写真を参照したす。 たた、 style.scssラむブラリスタむルを远加するず、 file-loaderはどこにあるかではなく、 src/imgフォルダヌ内でlightgalleryラむブラリの写真を探したす。 そしお、私はそれを克服できたせんでした。


曎新する Odrinが瀺唆するように、 resolve-url-loaderパッケヌゞずfile-loaderを䜿甚しお、最埌の問題に察凊できたす。


゜リュヌション䟋
 ... module.exports = { ... module: { rules: [ ... { test: /\.(png|jpg|gif)$/, use: [ { loader: 'file-loader', options: {name: 'img/[name].[ext]'} } ] }, { test: /\.(sass|scss)$/, include: path.resolve(__dirname, 'src/scss'), use: ExtractTextPlugin.extract({ use: [{ loader: "css-loader", options: { sourceMap: true, minimize: true//, //url: false } }, { loader: "resolve-url-loader" }, { loader: "sass-loader", options: { sourceMap: true } } ] }) } ... ] }, ... }; 

぀たり、盞察パスの代わりにresolve-url-loaderパッケヌゞがwebpackが理解するパスを蚭定したす。 そしお、すでにファむルロヌダヌは必芁なファむルをコピヌしたす。 問題は、ファむルロヌダヌの名前プロパティにありたす。 name: '[path]/[name].[ext]'ずしお指定する堎合name: '[path]/[name].[ext]' 、私の䟋では、 dist\node_modules\lightgallery\src\imgフォルダヌは、画像が既に配眮されおいるdistフォルダヌに衚瀺されたす。 いいえ、cssにはこのフォルダヌぞの正しいパスが登録されたすが、きれいではありたせん。 したがっお、パスなしでファむル名を指定するこずをお勧めしたすたずえば、 name: 'img/[name].[ext]' 。 確かに、すべおの写真は1぀のフォルダヌに移動したす-垞に圹立぀ずは限りたせん。


したがっお、 url=falseに蚭定するず、SCSSコヌド内のファむルぞのすべおのリンクに觊れず、パスを倉曎せず、ファむルをコピヌたたは埋め蟌みもしないず蚀いたす。埌で個別に凊理したす。 おそらく、この解決策は䞍適切であり、より適切なアプロヌチを提案したす。


HTMLペヌゞアセンブリ


楜しい郚分に移りたしょう。HTMLペヌゞを組み立おるのは、私にずっお最倧の困難でした。


HTMLペヌゞを䜜成するには、さたざたなタむプのテンプレヌト゚ンゞンをサポヌトするhtml-webpack-pluginを䜿甚したす。 たた、 raw-loaderパッケヌゞも必芁になりたす。


 npm install html-webpack-plugin raw-loader --save-dev 

HTMLテンプレヌト゚ンゞンずしお、デフォルトのテンプレヌト゚ンゞンlodashを䜿甚したす。 これは、アセンブリ前の兞型的なHTMLペヌゞの倖芳です。


 <% var data = { title: " | ", author: "Harrix" }; %> <%= _.template(require('./../includes/header.html'))(data) %> <p>text</p> <%= _.template(require('./../includes/footer.html'))(data) %> 

最初に、 data倉数に、このペヌゞで䜿甚するすべおのペヌゞ倉数を登録したす。 次に、 _.template(require()) 。 _.template(require())を_.template(require())おヘッダヌずフッタヌのテンプレヌトを埋め蟌みたす。


重芁な説明。 html-webpack-pluginを介したHTMLペヌゞのアセンブルに関する蚘事では、通垞、埋め蟌みテンプレヌトは次のコマンドで簡単に接続できたす。


 require('html-loader!./../includes/header.html') 

ただし、同時に、これらの埋め蟌みテンプレヌトではlodash構文は機胜したせんこれがなぜ起こるのかただわかりたせん。 たた、デヌタ倉数からのdataはそこに転送されたせん。 そのため、webpackに、lodashテンプレヌトずしお凊理する必芁があるテンプレヌトを埋め蟌むこずを匷制したす。


これで、むンラむンテンプレヌトで本栌的なlodash構文を䜿甚できたす。 以䞋のheader.htmlファむルheader.htmlでは、 <%=title%>お蚘事のタむトル<%=title%>印刷したす。


 <!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="shortcut icon" href="favicon/favicon.ico"> <link rel="stylesheet" href="css/style.bundle.css"> <title><%=title%></title> </head> <body> <header><img src="img/logo.svg" id="logo"></header> 

html-webpack-pluginパッケヌゞには、耇数のHTMLペヌゞを生成する機胜がありたす。


  plugins: [ new HtmlWebpackPlugin(), // Generates default index.html new HtmlWebpackPlugin({ // Also generate a test.html filename: 'test.html', template: 'src/assets/test.html' }) ] 

しかし、プラグむンの独自のむンスタンスを䜜成する各ペヌゞを凊方するこずは間違いなく良くありたせん。 そのため、 src/html/viewsフォルダヌ内のすべおのHTMLファむルを怜玢しおこのプロセスを自動化し、それらのnew HtmlWebpackPlugin()独自のバヌゞョンを䜜成したす。


これを行うには、 webpack.config.jsファむルに次の倉曎をwebpack.config.jsたす。


 ... const HtmlWebpackPlugin = require('html-webpack-plugin'); const fs = require('fs') function generateHtmlPlugins(templateDir) { const templateFiles = fs.readdirSync(path.resolve(__dirname, templateDir)); return templateFiles.map(item => { const parts = item.split('.'); const name = parts[0]; const extension = parts[1]; return new HtmlWebpackPlugin({ filename: `${name}.html`, template: path.resolve(__dirname, `${templateDir}/${name}.${extension}`), inject: false, }) }) } const htmlPlugins = generateHtmlPlugins('./src/html/views') module.exports = { module: { ... { test: /\.html$/, include: path.resolve(__dirname, 'src/html/includes'), use: ['raw-loader'] }, ] }, plugins: [ ... ].concat(htmlPlugins) }; 

generateHtmlPlugins関数は、すべおのHTMLペヌゞを怜玢したす。 関数コヌドには、 inject: false蚭定がありたす。これは、WebpackにjsおよびcssファむルリンクをHTMLコヌドに埋め蟌む必芁がないこずを䌝えたす。header.htmlおよびfooter.htmlですべおを手動で行いたす。


埋め蟌たれたテンプレヌトは、最もよく提案されるhtml-loaderではなく、 raw-loaderプラグむンファむルの内容は単にテキストずしおロヌドされるによっお凊理されるこずにも泚意しおください。 たた、CSSの堎合ず同様に、 file-loaderたたはurl-loaderパッケヌゞは䜿甚したせん。


そしお、HTMLを扱う最埌のオプションの瞬間が残っおいたす。 JavaScriptファむルずCSSファむルは最小化されたす。 しかし、私はHTMLファむルを䜜成し、逆に矎しく、瞮小したせん。 したがっお、すべおのHTMLファむルをアセンブルした埌、䜕らかの矎化プラグむンでそれらを調べたいず思いたす。 そしお、ここでセットアップを埅っおいたした。Webpackでこれを行う方法が芋぀かりたせんでした。 問題は、埋め蟌みテンプレヌトの挿入埌にファむルを凊理する必芁があるこずです。


Webpackに関係なくこれを行うこずができるhtml-cliパッケヌゞを芋぀けたした。 しかし、圌は月に38回のむンストヌルを行っおいたす。 ぀たり、これは2぀のオプションを意味したす。HTMLファむルを矎しく芋せるために誰も必芁ずしないか、私が知らない別の䞀般的な゜リュヌションがありたす。 そしお、この機胜だけのために、Gulpはねじ蟌みを望んでいたせん。


このプラグむンをむンストヌルしたす。


 npm install html-cli --save-dev 

たた、 package.jsonファむルには、Webpackで䜜業した埌、2぀のスペヌスで衚圢匏のHTMLファむルを矎しく衚瀺するスクリプトをさらに2぀蚘述したす。


  "scripts": { "build-and-beautify": "del-cli dist && webpack --mode production && html dist/*.html --indent-size 2", "beautify": "html dist/*.html --indent-size 2" }, 

2018.04.11の曎新 build-and-beautify del-cli distにdel-cli distを远加したこずに泚意しおください。これにより、 build-and-beautify前にdistフォルダヌがクリアされたす。


したがっお、最終ビルドでは、* npm run buildコマンドではなく、 npm run build-and-beautifyコマンドを䜿甚するこずをお勧めしたす。


残りのファむルをコピヌする


js、cssファむル、HTMLペヌゞを生成したした。 画像ファむルやフォントなど、觊れおいないものや、 file-loaderやurl-loader意識しおコピヌしおいないものがありたす。 したがっお、残りのすべおのフォルダヌをcopy-webpack-plugin介しおcopy-webpack-plugin 。


 npm install copy-webpack-plugin --save-dev 

webpack.config.jsファむルwebpack.config.js 、倉曎を行いたす。


 ... const CopyWebpackPlugin= require('copy-webpack-plugin'); ... module.exports = { ... plugins: [ ... new CopyWebpackPlugin([{ from: './src/fonts', to: './fonts' }, { from: './src/favicon', to: './favicon' }, { from: './src/img', to: './img' }, { from: './src/uploads', to: './uploads' } ]), ]... }; 

それだけです これで、 npm run build-and-beautifyコマンドを䜿甚しおプロゞェクトを収集し、組み立おられた静的サむトがdistフォルダヌに衚瀺されたす。



芁玄ファむル


Package.jsonファむル
 { "name": "static-site-webpack-habr", "version": "1.0.0", "description": "HTML template", "main": "src/index.js", "scripts": { "dev": "webpack --mode development", "build": "webpack --mode production", "build-and-beautify": "del-cli dist && webpack --mode production && html dist/*.html --indent-size 2", "watch": "webpack --mode development --watch", "start": "webpack-dev-server --mode development --open", "beautify": "html dist/*.html --indent-size 2", "clear": "del-cli dist" }, "dependencies": { "bootstrap": "^4.1.0", "jquery": "^3.3.1", "popper.js": "^1.14.3" }, "devDependencies": { "babel-core": "^6.26.0", "babel-loader": "^7.1.3", "babel-preset-env": "^1.6.1", "copy-webpack-plugin": "^4.5.0", "css-loader": "^0.28.11", "del-cli": "^1.1.0", "extract-text-webpack-plugin": "^4.0.0-beta.0", "html-cli": "^1.0.0", "html-webpack-plugin": "^3.2.0", "node-sass": "^4.8.3", "raw-loader": "^0.5.1", "sass-loader": "^6.0.6", "webpack": "^4.5.0", "webpack-cli": "^2.0.14", "webpack-dev-server": "^3.1.3" } } 

Webpack.config.jsファむル
 const path = require('path'); const ExtractTextPlugin = require("extract-text-webpack-plugin"); const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const fs = require('fs') function generateHtmlPlugins(templateDir) { const templateFiles = fs.readdirSync(path.resolve(__dirname, templateDir)); return templateFiles.map(item => { const parts = item.split('.'); const name = parts[0]; const extension = parts[1]; return new HtmlWebpackPlugin({ filename: `${name}.html`, template: path.resolve(__dirname, `${templateDir}/${name}.${extension}`), inject: false, }) }) } const htmlPlugins = generateHtmlPlugins('./src/html/views'); module.exports = { entry: [ './src/js/index.js', './src/scss/style.scss' ], output: { filename: './js/bundle.js' }, devtool: "source-map", module: { rules: [{ test: /\.js$/, include: path.resolve(__dirname, 'src/js'), use: { loader: 'babel-loader', options: { presets: 'env' } } }, { test: /\.(sass|scss)$/, include: path.resolve(__dirname, 'src/scss'), use: ExtractTextPlugin.extract({ use: [{ loader: "css-loader", options: { sourceMap: true, minimize: true, url: false } }, { loader: "sass-loader", options: { sourceMap: true } } ] }) }, { test: /\.html$/, include: path.resolve(__dirname, 'src/html/includes'), use: ['raw-loader'] }, ] }, plugins: [ new ExtractTextPlugin({ filename: './css/style.bundle.css', allChunks: true, }), new CopyWebpackPlugin([{ from: './src/fonts', to: './fonts' }, { from: './src/favicon', to: './favicon' }, { from: './src/img', to: './img' }, { from: './src/uploads', to: './uploads' } ]), ].concat(htmlPlugins) }; 

Index.htmlテンプレヌトファむル
 <% var data = { title: " | ", author: "Harrix" }; %> <%= _.template(require('./../includes/header.html'))(data) %> <div class="container"> <p> .</p> <p><img src="uploads/test.jpg"></p> </div> <%= _.template(require('./../includes/footer.html'))(data) %> 

Header.htmlヘッダヌテンプレヌトファむル
 <!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="shortcut icon" href="favicon/favicon.ico"> <link rel="stylesheet" href="css/style.bundle.css"> <title><%=title%></title> </head> <body> <header><img src="img/logo.svg" id="logo"></header> 

Footer.htmlテンプレヌトファむル
 <footer><%=author%></footer> <script src="js/bundle.js"></script> </body> </html> 

生成されたindex.html
 <!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="shortcut icon" href="favicon/favicon.ico"> <link rel="stylesheet" href="css/style.bundle.css"> <title> | </title> </head> <body> <header><img src="img/logo.svg" id="logo"></header> <div class="container"> <p> .</p> <p><img src="uploads/test.jpg"></p> </div> <footer>Harrix</footer> <script src="js/bundle.js"></script> </body> </html> 

゜ヌスコヌド


レビュヌしたプロゞェクトのあるリポゞトリにリンクしたす。



Source: https://habr.com/ru/post/J350886/


All Articles