Node中間層の実践(二)——プロジェクトの枠組みを構築する
9079 ワード
以上の文章は私の個人駅を訪問してください.
Keyon、転載は出典を明記してください.
プロジェクト住所:https://github.com/KeyonY/NodeMiddle
足場
anglar 2を使ったことがありますが、vue 2の学生はみんな知っています.公式の推奨のインストール方法は専用のanglar-cli、vue-cliによって、webpackによってコンパイルされ、パッケージ化されたプロジェクトフレームを快速に構築します.
この二つのツールの啓発を受けて、プロジェクトの初めにwebpackベースのプロジェクトフレームを開発しました. expressを使ってwebpack-dev-middlewareとwebpack-hot-middlewareを搭載して熱負荷を行います. は、dev(開発環境)とproduction(生産環境)の2つの起動方式 を内蔵する.
技術の選択
node開発フレームワーク
expressとkoaは二番目に一つを選びます. expressのはWeb Frame ewarkという概念により近いです. express機能は極めて簡単で、ルートとミドルウェアから構成されたウェブ開発フレームです.本質的には、Expressアプリケーションは各種のミドルウェアを呼び出しています. koaはcoを下のフレームとして使用して、いつコールバック関数またはコールバックシェルを忘れました. expressの歴史はもっと長くて、容量が大きくて、文書が完備していて、第三者の中間部品も多いです. 私はexpressをnode開発の枠組みとして選んだ.
テンプレートエンジン
前にNODEでレスFullのウェブサイト(詳しくは私のブログ-NodeJS開発個人ブログサイト参照)を書いたので、jadeに詳しいです.今回は直接にpugをサーバー端のテンプレートエンジンとして選びました.pugは比較的柔軟なサーバー側テンプレートです.expressの配置も簡単です.ルートディレクトリのap.jsファイルに配置します.
//テンプレートエンジンの種類を設定する
app.set('view engine'、'pug')
//テンプレートファイルパスの設定
app.set('view's,path.resove);
このように、expressでレンダリングする際には、res.render(''Home/index'、})、対応するページテンプレートのパスを指定すればいいです.第二のパラメータはpugページで使用するデータの内容、json形式です.
中間層とバックエンドの非同期通信
実はajaxライブラリです.だからaxiosを選びました.vue 2の公式推奨のajaxライブラリで、内蔵のaxios.allは中間層で複数のバックエンドを代理して一緒に返してくれます.Bigpipeを簡単に実現できます.
モジュール化
ウェブサイトのフロントページですので、SEOを考慮して、フロントフレームが使えないので、考え方を変えてwebpack+s 6/AMDを使ってモジュール化を実現します.そこで、webpackをカプセル化機+View層のモジュール化として使用し、フロントエンドレベルでモジュール化とコンポーネント化を実現しました.es 6はControl層でモジュール化され、node中間層でモジュール化されました.
環境設定(起動ファイル)
プロジェクトのスタートファイルとして、app.jsはexpressの配置ファイルであり、開発環境/生産環境の配置ファイルでもあります.
node起動時に設定したコマンドパラメータは、ap.jsでパラメータを受信し、対応する環境を実行します.
私たちはcross-envというプラグインをインストールしたいです.
npm i--save-dev cross-env
package.jsonのscriptsに配置する:
ここに開発環境と生産環境を配置しました.開発環境:コードを圧縮せず、devtoolを開いてsource-mapを生成し、デバッグコードを容易にする. 生産環境:webpackで包装、圧縮、混淆操作を行い、最終的に完全なコード(アプリケーション)をdistディレクトリに出力してから、nodeサーバを起動して、アプリケーションを実行します. 上記のコードにはsupervisorプラグインも使用されています.これはnodeプロファイルの変更を傍受し、自動的にnodeを再起動します.
npm i--save-dev supervisor
先端レベルはwebpack-dev-middlewareとwebpack-hot-middlewareを使用して熱負荷を実現しました.
このように,中間層から先端まで熱負荷を実現した.
node中間層配置
ルートディレクトリの下に新しいconfigフォルダを作成して、いくつかのよく使われている構成/パラメータ、方法を引き出して、config/config.jsとconfig/common.jsの中に書きました.
例えば、中間層で起動されるポート番号、アプリケーションのルートディレクトリ、AMD仕様で使用されるすべてのファイルに一括して導入されています.
app.js
Error Handleのパラメータは4つなので、最初のパラメータerrはルートのnext(err)を通して投げられます.このようにすべてのルートは随時errorを投げ出して、Err Handleに捕獲されます.
ディレクトリ構造を見てみます.
Keyon、転載は出典を明記してください.
プロジェクト住所:https://github.com/KeyonY/NodeMiddle
足場
anglar 2を使ったことがありますが、vue 2の学生はみんな知っています.公式の推奨のインストール方法は専用のanglar-cli、vue-cliによって、webpackによってコンパイルされ、パッケージ化されたプロジェクトフレームを快速に構築します.
この二つのツールの啓発を受けて、プロジェクトの初めにwebpackベースのプロジェクトフレームを開発しました.
技術の選択
node開発フレームワーク
expressとkoaは二番目に一つを選びます.
テンプレートエンジン
前にNODEでレスFullのウェブサイト(詳しくは私のブログ-NodeJS開発個人ブログサイト参照)を書いたので、jadeに詳しいです.今回は直接にpugをサーバー端のテンプレートエンジンとして選びました.pugは比較的柔軟なサーバー側テンプレートです.expressの配置も簡単です.ルートディレクトリのap.jsファイルに配置します.
//テンプレートエンジンの種類を設定する
app.set('view engine'、'pug')
//テンプレートファイルパスの設定
app.set('view's,path.resove);
このように、expressでレンダリングする際には、res.render(''Home/index'、})、対応するページテンプレートのパスを指定すればいいです.第二のパラメータはpugページで使用するデータの内容、json形式です.
中間層とバックエンドの非同期通信
実はajaxライブラリです.だからaxiosを選びました.vue 2の公式推奨のajaxライブラリで、内蔵のaxios.allは中間層で複数のバックエンドを代理して一緒に返してくれます.Bigpipeを簡単に実現できます.
モジュール化
ウェブサイトのフロントページですので、SEOを考慮して、フロントフレームが使えないので、考え方を変えてwebpack+s 6/AMDを使ってモジュール化を実現します.そこで、webpackをカプセル化機+View層のモジュール化として使用し、フロントエンドレベルでモジュール化とコンポーネント化を実現しました.es 6はControl層でモジュール化され、node中間層でモジュール化されました.
環境設定(起動ファイル)
プロジェクトのスタートファイルとして、app.jsはexpressの配置ファイルであり、開発環境/生産環境の配置ファイルでもあります.
node起動時に設定したコマンドパラメータは、ap.jsでパラメータを受信し、対応する環境を実行します.
私たちはcross-envというプラグインをインストールしたいです.
npm i--save-dev cross-env
package.jsonのscriptsに配置する:
...
"scripts": {
"start": "cross-env NODE_ENV=production node app.js",
"dev": "cross-env NODE_ENV=dev supervisor -w app.js app",
"build": "webpack --config build/webpack.prod.config.js"
}
...
このようにプロcess.env.NODE_を使います.ENVはnode起動の環境パラメータを取得できます.ここに開発環境と生産環境を配置しました.
npm i--save-dev supervisor
先端レベルはwebpack-dev-middlewareとwebpack-hot-middlewareを使用して熱負荷を実現しました.
このように,中間層から先端まで熱負荷を実現した.
node中間層配置
ルートディレクトリの下に新しいconfigフォルダを作成して、いくつかのよく使われている構成/パラメータ、方法を引き出して、config/config.jsとconfig/common.jsの中に書きました.
例えば、中間層で起動されるポート番号、アプリケーションのルートディレクトリ、AMD仕様で使用されるすべてのファイルに一括して導入されています.
app.js
var express = require('express');
var cookieParser = require('cookie-parser');
var path = require('path');
var localOptions = require('./build/localOptions');
var config = require('./config/config');
var bodyParser = require('body-parser');
var auth = require('./middleware/auth');
var log4js = require('./config/log4js');
process.env.NODE_ENV = process.env.NODE_ENV ? process.env.NODE_ENV : 'production';
var isDev = process.env.NODE_ENV === 'dev';
var app = express();
var port = config.port;
app.set('view engine', 'pug');
//
if (isDev){
app.set('views', path.resolve(__dirname, 'src/Views'));
}else {
app.set('views', path.resolve(__dirname, 'dist/Views'));
}
// app.locals
app.locals.env = process.env.NODE_ENV || 'dev';
app.locals.reload = true;
app.use(cookieParser());
app.use(bodyParser.urlencoded({extended: false}));
if (isDev) {
// app.locals.pretty = true;
// ,
var webpack = require('webpack');
var webpackDevMiddleware = require('webpack-dev-middleware');
var webpackHotMiddleware = require('webpack-hot-middleware');
var webpackDevConfig = require('./build/webpack.dev.config.js');
var compiler = webpack(webpackDevConfig);
//
app.use(webpackDevMiddleware(compiler, {
publicPath: webpackDevConfig.output.publicPath,
noInfo: true,
stats: 'errors-only'
}))
app.use(webpackHotMiddleware(compiler, {
heartbeat: 1000,
noInfo: true,
}));
//
var reload = require('reload');
var http = require('http');
var server = http.createServer(app);
// reload(server, app);
reload(app);
server.listen(port, () => {
console.log('App【dev】 is now running on port ' + port + '!');
});
// , vendor.js ;
// reload , reload.js
app.use(express.static(path.join(config.root, 'src')));
app.use('/', require(path.join(config.configRoot,'/routes')));
}else {
// , node
// node
app.use(express.static(path.join(config.root, 'dist')));
app.use('/',require(path.join(config.configRoot,'/routes')));
// app.listen(process.env.PORT, () => {
app.listen(port, () => {
console.log('App【production】 is now running on port ' + port + '!');
})
}
// 404 error
app.use('*', auth, (req, res, next) => {
let err = new Error('Not Found');
err.status = 404;
next(err);
});
// error, error
app.use((err, req, res, next) => {
const sc = err.status || 500;
if(err.status == 405){
res.redirect(config.cndesignOrigin + '/Home/GuideAuthentication');
return;
}
res.status(sc);
//
log4js.error('\r
Status: '+ sc + "\r
Message: " + err.message + "\r
Href: " + localOptions.baseUrl + req.originalUrl + "\r
User-agent: " + req.headers['user-agent']);
res.render('Error/404', {
error: err,
status: sc,
message: err.message,
userInfo: req.userInfo_ || { hasLogin: false }
});
});
Errer Handleのマウントの順番に注意して、一般的にはap.use()の下にマウントされ、最後に置く.Error Handleのパラメータは4つなので、最初のパラメータerrはルートのnext(err)を通して投げられます.このようにすべてのルートは随時errorを投げ出して、Err Handleに捕獲されます.
ディレクトリ構造を見てみます.
App
├─ .babelrc // babel
├─ ReadMe
├─ app.js //
├─ build // webpack
│ ├─ entrys.js // webpack js css
│ ├─ localOptions.js // , ip
│ ├─ postcss.config.js // postcss
│ ├─ webpack.dev.config.js // webpack
│ ├─ webpack.dll.config.js // webpack.DllReferencePlugin
│ └─ webpack.prod.config.js // webpack
├─ config // Model : node 、
│ ├─ common.js //
│ ├─ config.js // node
│ └─ routes //
│ ├─ default.js
│ ├─ designers.js
│ ├─ home.js
│ └─ index.js //
├─ package.json
└─ src // View
├─ Components //
│ ├─ base
│ ├─ home
│ ├─ index
│ ├─ message
│ ├─ modals
│ ├─ page
├─ Views //
│ ├─ Default
│ ├─ Error
│ ├─ Home
│ ├─ Include
│ ├─ Messages
│ └─ Shared
└─ assets //
├─ Jcrop
├─ es5-shim-master
├─ images
├─ jquery-1.10.2.min.js
├─ jquery-ui-1.8.24.min.js
└─ layui
引き続き本博の更新に注目してください.Node中間層実践(一)——NodeJSに基づく全桟式開発 Node中間層の実践(二)——プロジェクトの枠組みを構築する Node中間層実践(三)——webpack配置 Node中間層実践(四)テンプレートエンジンpug Node中間層実践(五)——express-中間層の論理処理