Les fonctions AWS CloudFront sont un outil puissant pour exécuter du code JavaScript léger en périphérie, vous permettant de manipuler les requêtes et les réponses.
Cependant, AWS exige que ces fonctions soient écrites en JavaScript Vanilla, ce qui peut être limitant pour les développeurs qui préfèrent la sécurité des types et la syntaxe moderne de TypeScript.
Dans cet article, je vais vous présenter une solution pour écrire des fonctions CloudFront en TypeScript, importer des fichiers supplémentaires et les tester efficacement.
Les fonctions CloudFront doivent être écrites en JavaScript ES5, qui ne dispose pas des fonctionnalités modernes et de la sécurité des types de TypeScript. Cette exigence constitue un défi pour les développeurs qui souhaitent tirer parti des avantages de TypeScript tout en continuant à déployer sur CloudFront.
La solution consiste à utiliser TypeScript pour écrire vos fonctions CloudFront, puis à les transpiler en JavaScript ES5. Cette approche vous permet de conserver les avantages de TypeScript pendant le développement et les tests, tout en répondant aux exigences de déploiement d'AWS.
Options du compilateur TypeScript :
Vous trouverez ci-dessous un exemple simplifié de la façon dont vous pouvez configurer votre projet TypeScript pour CloudFront Functions :
Configuration TypeScript (tsconfig.json)
{ "compilerOptions": { "target": "es5", // MUST BE ES5 for CloudFront Function support https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-javascript-runtime-features.html#writing-functions-javascript-features-core "module": "commonjs", // Beware CloudFront JS environment doesn't contain all commonjs runtime modules "lib": ["es5"], "strict": true, "removeComments": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
Créez un transformateur personnalisé pour supprimer les mots-clés d'exportation :
import * as ts from 'typescript'; export const removeExportTransformer: ts.TransformerFactory<ts.SourceFile> = (context) => { return (sourceFile) => { const visitor: ts.Visitor = (node) => { if (ts.isModifier(node) && node.kind === ts.SyntaxKind.ExportKeyword) { return undefined; } return ts.visitEachChild(node, visitor, context); }; return ts.visitNode(sourceFile, visitor); }; };
Un script pour transpiler les fichiers TypeScript :
import * as ts from 'typescript'; import * as fs from 'fs'; import * as path from 'path'; import { removeExportTransformer } from './removeExportTransformer'; const compilerOptions: ts.CompilerOptions = { module: ts.ModuleKind.None, target: ts.ScriptTarget.ES5, strict: true, removeComments: true, lib: ['es5'], }; function transpileFile(filePath: string) { const source = fs.readFileSync(filePath, 'utf-8'); const result = ts.transpileModule(source, { compilerOptions, transformers: { before: [removeExportTransformer] }, }); const outputFilePath = filePath.replace('.ts', '.js'); fs.writeFileSync(outputFilePath, result.outputText); } const files = fs.readdirSync('./src').filter(file => file.endsWith('.ts')); files.forEach(file => transpileFile(path.join('./src', file)));
Créez votre fonction CloudFront Typescript avant le déploiement :
ts-node scripts/build-cloudfront.ts
Définissez le chemin d'accès à la sortie de votre build de fonction :
const function= new aws_cloudfront.Function(stack, 'CloudfrontFunctionId', { functionName: 'cloudfront_function', code: aws_cloudfront.FunctionCode.fromFile({ filePath: `dist/cloudfrontFunction.js`, }), runtime: aws_cloudfront.FunctionRuntime.JS_2_0, })
Configurez Jest pour tester votre code TypeScript :
{ "compilerOptions": { "target": "es5", // MUST BE ES5 for CloudFront Function support https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-javascript-runtime-features.html#writing-functions-javascript-features-core "module": "commonjs", // Beware CloudFront JS environment doesn't contain all commonjs runtime modules "lib": ["es5"], "strict": true, "removeComments": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
En tirant parti de TypeScript et des transformateurs personnalisés, vous pouvez écrire, tester et déployer des fonctions CloudFront avec des fonctionnalités JavaScript modernes et des avantages en matière de sécurité de type. Cette approche améliore non seulement votre expérience de développement, mais garantit également que votre code est robuste et maintenable.
Exemple de code fonctionnel complet que vous pouvez trouver sur mon GitHub
Un merci tout spécial aux auteurs du package typescript-remove-exports, qui a inspiré l'approche de transformateur personnalisé utilisée dans cette solution. Leur travail a fourni une base pour adapter le code TypeScript afin de répondre aux exigences de CloudFront.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!