フロントアセンブリの構築と自動化にはかなりの時間を費やしました。 このタスクは興味深いもので、話す価値があります。
コレクターができること:
- 開発および実稼働環境のフロントエンドプロジェクトを収集します。
- プロジェクトごとに複数のjs / cssバンドルを収集します。
- ブラウザでCommonJSモジュールのスタイルを使用します。
- ES6構文を使用します。
- スプライト、写真など。
入門
考えを簡単にするために、プロジェクトテンプレートを使用してリポジトリへのリンクをすぐにスローします:
github.com/alexfedoseev/js-app-starter入手方法npmがインストールされていることを確認してください。
npm -v
必要なグローバルモジュールをインストールします(まだインストールされていない場合):
npm install -g gulp browserify babel jade stylus http-server
リポジトリの分岐を作成します。
git clone https://github.com/alexfedoseev/js-app-starter.git
プロジェクトの依存関係をインストールします(リポジトリのルートで実行):
npm install
開発環境でプロジェクトをビルドし、ローカルサーバーを起動します。
npm start
ブラウザーを開き、
lvh.mehaps500に移動し
ます コレクターとして
Gulpを使用します。
アセンブリプロセスには何が含まれ、どの技術が使用されますか。
一般的に、SlimとSassが好きですが、Ruby to Ruby、JS to JS:フロントエンドプロジェクトでは、npmのピースのみを使用します。 必要に応じて、任意のツールを交換できます。プロジェクト構造
| dist/ | lib/ |-- gulp/ |-- helpers/ |-- tasks/ |-- config.js | node_modules/ | public/ |-- css/ |-- files/ |-- fonts/ |-- img/ |-- js/ |-- json/ |-- favicon.ico |-- index.html | src/ |-- css/ |-- files/ |-- fonts/ |-- html/ |-- img/ |-- js/ |-- json/ |-- sprite/ |-- favicon.ico | .gitignore | .npmignore | gulpfile.js | npm-shrinkwrap.json | package.json
Github.gitignore &
.npmignoreこれらのファイルの中には、コミットと公開時にgitとnpmが無視するもののリストがあります。
node_modules /npmを介してインストールするすべてのモジュールは、このディレクトリに分類されます。
npm-shrinkwrap.jsonnode_modules /の内容をリポジトリに保持しません。 代わりに、このファイルを介してすべての依存関係を送信しています。 コマンド
`npm shrinkwrap`によって自動的に生成されます。
package.jsonこれは、グローバルプロジェクト設定を含むファイルです。 彼に戻ります。
gulpfile.js通常、プロジェクトをビルドするためにすべてのタスクがここに保存されますが、今回の場合は、環境変数の値を決定するだけで、gulpタスクが含まれるフォルダーにさらにスローされます。
lib / gulp /ここに、コレクターのすべての設定とタスクを保存します。
|-config.jsタスク自体の編集を最小限に抑えるために、すべてのタスクの設定を別のファイルに取り出します。
|-ヘルパー/コレクターのヘルパーメソッド。
|-タスク/そして、gulpタスク自体。
src /プロジェクトのソース。
公開/アセンブリの結果。 このフォルダーのすべてのコンテンツはコレクターによって生成され、新しいアセンブリが完全にクリアされる前に、ここには何も保存されません。
dist /時々私はオープンソースのモジュールを書きます。 このフォルダーには、アセンブリ後に、書かれたjsライブラリーの通常バージョンと縮小バージョンがあります。
public /ディレクトリは、デモのリポジトリとして使用されます。 通常のサイトまたはランディングページを作成している場合、それらは必要ありません。
プロジェクトのセットアップ
package.json
これは、グローバルプロジェクト設定が保存されるファイルです。
彼の内部の詳細な説明はここにあります:
browsenpm.org/package.json以下では、いくつかの重要な部分のみに焦点を当てます。
{
Githubコンソールコマンド
package.jsonでは、コンソールコマンドのエイリアスを指定できます。エイリアスは、開発プロセス中に頻繁に実行されます。
"scripts": { "start": "NODE_ENV=development http-server -a lvh.me -p 3500 & gulp", "build": "NODE_ENV=production gulp build" }
開発アセンブリプロジェクトで作業を開始する前に、次のものが必要です。
- ソースからコンパイルします(デバッグ用のソースマップを使用)
- ソースファイルを変更するときにプロジェクトを再構築する「オブザーバー」を起動します
- ローカルサーバーを起動
生産組立プロジェクトをリリースする準備ができたら、生産アセンブリを行います。
ガルプ
Gulpに渡します。 タスクの構造は、
Dan Telloのコレクターから取得されます。
ダイビングの前に、通常のgulpタスクの実行順序に関する短いコメント:
var gulp = require('gulp'); gulp.task('task_1', ['pre_task_1', 'pre_task_2'], function() { console.log('task_1 is done'); });
次に、何をどの順序で収集するかを考えてみましょう。
開発アセンブリ`npm start`は
gulp コマンドを実行します。 次に何が起こるか:
- Gulpは、現在のディレクトリでgulpfile.jsを探します。 通常、すべてのタスクがその中にスタックされますが、ここでは、彼は単に環境変数の値を決定し、gulpタスクを含むフォルダーにさらに投げ込みます。
- ディレクトリに転送された後、コレクターは`default`という名前のタスクを検索し、最初にソース上で「オブザーバー」を起動してから、
- `public /`および`dist /`フォルダをクリアします
- lintit jsファイル
- スプライトを収集します
その後、プロジェクトが組み立てられます(html、css、jsなど)。
コメント付きのコードデフォルト var gulp = require('gulp');
Github見る var gulp = require('gulp'), finder = require('../helpers/finder'),
Github建てる var gulp = require('gulp');
Github
生産組立すべてが彼女の方が簡単です。
「npm run build」は、「 gulp build」コマンドを起動します。この
コマンドは、ターゲットフォルダーlint js-codeをクリアし、スプライトを収集してから、プロジェクトをビルドします(ソースマップなし)。 上記のコメント付きのコード。
Gulpタスク設定ファイル
すべての主要な
タスク構成は、個別の
lib / gulp / config.jsファイルに移動され
ます 。
var pkg = require('../../package.json'),
GithubHTMLアセンブリ
テンプレートには
Jadeを使用します。 パーシャルの挿入、インラインjavascript、変数、ミックスイン、その他多くのクールなものを使用できます。
ガルプ構成 html: { src: _src + _html,
Githubタスク var gulp = require('gulp'), jade = require('gulp-jade'), jadeInherit = require('gulp-jade-inheritance'), gulpif = require('gulp-if'), changed = require('gulp-changed'), filter = require('gulp-filter'), notifier = require('../helpers/notifier'), config = require('../config').html; gulp.task('html', function(cb) {
Github ソースコードSrc / htmlフォルダー構造 | src |-- html |-- index.jade
Githubすべてのパーシャルは `_`(アンダースコア)で始まるため、アセンブリ中にそれらをフィルターして無視できます。
ヘルパー/ _variables.jade必要なパラメーターを変数に保存します。 たとえば、電話がページの複数の場所にある場合、変数に保存してテンプレートで使用することをお勧めします。
- var release = pkgVersion
Githubヘルパー/ _mixins.jade頻繁に使用されるブロックは、ミックスインでラップできます。
mixin phoneLink(phoneString) - var cleanPhone = phoneString.replace(/\(|\)|\s|\-/g, '') a(href="tel:#{cleanPhone}")= phoneString
Githubindex.jadeメインページのスケルトン。
include helpers/_variables
Githubmeta / _head.jadeヘッドコンテンツ。
meta(charset="utf-8") ...
Github JavaScriptアセンブリ
Browserifyはモジュラーシステムとして使用します。 これにより、ブラウザでCommonJSモジュールを直接接続するスタイルを使用できます。 さらに、ES6構文を使用できるようになりました。Browselifyがjsをビルドする前に、
BabelはそれをES5に変換します。
ビルドする前に
、jsHintを
実行してコードの品質を確認します。
Browserifyには1つの欠点があります。外部依存関係(jQueryプラグインなど)を使用してライブラリを作成すると、正しいUMDラッパーを作成できなくなります。 この場合、Browserifyを連結に置き換え、手でラッパーを記述します。バンドルについてプロジェクトでは、いくつかのjs / cssのセットを作成する必要がある場合があります。
たとえば、front + adminと記述します。 または、2つのバージョンのライブラリ:依存関係のない、jQueryプラグインの形式。 これらのアセンブリは分離する必要があります。 これを行うには、コレクターの設定で、配列を作成します。
var bundles = [ { name : 'myLib',
Githubjs / cssコレクターは、対応するエンドポイントファイル( `app.js`または` app.styl`)のjs / cssソースを含むフォルダーを検索します。 このエンドポイントファイルを通じて、すべてのバンドルの依存関係を管理します。 以下にその構造を示します。
バンドルをコレクターに渡す前に、設定でオブジェクトを形成する`bundler`ヘルパーに配列を渡します。 ガルプ構成 scripts: { bundles: bundler(bundles, _js, _src, _dist, _public),
Githubタスク var gulp = require('gulp'), browserify = require('browserify'), watchify = require('watchify'), uglify = require('gulp-uglify'), sourcemaps = require('gulp-sourcemaps'), derequire = require('gulp-derequire'), source = require('vinyl-source-stream'), buffer = require('vinyl-buffer'), rename = require('gulp-rename'), header = require('gulp-header'), gulpif = require('gulp-if'), notifier = require('../helpers/notifier'), config = require('../config').scripts; gulp.task('scripts', function(cb) {
Github ソースコードSrc / jsフォルダー構造 | src/ |-- js/ |-- components/
Githubapp.jsこのファイルを通じて、jsコンポーネントのすべての依存関係と実行順序を駆動します。 ファイル名はバンドルの名前と一致する必要があります。
import $ from 'jquery'; import myComponent from './components/my-component'; $(document).ready(() => { myComponent(); });
Github npmに依存関係がない場合の対処方法このような場合、
browserify-shimを使用します。これは、通常のライブラリをCommonJS互換モジュールに変換できるプラグインです。 それで、
nQueryにはないjQueryプラグイン
`maskedinput`があります。
変換を
「package.json」に追加し、依存関係設定を設定します。
"browserify": { "transform": [ "babelify", "browserify-shim"
その後、モジュールを接続できます。
require('maskedinput');
CSSアセンブリ
プリプロセッサとして
Stylusを使用します。 さらに、ベンダープレフィックスを手で登録しないように、css
自動プレフィックスを使用します。
ガルプ構成 css: { bundles: bundler(bundles, _css, _src, _dist, _public),
Githubタスク var gulp = require('gulp'), process = require('gulp-stylus'), prefix = require('gulp-autoprefixer'), compress = require('gulp-minify-css'), gulpif = require('gulp-if'), rename = require('gulp-rename'), notifier = require('../helpers/notifier'), config = require('../config').css; gulp.task('css', function(cb) { var queue = config.bundles.length; var buildThis = function(bundle) { var build = function() { return ( gulp.src(bundle.src) .pipe(process(config.params)) .pipe(prefix(config.autoprefixer)) .pipe(gulpif(bundle.compress, compress(config.compress))) .pipe(gulpif(bundle.compress, rename({suffix: '.min'}))) .pipe(gulp.dest(bundle.destPublicDir)) .on('end', handleQueue) ); }; var handleQueue = function() { notifier(bundle.destFile); if (queue) { queue--; if (queue === 0) cb(); } }; return build(); }; config.bundles.forEach(buildThis); });
Github ソースコードSRC / CSSフォルダー構造 | src/ |-- css/ |-- components/
Githubapp.stylこのファイルを介して、cssコンポーネントが接続される順序を制御します。 ファイル名はバンドルの名前と一致する必要があります。
@import "helpers/mixins" @import "helpers/classes" @import "globals/variables" @import "globals/normalize" @import "globals/z-index" @import "globals/fonts" @import "globals/global" @import "sprite/sprite" @import "vendor/*" @import "components/*"
Github 他のすべてのタスク-写真、スプライト、クリーニングなど-は、追加のコメントを必要としません(実際、私は既に落書きにうんざりしています)。 ソースはリポジトリにあります:
github.com/alexfedoseev/js-app-starter妨害や追加がある場合-ここでのコメントまたはGithubでの
問題 /プルリクエストを通じてフィードバックをお待ちしております。 頑張って!