加速MEAN应用开发:自动化与调试指南
一、使用NPM脚本自动化任务
在MEAN应用开发中,会涉及多个任务的协同操作。例如,运行应用时,需要先转译Angular文件,再启动Express应用,且这种操作会频繁重复,变得越来越复杂。为解决此问题,开发者倾向于自动化部分应用功能,并借助支持工具来提高开发效率。虽然有些开发者会使用Grunt或Gulp等第三方任务运行工具,但我们可以利用NPM来运行脚本。
查看
package.json
文件的
scripts
属性,示例如下:
"scripts": {
"tsc": "tsc",
"tsc:w": "tsc -w",
"app": "node server",
"start": "concurrently \"npm run tsc:w\" \"npm run app\" ",
"postinstall": "typings install"
}
这里已有五个脚本来管理应用开发。后续我们将学习如何添加更多脚本,利用NPM特性实现日常工作的自动化。接下来,我们先介绍Webpack模块打包工具。
二、引入Webpack
Webpack是由Tobias Koppers创建的流行模块打包工具,在JavaScript领域占据重要地位,成为生态系统中常用的工具之一。它旨在简化代码打包、模块化大型应用和代码分割,经过多年的积极开发,如今具备了更多功能,如资产打包、预处理和优化等。下面我们将学习如何用Webpack替代SystemJS来打包和加载Angular模块。
2.1 安装Webpack
在配置Webpack之前,需使用
npm
安装其依赖项。修改
package.json
文件如下:
{
"name": "MEAN",
"version": "0.0.11",
"scripts": {
"tsc": "tsc",
"tsc:w": "tsc -w",
"app": "node server",
"start": "concurrently \"npm run webpack\" \"npm run app\" ",
"postinstall": "typings install",
"webpack": "webpack --watch"
},
"dependencies": {
"@angular/common": "2.1.1",
"@angular/compiler": "2.1.1",
"@angular/core": "2.1.1",
"@angular/forms": "2.1.1",
"@angular/http": "2.1.1",
"@angular/platform-browser": "2.1.1",
"@angular/platform-browser-dynamic": "2.1.1",
"@angular/router": "3.1.1",
"body-parser": "1.15.2",
"core-js": "2.4.1",
"compression": "~1.6.0",
"connect-flash": "0.1.1",
"connect-mongo": "1.3.2",
"cookie-parser": "1.4.3",
"ejs": "2.5.2",
"es6-promise": "4.0.5",
"express": "4.14.0",
"express-session": "1.14.1",
"method-override": "2.3.6",
"mongoose": "4.6.5",
"morgan": "1.7.0",
"passport": "0.3.2",
"passport-facebook": "2.1.1",
"passport-google-oauth": "1.0.0",
"passport-local": "1.0.0",
"passport-twitter": "1.0.4",
"phantomjs-prebuilt": "2.1.13",
"reflect-metadata": "0.1.8",
"rxjs": "5.0.0-beta.12",
"socket.io": "1.4.5",
"systemjs": "0.19.39",
"zone.js": "0.6.26"
},
"devDependencies": {
"awesome-typescript-loader": "2.2.4",
"concurrently": "3.1.0",
"jasmine": "2.5.2",
"jasmine-core": "2.5.2",
"karma": "1.3.0",
"karma-jasmine": "1.0.2",
"karma-phantomjs-launcher": "1.0.2",
"should": "11.1.1",
"supertest": "2.0.1",
"traceur": "0.0.111",
"typescript": "2.0.3",
"typings": "1.4.0",
"webpack": "1.13.3"
}
}
这里将Webpack和TypeScript加载器添加到
devDependencies
属性中,同时添加了一个Webpack脚本以“Watch”模式运行Webpack,使文件更改时能自动更新。还修改了NPM的
start
脚本,使用Webpack替代TypeScript命令行工具来转译Angular文件。
安装新依赖项,在应用根目录的命令行工具中执行:
$ npm install
安装完成后,即可使用这些模块运行Webpack并打包TypeScript模块。接下来,我们将学习如何配置Webpack。
2.2 配置Webpack
为控制Webpack的执行,需在应用根目录创建一个特殊的配置文件。Webpack默认会查找名为
webpack.config.js
的配置文件,也可通过命令行标志指定配置文件名,这里我们使用默认文件名。
在应用根目录创建
webpack.config.js
文件,并粘贴以下代码:
const webpack = require('webpack');
module.exports = {
entry: {
'polyfills': './public/polyfills',
'vendor': './public/vendor',
'bootstrap': './public/bootstrap'
},
devtool: 'source-map',
resolve: {
extensions: ['', '.js', '.ts']
},
output: {
path: 'public/build',
filename: '[name].js'
},
module: {
loaders: [
{
test: /\.ts$/,
loaders: ['awesome-typescript-loader']
}
]
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: ['bootstrap', 'vendor', 'polyfills']
})
]
};
Webpack配置文件用于设置模块的构建方式,各配置项说明如下:
-
entry
:指定应用的入口点,将应用打包成三个不同的文件,分别是包含所有polyfills相关模块的
polyfills
文件、包含所有第三方模块(如Angular核心模块)的
vendor
文件,以及包含Angular应用文件的
bootstrap
文件。
-
devtool
:指定开发工具,这里让Webpack为转译后的应用文件创建映射文件。
-
resolve
:指定要解析的模块扩展名,包括无扩展名的模块导入、TypeScript和JavaScript文件。
-
output
:设置输出文件的保存方式,将打包文件保存到
public/build
文件夹,文件扩展名为
.js
。
-
module
:列出Webpack将使用的模块,这里让Webpack使用之前安装的TypeScript加载器加载所有TypeScript文件。
-
optimize
:设置模块打包的优化方式,确保每个模块只打包一次。例如,若在
Bootstrap
文件和
Vendor
文件中发现共同的模块导入,Webpack只会在
vendor
文件中打包一次。
这些配置属性会根据项目需求而变化。接下来,我们创建缺失的文件。
2.3 创建缺失文件
-
创建
polyfills.ts文件 :在public文件夹中创建该文件,并粘贴以下代码:
import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/set';
import 'core-js/es6/weak-map';
import 'core-js/es6/weak-set';
import 'core-js/es6/typed';
import 'core-js/es6/reflect';
import 'core-js/es7/reflect';
import 'zone.js/dist/zone';
import 'zone.js/dist/long-stack-trace-zone';
此文件包含所有的polyfills库。
-
创建
vendor.ts文件 :在public文件夹中创建该文件,并粘贴以下代码:
import '@angular/common';
import '@angular/compiler';
import '@angular/core';
import '@angular/forms';
import '@angular/http';
import '@angular/router';
import '@angular/platform-browser';
import '@angular/platform-browser-dynamic';
import 'rxjs';
该文件包含Angular和RXJS库的所有核心模块。
-
创建
bootstrap.ts文件 :在public文件夹中创建该文件,并粘贴以下代码:
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
这是之前章节中的应用启动文件。
2.4 修改主应用页面
打开
app/views/index.ejs
文件,进行如下修改:
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<base href="/">
</head>
<body>
<mean-app>
<h1>Loading...</h1>
</mean-app>
<script type="text/javascript">
window.user = <%- user || 'null' %>;
</script>
<script src="/socket.io/socket.io.js"></script>
<script src="build/polyfills.js"></script>
<script src="build/vendor.js"></script>
<script src="build/bootstrap.js"></script>
</body>
</html>
这里用新的打包脚本文件替换了旧的脚本文件。完成这些更改后,Webpack配置即可使用。在命令行工具中导航到MEAN应用的根目录,运行以下命令启动应用:
$ npm start
应用运行且Webpack完成代码打包后,访问
http://localhost:3000/
测试应用。这只是基本设置,建议进一步学习Webpack的其他功能。
三、引入ESLint
在软件开发中,代码检查(linting)是使用专用工具识别可疑代码使用情况的过程。在MEAN应用中,代码检查有助于避免日常开发中的常见错误和编码问题,还能统一团队的代码风格。我们生态系统中最常用的代码检查工具是ESLint,它是Nicholas C. Zakas在2013年创建的可插拔代码检查工具,可根据一组规则和预设配置对JavaScript代码进行检查。
3.1 安装ESLint
在配置ESLint之前,需使用
npm
安装ESLint包。修改
package.json
文件如下:
{
"name": "MEAN",
"version": "0.0.11",
"scripts": {
"tsc": "tsc",
"tsc:w": "tsc -w",
"app": "node server",
"start": "concurrently \"npm run webpack\" \"npm run app\" ",
"postinstall": "typings install",
"webpack": "webpack --watch",
"lint": "eslint --ext .js ./config ./app ./*.js"
},
"dependencies": {
"@angular/common": "2.1.1",
"@angular/compiler": "2.1.1",
"@angular/core": "2.1.1",
"@angular/forms": "2.1.1",
"@angular/http": "2.1.1",
"@angular/platform-browser": "2.1.1",
"@angular/platform-browser-dynamic": "2.1.1",
"@angular/router": "3.1.1",
"body-parser": "1.15.2",
"core-js": "2.4.1",
"compression": "~1.6.0",
"connect-flash": "0.1.1",
"connect-mongo": "1.3.2",
"cookie-parser": "1.4.3",
"ejs": "2.5.2",
"es6-promise": "4.0.5",
"express": "4.14.0",
"express-session": "1.14.1",
"method-override": "2.3.6",
"mongoose": "4.6.5",
"morgan": "1.7.0",
"passport": "0.3.2",
"passport-facebook": "2.1.1",
"passport-google-oauth": "1.0.0",
"passport-local": "1.0.0",
"passport-twitter": "1.0.4",
"phantomjs-prebuilt": "2.1.13",
"reflect-metadata": "0.1.8",
"rxjs": "5.0.0-beta.12",
"socket.io": "1.4.5",
"systemjs": "0.19.39",
"zone.js": "0.6.26"
},
"devDependencies": {
"awesome-typescript-loader": "2.2.4",
"concurrently": "3.1.0",
"eslint": "3.10.2",
"jasmine": "2.5.2",
"jasmine-core": "2.5.2",
"karma": "1.3.0",
"karma-jasmine": "1.0.2",
"karma-phantomjs-launcher": "1.0.2",
"should": "11.1.1",
"supertest": "2.0.1",
"traceur": "0.0.111",
"typescript": "2.0.3",
"typings": "1.4.0",
"webpack": "1.13.3"
}
}
这里将ESLint包添加到
devDependencies
属性中,同时添加了一个
lint
脚本来运行ESLint,并对
app
和
config
文件夹中的JavaScript文件进行检查。
在应用根目录的命令行工具中执行以下命令安装新依赖项:
$ npm install
安装完成后,我们将学习如何配置ESLint。
3.2 配置ESLint
为控制ESLint的执行,需在应用根目录创建一个特殊的配置文件。ESLint默认会查找名为
.eslintrc
的配置文件。在应用根目录创建
.eslintrc
文件,并粘贴以下JSON对象:
{
"parserOptions": {
"ecmaVersion": 6
}
}
这个简单的配置告诉ESLint我们的代码是用ECMAScript 6编写的。ESLint功能强大,例如,可通过以下配置让ESLint验证代码缩进:
{
"parserOptions": {
"ecmaVersion": 6
},
"rules": {
"indent": ["error", 2]
}
}
这会让ESLint期望代码文件采用两个空格的缩进。通常,还可以使用
extend
属性扩展现有的配置文件,示例如下:
{
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 6
}
}
这会扩展ESLint的推荐规则集。这些只是简单示例,建议进一步学习ESLint,为项目找到最佳配置。在命令行工具中执行以下命令运行代码检查任务:
$ npm run lint
代码检查结果将在命令行工具中显示。ESLint是一个强大的工具,但目前需要手动运行代码检查任务,更好的做法是在文件修改时自动运行该任务。
四、使用Nodemon
使用Node命令行工具运行应用看似简单,但在持续开发过程中,会频繁停止和启动应用服务器。为解决这个问题,我们可以使用Nodemon,它是一个Node.js命令行工具,作为简单
node
命令行工具的包装器,可监控应用文件的更改,当检测到文件更改时,会自动重启Node服务器以更新应用。
4.1 修改package.json文件
修改
package.json
文件如下:
{
"name": "MEAN",
"version": "0.0.11",
"scripts": {
"tsc": "tsc",
"tsc:w": "tsc -w",
"app": "node server",
"app:dev": "npm run lint && npm run app",
"nodemon": "nodemon -w app -w config -w server.js --exec npm run app:dev",
"start": "concurrently \"npm run webpack\" \"npm run nodemon\"",
"postinstall": "typings install",
"webpack": "webpack --watch",
"lint": "eslint --ext .js ./config ./app ./*.js"
},
"dependencies": {
"@angular/common": "2.1.1",
"@angular/compiler": "2.1.1",
"@angular/core": "2.1.1",
"@angular/forms": "2.1.1",
"@angular/http": "2.1.1",
"@angular/platform-browser": "2.1.1",
"@angular/platform-browser-dynamic": "2.1.1",
"@angular/router": "3.1.1",
"body-parser": "1.15.2",
"core-js": "2.4.1",
"compression": "~1.6.0",
"connect-flash": "0.1.1",
"connect-mongo": "1.3.2",
"cookie-parser": "1.4.3",
"ejs": "2.5.2",
"es6-promise": "4.0.5",
"express": "4.14.0",
"express-session": "1.14.1",
"method-override": "2.3.6",
"mongoose": "4.6.5",
"morgan": "1.7.0",
"passport": "0.3.2",
"passport-facebook": "2.1.1",
"passport-google-oauth": "1.0.0",
"passport-local": "1.0.0",
"passport-twitter": "1.0.4",
"phantomjs-prebuilt": "2.1.13",
"reflect-metadata": "0.1.8",
"rxjs": "5.0.0-beta.12",
"socket.io": "1.4.5",
"systemjs": "0.19.39",
"zone.js": "0.6.26"
},
"devDependencies": {
"awesome-typescript-loader": "2.2.4",
"concurrently": "3.1.0",
"eslint": "3.10.2",
"jasmine": "2.5.2",
"jasmine-core": "2.5.2",
"karma": "1.3.0",
"karma-jasmine": "1.0.2",
"karma-phantomjs-launcher": "1.0.2",
"nodemon": "1.11.0",
"should": "11.1.1",
"supertest": "2.0.1",
"traceur": "0.0.111",
"typescript": "2.0.3",
"typings": "1.4.0",
"webpack": "1.13.3"
}
}
这里将Nodemon包添加到开发依赖项中,同时添加了两个新脚本并修改了
start
脚本:
-
app:dev
:运行
lint
和
app
脚本。
-
nodemon
:监控所有服务器JavaScript文件,文件修改时运行
app:dev
脚本。
-
start
:并发执行Webpack和Nodemon脚本。
4.2 安装Nodemon并启动应用
在应用根目录的命令行工具中执行以下命令安装Nodemon包:
$ npm install
然后使用常规的
start
命令启动应用:
$ npm start
应用将以新的设置启动。尝试修改Angular或Express应用文件,会发现更改服务器文件时应用会重启,更改Angular文件时Webpack会自动编译代码。
五、使用V8 Inspector调试Express应用
调试MEAN应用的Express部分可能是一项复杂的任务,但V8 Inspector工具可以解决这个问题。V8 Inspector是一个调试工具,它使用Blink(WebKit的一个分支)开发者工具,使用Google Chrome浏览器的开发者对其以Chrome开发者工具界面的形式并不陌生。V8 Inspector支持以下强大的调试功能:
- 源代码文件导航
- 断点操作
- 单步执行、进入、跳出和恢复执行
- 变量和属性检查
- 实时代码编辑
5.1 添加调试脚本
为了使用V8 Inspector调试应用,需要在
package.json
文件中添加一个
debug
脚本,如下所示:
{
"name": "MEAN",
"version": "0.0.11",
"scripts": {
"tsc": "tsc",
"tsc:w": "tsc -w",
"app": "node server",
"app:dev": "npm run lint && npm run app",
"nodemon": "nodemon -w app -w config -w server.js --exec npm run app:dev",
"start": "concurrently \"npm run webpack\" \"npm run nodemon\"",
"debug": "node --inspect --debug-brk server.js",
"postinstall": "typings install",
"webpack": "webpack --watch",
"lint": "eslint --ext .js ./config ./app ./*.js"
},
"dependencies": {
"@angular/common": "2.1.1",
"@angular/compiler": "2.1.1",
"@angular/core": "2.1.1",
"@angular/forms": "2.1.1",
"@angular/http": "2.1.1",
"@angular/platform-browser": "2.1.1",
"@angular/platform-browser-dynamic": "2.1.1",
"@angular/router": "3.1.1",
"body-parser": "1.15.2",
"core-js": "2.4.1",
"compression": "~1.6.0",
"connect-flash": "0.1.1",
"connect-mongo": "1.3.2",
"cookie-parser": "1.4.3",
"ejs": "2.5.2",
"es6-promise": "4.0.5",
"express": "4.14.0",
"express-session": "1.14.1",
"method-override": "2.3.6",
"mongoose": "4.6.5",
"morgan": "1.7.0",
"passport": "0.3.2",
"passport-facebook": "2.1.1",
"passport-google-oauth": "1.0.0",
"passport-local": "1.0.0",
"passport-twitter": "1.0.4",
"phantomjs-prebuilt": "2.1.13",
"reflect-metadata": "0.1.8",
"rxjs": "5.0.0-beta.12",
"socket.io": "1.4.5",
"systemjs": "0.19.39",
"zone.js": "0.6.26"
},
"devDependencies": {
"awesome-typescript-loader": "2.2.4",
"concurrently": "3.1.0",
"eslint": "3.10.2",
"jasmine": "2.5.2",
"jasmine-core": "2.5.2",
"karma": "1.3.0",
"karma-jasmine": "1.0.2",
"karma-phantomjs-launcher": "1.0.2",
"nodemon": "1.11.0",
"should": "11.1.1",
"supertest": "2.0.1",
"traceur": "0.0.111",
"typescript": "2.0.3",
"typings": "1.4.0",
"webpack": "1.13.3"
}
}
新脚本中,使用了两个命令行标志运行应用:
-
--inspect
:允许将Chrome开发者工具附加到Node.js实例。
-
--debug-brk
:防止Node.js在附加调试器之前运行代码。
5.2 运行应用并调试
接下来,使用新脚本运行应用并进行调试。在命令行中执行以下命令:
$ npm run debug
启动应用后,打开兼容的Web浏览器,访问相应的调试界面(通常在Chrome浏览器中可以通过特定的URL访问),即可使用Chrome开发者工具界面调试应用代码。
综上所述,通过使用NPM脚本、Webpack、ESLint、Nodemon和V8 Inspector等工具,我们可以显著提高MEAN应用的开发效率,减少开发过程中的错误,并更轻松地进行调试。这些工具各自发挥着重要的作用,相互配合,为开发者提供了一个强大而高效的开发环境。希望这些工具和方法能帮助你在MEAN应用开发中取得更好的成果。
六、使用Angular Augury调试Angular应用内部
6.1 Angular Augury简介
Angular Augury是专门用于调试Angular应用内部的强大工具。在开发Angular应用时,我们经常需要深入了解组件的结构、数据流和状态变化等信息,而Angular Augury能帮助我们直观地查看和分析这些内容,从而更高效地排查和解决问题。
6.2 安装Angular Augury
Angular Augury通常以浏览器扩展的形式提供,不同浏览器的安装方式略有不同,以下以Chrome浏览器为例:
1. 打开Chrome浏览器,访问Chrome网上应用店。
2. 在搜索框中输入“Angular Augury”。
3. 在搜索结果中找到Angular Augury扩展程序,并点击“添加至Chrome”按钮。
4. 确认安装,等待安装完成。
6.3 使用Angular Augury调试
安装完成后,当你打开一个Angular应用时,在浏览器的开发者工具中会出现Augury的选项卡。下面介绍一些常用的调试功能:
-
组件树查看
:在Augury的界面中,可以清晰地看到应用的组件树结构,了解组件之间的嵌套关系。这有助于我们快速定位到需要调试的组件。
-
数据流分析
:可以查看组件之间的数据流动情况,包括输入输出属性的变化。当数据出现异常时,通过分析数据流能快速找到问题所在。
-
状态监控
:监控组件的状态变化,例如组件的生命周期钩子函数的执行情况、属性值的更新等。这对于调试复杂的交互逻辑非常有帮助。
七、自动化与调试工具总结
7.1 工具对比
为了更清晰地了解各个工具的作用和特点,我们将它们进行对比,如下表所示:
| 工具名称 | 主要作用 | 使用场景 |
| ---- | ---- | ---- |
| NPM脚本 | 自动化日常开发任务,如文件转译、应用启动等 | 简化开发流程,提高开发效率 |
| Webpack | 模块打包,将多个模块打包成一个或多个文件 | 优化应用加载速度,管理模块依赖 |
| ESLint | 代码检查,识别可疑代码和统一代码风格 | 避免常见错误,提高代码质量 |
| Nodemon | 监控文件变化,自动重启服务器 | 持续开发过程中,减少手动重启服务器的操作 |
| V8 Inspector | 调试Express应用 | 解决Express部分的调试难题 |
| Angular Augury | 调试Angular应用内部 | 深入了解Angular组件的结构和数据流 |
7.2 工作流程优化
结合这些工具,我们可以优化MEAN应用的开发工作流程,以下是一个简单的mermaid流程图:
graph LR
A[开始开发] --> B[使用NPM脚本启动开发环境]
B --> C[Webpack自动打包模块]
C --> D[ESLint实时检查代码]
D --> E[Nodemon监控文件变化并重启服务器]
E --> F[开发过程中使用V8 Inspector调试Express]
E --> G[使用Angular Augury调试Angular]
F --> H[完成开发]
G --> H
7.3 注意事项
在使用这些工具时,也有一些需要注意的地方:
-
版本兼容性
:不同工具之间可能存在版本兼容性问题,在安装和使用时要确保各个工具的版本相互兼容。例如,Webpack和TypeScript加载器的版本需要匹配。
-
配置调整
:每个工具都有丰富的配置选项,需要根据项目的具体需求进行调整。例如,ESLint的配置文件可以根据团队的代码风格进行定制。
-
性能优化
:虽然这些工具能提高开发效率,但在生产环境中,要注意对打包文件和代码进行性能优化,避免过度依赖开发工具带来的额外开销。
八、总结与展望
8.1 总结
通过本文的介绍,我们学习了一系列用于加速MEAN应用开发的自动化和调试工具。NPM脚本让我们能够自动化日常开发任务,Webpack帮助我们优化模块打包,ESLint保证代码质量,Nodemon提高开发的连续性,V8 Inspector和Angular Augury分别解决了Express和Angular部分的调试难题。这些工具相互配合,为我们构建了一个高效的开发环境。
8.2 展望
随着技术的不断发展,未来可能会出现更多更强大的自动化和调试工具。同时,现有的工具也会不断更新和完善,提供更多的功能和更好的性能。作为开发者,我们需要持续关注这些工具的发展动态,不断学习和掌握新的技术,以适应不断变化的开发需求。在后续的开发过程中,我们可以进一步探索这些工具的高级用法,结合项目实际情况进行灵活运用,从而不断提升MEAN应用的开发效率和质量。
希望本文介绍的工具和方法能对你的MEAN应用开发有所帮助,让你在开发过程中更加得心应手,取得更好的开发成果。
超级会员免费看
5612

被折叠的 条评论
为什么被折叠?



