在现代Web开发中,构建工具和语言的选择对于提高开发效率和应用性能至关重要。TypeScript作为一种JavaScript的超集,提供了静态类型检查和ES6+的语法特性,而Gulp则是一种基于流的自动化构建工具,可以处理多种开发任务。本文将介绍如何结合使用TypeScript和Gulp来构建一个现代Web应用,并设置环境变量以适应不同的开发和生产环境。
Microsoft的ASP.NET提供了一个强大的优化引擎,用于JavaScript、CSS和其他资源,开发者可以利用它来打包、优化和构建现代Web应用。这个优化引擎基于Visual Studio.NET解决方案的环境设置,并且构建框架内置于Visual Studio.NET的工具中。在开源社区,每个项目都需要开发自己的构建工具和方法来支持各种构建输出。本文将专注于开发和生产环境路径的构建。
Gulp命令行接口(CLI)支持通过命令行扩展变量输入的能力。将使用YARGS npm包来实现以下命令行语法:
gulp --env prod
由于将使用TypeScript来实现功能,需要记住的是,尽管TypeScript不能与C#或Java等语言的类型系统相比,但它允许在项目中声明类型。TypeScript的类型系统非常灵活,允许编写适合需求的自定义类型定义,或者使用tsd工具来安装开源社区预定义的类型定义。
要开始,需要克隆本文的基础代码,如下所示:
git clone -b 01-init https://github.com/kdcllc/Angular-TypeScript-Starter.git
如果机器上没有安装Git并且想按照步骤操作,可以在这里下载源代码。项目不包含其依赖项,需要运行以下命令:
npm i
tsd install
如所见,需要执行两个不同的命令来下载项目依赖项。如果可以通过运行一个命令来完成呢?实际上有一种方法可以在一个命令中实现。
package.json文件包含有关Node.js执行环境的信息,可以在“scripts”节点下添加以下内容:
"postinstall": "tsd install"
当运行npm install时,tsd工具也会在npm依赖项安装完成后运行,因此是post install操作。
根据Microsoft TypeScript文档,编写自定义类型定义文件的最佳方式是使用npm库的文档,而不是库的源代码。以下是库的基本用法:
var argv = require('yargs').argv;
if (argv.ships > 3 && argv.distance < 53.5) {
console.log('Plunder more riffiwobbles!');
} else {
console.log('Retreat from the xupptumblers!');
}
在这种情况下,argv变量有两个属性,ships和distance,用于解析特定逻辑。
在案例中,希望有一个名为env的属性,它提供了传递一个字符串的能力,该字符串设置为“dev”或“prod”。以下是使用TypeScript表达此业务需求的方式:
/*
Custom file definition to support projects specific inputs
*/
declare namespace yargs {
var argv: InputDef;
}
interface InputDef {
env: string;
}
declare module 'yargs' {
export = yargs;
}
将为yargs包添加一个新的类型定义文件,通过在tools/typings/yards.ts中创建一个名为yargs.ts的新文件,并放置上述代码。虽然还有其他的类型定义文件可供这个npm库使用,但更喜欢编写自己的特定于使用库的类型定义。
在本文写作时,发现TypeScript编译器存在一个问题。它在Visual Studio Code IDE中识别自定义类型,但当尝试编译代码时,它会失败加载一个模块。如果想跟踪这个问题,这里是链接。
要解决编译器的问题,必须通过在tools/typings/目录中创建custom.d.ts文件来添加类型定义文件引用。放置以下文件引用:
/
据理解,TypeScript编译器正在寻找具有*.d.ts扩展名的文件,以解析类型。这可能不是一个bug,而是一个设计上的未记录功能。
更喜欢在项目中的tools/目录下结构化Gulp任务和支持文件。由于将添加与应用程序相关的功能,创建一个名为application.ts的文件在tools/utils目录下。然后添加以下代码:
import { argv } from 'yargs';
export const ENVIRONMENTS = {
DEVELOPMENT: 'dev',
PRODUCTION: 'prod'
};
/*
retreive environment variable that is passed into the system
*/
export function getEnvironment(): string {
if (argv.env != null) {
if (argv.env === ENVIRONMENTS.PRODUCTION) {
return ENVIRONMENTS.PRODUCTION;
} else {
// ability to extend more environments from here
return ENVIRONMENTS.DEVELOPMENT;
}
} else {
return ENVIRONMENTS.DEVELOPMENT;
}
}
如所见,选择了export function语法而不是类。这是偏好,尽管不限于使用其中任何一个。这是JavaScript动态特性创造的许多不同方式之一。在这段代码中,导入了“yargs”库,Visual Studio Code将其识别为一个有效的库。但是,如果尝试运行gulp任务,会得到一个错误。这是因为package.json文件中没有“yargs”库的引用。要解决这个问题,请运行以下命令:
npm i --save-dev yargs
此命令将在package.json文件的devDependencies下添加引用,并且还会将“yargs”库下载到node_modules中。
为了拥有一个用于未来所有Gulp任务的中央配置文件,让在tools/目录下创建一个文件,并将其命名为“config.ts”,然后粘贴以下内容:
import { getEnvironment } from './utils/application';
export const ENV = getEnvironment();
由于有了检索环境设置的通用功能,现在可以修改默认任务如下:
import * as gulp from 'gulp';
import { ENV } from './tools/config';
gulp.task('default', done => {
console.log('Environment is set to:', ENV);
});
尝试运行以下命令以查看结果:
gulp
gulp --env prod
应该看到环境输出随着命令行开关的变化而变化。
Node.js是一个强大的服务器端JavaScript执行引擎,可以在许多不同的操作系统上运行,利用Google Chrome 8 JavaScript执行引擎。因此,这个项目可以在Node.js支持的任何操作系统上工作。
使用Windows 10来开发和测试代码。请随时留下任何缺失的步骤等,用于其他操作系统。