搜索
首页web前端js教程分步电子邮件验证 JavaScript 教程:最佳实践和代码示例

JavaScript 中的电子邮件验证涉及两个基本组件:客户端格式验证和通过确认链接的服务器端验证。这个综合指南提供了可用于生产的代码示例和安全最佳实践,以便在您的应用程序中实现强大的电子邮件验证系统。

正确的电子邮件验证对于维持电子邮件的送达率并保护您的应用程序免受无效或恶意电子邮件提交的影响至关重要。客户端验证可提供即时的用户反馈,而服务器端验证可确保电子邮件实际存在并属于用户。

在深入实施之前,请确保您对以下内容有基本了解:

  • JavaScript (ES6)
  • 正则表达式
  • Node.js(用于服务器端实现)
  • 基本电子邮件协议概念

Step-by-Step Email Verification JavaScript Tutorial: Best Practices & Code Examples

从根本上了解电子邮件验证的工作原理有助于您实施更安全、更高效的解决方案。现代电子邮件验证通常采用多个验证层:

Step-by-Step Email Verification JavaScript Tutorial: Best Practices & Code Examples

在实施电子邮件验证最佳实践时,平衡安全性与用户体验至关重要。我们的实施将侧重于创建一个强大的系统,防止无效电子邮件,同时保持流畅的用户体验。

在本教程中,我们将构建一个完整的电子邮件验证系统,其中包括:

  • 使用现代 JavaScript 模式进行客户端验证
  • 通过安全令牌生成进行服务器端验证
  • 防范常见安全漏洞
  • 确保可靠性的测试策略

提供的代码示例已可用于生产,并遵循当前的安全最佳实践,允许您直接在应用程序中实现它们,同时保持根据您的特定需求进行定制的灵活性。

在实施电子邮件验证最佳实践时,平衡安全性与用户体验至关重要。强大的电子邮件验证系统可以防御各种威胁,同时保持用户参与度:

首先,客户端验证提供即时反馈,防止在服务器提交之前出现明显的格式错误。这种方法可以通过在流程早期发现错误来减少服务器负载并改善用户体验。然而,仅客户端验证不足以保护您的应用程序。

服务器端验证通过执行更深入的验证检查来添加关键的安全层。这包括域验证和实施安全确认工作流程。客户端和服务器端验证的结合创建了一个全面的安全框架。

您需要解决的常见安全挑战包括:

  • 防止自动表单提交
  • 防止电子邮件确认链接利用
  • 安全代币生成和管理
  • 速率限制以防止滥用

实施电子邮件验证时,请考虑影响应用程序安全性和用户体验的以下关键因素:

Step-by-Step Email Verification JavaScript Tutorial: Best Practices & Code Examples

现代 JavaScript 框架和库可以显着简化实现过程。但是,了解基本原理可确保您可以根据您的具体要求调整解决方案,并通过更好的电子邮件验证来改进您的营销活动。

我们将探索的实施方法旨在随着应用程序的增长而扩展。无论您是构建小型 Web 应用程序还是大型系统,这些模式都为可靠的电子邮件验证提供了坚实的基础。

通过遵循本教程,您将创建一个验证系统:

  • 使用现代 JavaScript 技术验证电子邮件格式
  • 实现安全的服务器端验证
  • 处理边缘情况和潜在的安全威胁
  • 提供流畅的用户体验
  • 随着应用程序的增长而有效扩展

让我们从实现客户端验证开始,我们将探索现代 JavaScript 模式以进行有效的电子邮件格式验证。

客户端电子邮件验证

客户端电子邮件验证在表单提交之前向用户提供即时反馈,从而增强用户体验并减少服务器负载。让我们使用现代 JavaScript 实践和经过验证的正则表达式模式来实现一个强大的验证系统。

正则表达式模式验证

电子邮件验证的基础始于可靠的正则表达式模式。虽然没有任何正则表达式模式可以保证 100% 的准确性,但我们将使用一种平衡验证彻底性与实际使用的模式:

const emailRegex = /^[a-zA-Z0-9.!#$%&'* /=?^_{|}~-] @[a-zA-Z0-9-] (?:. [a-zA-Z0-9-] )*$/;`

此模式根据 RFC 5322 标准验证电子邮件地址,检查:

  • 本地部分的有效字符(@之前)
  • 存在单个@符号
  • 有效域名结构
  • 正确使用点和特殊字符

构建验证函数

让我们创建一个全面的验证功能,不仅检查格式,还提供有意义的反馈。此方法符合电子邮件格式最佳实践:

`函数 validateEmail(电子邮件) {
// 删除前导/尾随空格
const trimmEmail = email.trim();

// Basic structure check
if (!trimmedEmail) {
    return {
        isValid: false,
        error: 'Email address is required'
    };
}

// Length validation
if (trimmedEmail.length > 254) {
    return {
        isValid: false,
        error: 'Email address is too long'
    };
}

// RegEx validation
if (!emailRegex.test(trimmedEmail)) {
    return {
        isValid: false,
        error: 'Please enter a valid email address'
    };
}

// Additional checks for common mistakes
if (trimmedEmail.includes('..')) {
    return {
        isValid: false,
        error: 'Invalid email format: consecutive dots not allowed'
    };
}

return {
    isValid: true,
    error: null
};

}`

表单集成和错误处理

将验证功能与您的 HTML 表单集成以提供实时反馈。此实现遵循当前验证最佳实践:

`document.addEventListener('DOMContentLoaded', () => {
const emailInput = document.getElementById('email');
const errorDisplay = document.getElementById('错误消息');

emailInput.addEventListener('input', debounce(function(e) {
    const result = validateEmail(e.target.value);

    if (!result.isValid) {
        errorDisplay.textContent = result.error;
        emailInput.classList.add('invalid');
        emailInput.classList.remove('valid');
    } else {
        errorDisplay.textContent = '';
        emailInput.classList.add('valid');
        emailInput.classList.remove('invalid');
    }
}, 300));

});

// Debounce 函数以防止过多的验证调用
函数 debounce(func, 等待) {
让超时;
返回函数executeFunction(...args) {
const 稍后 = () => {
清除超时(超时);
func(...args);
};
清除超时(超时);
timeout = setTimeout(稍后,等待);
};
}`

这是相应的 HTML 结构:

电子邮件地址:标签>
类型=“电子邮件”
> 名称=“电子邮件”
必填
自动完成=“电子邮件”
>
;
提交按钮>
表格>

此实现包括几个重要功能:

  • 去抖验证以提高性能
  • 使用 CSS 类提供清晰的视觉反馈
  • 可访问的错误消息
  • 支持自动完成
  • 使用 novalidate 属性进行渐进增强

请记住,客户端验证只是第一道防线。始终实现服务器端验证,我们将在下一节中介绍。

Step-by-Step Email Verification JavaScript Tutorial: Best Practices & Code Examples

服务器端电子邮件验证

客户端验证可提供即时反馈,而服务器端验证可确保电子邮件的真实性和用户所有权。本节演示如何使用 Node.js 和 Express 实现安全的电子邮件验证系统。

设置确认系统

首先,让我们为我们的验证系统设置必要的依赖项和配置:

`const express = require('express');
const crypto = require('crypto');
const nodemailer = require('nodemailer');
const mongoose = require('mongoose');

// 环境配置
require('dotenv').config();

const app = express();
app.use(express.json());

// 电子邮件传输配置
const Transporter = nodemailer.createTransport({
主机:process.env.SMTP_HOST,
端口:process.env.SMTP_PORT,
安全:正确,
授权:{
用户:process.env.SMTP_USER,
通过:process.env.SMTP_PASS
}
});`

使用这些基本参数配置您的电子邮件服务,以确保正确的电子邮件送达率:

Step-by-Step Email Verification JavaScript Tutorial: Best Practices & Code Examples

代币生成和管理

使用加密函数实现安全令牌生成:

`类 VerificationToken {
静态异步生成() {
const token = crypto.randomBytes(32).toString('hex');
const expiresAt = new Date(Date.now() 24 * 60 * 60 * 1000); // 24 小时

// Basic structure check
if (!trimmedEmail) {
    return {
        isValid: false,
        error: 'Email address is required'
    };
}

// Length validation
if (trimmedEmail.length > 254) {
    return {
        isValid: false,
        error: 'Email address is too long'
    };
}

// RegEx validation
if (!emailRegex.test(trimmedEmail)) {
    return {
        isValid: false,
        error: 'Please enter a valid email address'
    };
}

// Additional checks for common mistakes
if (trimmedEmail.includes('..')) {
    return {
        isValid: false,
        error: 'Invalid email format: consecutive dots not allowed'
    };
}

return {
    isValid: true,
    error: null
};

}`

创建验证端点

设置必要的 API 端点来处理验证请求。此实现遵循经过验证的验证方法:

`// 请求电子邮件验证
app.post('/api/verify-email', async (req, res) => {
尝试{
const { email } = req.body;

emailInput.addEventListener('input', debounce(function(e) {
    const result = validateEmail(e.target.value);

    if (!result.isValid) {
        errorDisplay.textContent = result.error;
        emailInput.classList.add('invalid');
        emailInput.classList.remove('valid');
    } else {
        errorDisplay.textContent = '';
        emailInput.classList.add('valid');
        emailInput.classList.remove('invalid');
    }
}, 300));

电子邮件验证

请点击下面的链接来验证您的电子邮件地址:

验证电子邮件

此链接将在 24 小时后过期。


});

// Basic structure check
if (!trimmedEmail) {
    return {
        isValid: false,
        error: 'Email address is required'
    };
}

// Length validation
if (trimmedEmail.length > 254) {
    return {
        isValid: false,
        error: 'Email address is too long'
    };
}

// RegEx validation
if (!emailRegex.test(trimmedEmail)) {
    return {
        isValid: false,
        error: 'Please enter a valid email address'
    };
}

// Additional checks for common mistakes
if (trimmedEmail.includes('..')) {
    return {
        isValid: false,
        error: 'Invalid email format: consecutive dots not allowed'
    };
}

return {
    isValid: true,
    error: null
};

});

// 确认电子邮件验证
app.get('/api/confirm-verification', async (req, res) => {
尝试{
const { token } = req.query;

emailInput.addEventListener('input', debounce(function(e) {
    const result = validateEmail(e.target.value);

    if (!result.isValid) {
        errorDisplay.textContent = result.error;
        emailInput.classList.add('invalid');
        emailInput.classList.remove('valid');
    } else {
        errorDisplay.textContent = '';
        emailInput.classList.add('valid');
        emailInput.classList.remove('invalid');
    }
}, 300));

});`

此实现包括几个安全功能:

  • 加密安全的令牌生成
  • 令牌过期处理
  • 速率限制(实现如下所示)
  • 错误处理和日志记录
  • 包含 HTML 内容的安全电子邮件模板

添加速率限制以防止滥用:

`const ratesLimit = require('express-rate-limit');

const verifyLimiter = ratesLimit({
windowMs: 60 * 60 * 1000, // 1 小时
max: 5, // 每个 IP 5 个请求
message: '验证请求太多。请稍后再试。'
});

app.use('/api/verify-email', verifyLimiter);`

请记住对您的验证系统实施适当的错误处理和监控,以保持可靠性和安全性。

安全最佳实践

实施强大的安全措施对于保护您的电子邮件验证系统免受各种威胁至关重要。本节涵盖基本的安全实践,以确保您的实施保持安全可靠,同时保持高交付率。

令牌安全措施

安全的代币生成和管理构成了可靠验证系统的基础。实施这些关键的安全措施:

`类 TokenManager {
静态异步generateSecureToken() {
// 使用 crypto.randomBytes 获取加密安全令牌
const tokenBuffer =等待 crypto.randomBytes(32);

    return {
        token,
        expiresAt
    };
}

static async verify(token) {
    const user = await User.findOne({
        'verification.token': token,
        'verification.expiresAt': { $gt: Date.now() }
    });

    return user;
}

}`

防止系统滥用

实施全面的速率限制和监控,以防止垃圾邮件机器人和滥用:

`const ratesLimit = require('express-rate-limit');
const RedisStore = require('rate-limit-redis');

// 配置分级限速
constrateLimitConfig = {
// 基于IP的限制
ipLimiter: {
windowMs: 60 * 60 * 1000, // 1 小时
max: 5, // 每个 IP 的请求
标准标头:true,
遗留标题:假,
处理程序:(req,res)=> {
res.status(429).json({
错误:'超出速率限制。请稍后重试。',
retryAfter: Math.ceil(req.rateLimit.resetTime / 1000)
});
}
},

    // Check if email already verified
    const existingUser = await User.findOne({ email, verified: true });
    if (existingUser) {
        return res.status(400).json({
            error: 'Email already verified'
        });
    }

    // Generate verification token
    const { token, expiresAt } = await VerificationToken.generate();

    // Store or update user with verification token
    await User.findOneAndUpdate(
        { email },
        {
            email,
            verification: { token, expiresAt },
            verified: false
        },
        { upsert: true }
    );

    // Send verification email
    const verificationLink = \`${process.env.APP_URL}/verify-email?token=${token}\`;
    await transporter.sendMail({
        from: process.env.SMTP_FROM,
        to: email,
        subject: 'Verify Your Email Address',
        html: \``

};

// 应用速率限制中间件
app.use('/api/verify-email',rateLimit(rateLimitConfig.ipLimiter));
app.use('/api/verify-email',rateLimit(rateLimitConfig.globalLimiter));`

实施这些额外的安全措施来防止常见漏洞:

Step-by-Step Email Verification JavaScript Tutorial: Best Practices & Code Examples

这是实现安全令牌加密的示例:

`类 TokenEncryption {
静态异步 encryptToken(token) {
const 算法 = 'aes-256-gcm';
const key = Buffer.from(process.env.ENCRYPTION_KEY, 'hex');
const iv = crypto.randomBytes(12);

// Basic structure check
if (!trimmedEmail) {
    return {
        isValid: false,
        error: 'Email address is required'
    };
}

// Length validation
if (trimmedEmail.length > 254) {
    return {
        isValid: false,
        error: 'Email address is too long'
    };
}

// RegEx validation
if (!emailRegex.test(trimmedEmail)) {
    return {
        isValid: false,
        error: 'Please enter a valid email address'
    };
}

// Additional checks for common mistakes
if (trimmedEmail.includes('..')) {
    return {
        isValid: false,
        error: 'Invalid email format: consecutive dots not allowed'
    };
}

return {
    isValid: true,
    error: null
};

}`

使用日志记录和分析来监控您的验证系统是否存在可疑模式:

`const Winston = require('winston');

const logger = winston.createLogger({
级别:'信息',
格式:winston.format.json(),
运输:[
新的winston.transports.File({
文件名:'验证错误.log',
级别:'错误'
}),
新的winston.transports.File({
文件名:'验证组合.log'
})
]
});

// 监控验证尝试
app.use('/api/verify-email', (req, res, next) => {
logger.info('验证尝试', {
ip: 请求.ip,
电子邮件:req.body.email,
时间戳:new Date(),
userAgent: req.headers['user-agent']
});
下一个();
});`

定期审查您的安全措施,并根据新出现的威胁和电子邮件安全方面的最佳实践进行更新。

测试和部署

适当的测试和部署程序可确保您的电子邮件验证系统保持可靠并保持高送达率。本节涵盖基本的测试策略和部署注意事项。

测试策略

使用 Jest 或 Mocha 实施全面测试来验证您的电子邮件验证系统:

`describe('电子邮件验证系统', () => {
描述('格式验证', () => {
test('应验证正确的电子邮件格式', () => {
const validEmails = [
'user@domain.com',
'user.name@domain.com',
'用户标签@domain.com'
];

emailInput.addEventListener('input', debounce(function(e) {
    const result = validateEmail(e.target.value);

    if (!result.isValid) {
        errorDisplay.textContent = result.error;
        emailInput.classList.add('invalid');
        emailInput.classList.remove('valid');
    } else {
        errorDisplay.textContent = '';
        emailInput.classList.add('valid');
        emailInput.classList.remove('invalid');
    }
}, 300));

});`

常见问题及解决方案

在实施电子邮件验证时解决这些常见挑战:

Step-by-Step Email Verification JavaScript Tutorial: Best Practices & Code Examples

对生产环境实施监控和日志记录:

`const 监控 = {
// 跟踪验证尝试
trackVerification: async (email, success, error = null) =>; {
等待 VerificationMetric.create({
电子邮件,
成功,
错误,
时间戳:new Date()
});
},

// Basic structure check
if (!trimmedEmail) {
    return {
        isValid: false,
        error: 'Email address is required'
    };
}

// Length validation
if (trimmedEmail.length > 254) {
    return {
        isValid: false,
        error: 'Email address is too long'
    };
}

// RegEx validation
if (!emailRegex.test(trimmedEmail)) {
    return {
        isValid: false,
        error: 'Please enter a valid email address'
    };
}

// Additional checks for common mistakes
if (trimmedEmail.includes('..')) {
    return {
        isValid: false,
        error: 'Invalid email format: consecutive dots not allowed'
    };
}

return {
    isValid: true,
    error: null
};

};`

遵循这些部署最佳实践以确保系统可靠性:

  • 使用特定于环境的配置
  • 实现优雅的错误处理
  • 设置自动监控
  • 配置适当的日志记录级别
  • 建立备份和恢复程序

定期维护和监控有助于在问题影响用户之前发现并解决问题:

`// 实现健康检查端点
app.get('/health', async (req, res) => {
尝试{
const 指标=等待监控.healthCheck();
常量状态=指标.成功率> = 0.95? '健康' : '降级';

emailInput.addEventListener('input', debounce(function(e) {
    const result = validateEmail(e.target.value);

    if (!result.isValid) {
        errorDisplay.textContent = result.error;
        emailInput.classList.add('invalid');
        emailInput.classList.remove('valid');
    } else {
        errorDisplay.textContent = '';
        emailInput.classList.add('valid');
        emailInput.classList.remove('invalid');
    }
}, 300));

});`

常见问题

为什么我应该同时实现客户端和服务器端电子邮件验证?

客户端验证可提供即时的用户反馈,并通过尽早发现明显的格式错误来减少服务器负载。然而,服务器端验证对于确认电子邮件的存在和所有权至关重要。使用两者创建了一个全面的验证系统,可以在保持安全性的同时改善用户体验。为了获得最佳结果,请实施客户端验证以获取即时反馈,并实施服务器端验证以进行实际电子邮件确认。

如何防止验证令牌滥用?

通过实施以下安全措施防止令牌滥用:

  • 使用加密安全令牌生成
  • 设置适当的令牌过期时间(通常为 24 小时)
  • 对验证请求实施速率限制
  • 监控并记录验证尝试
  • 验证成功后使令牌失效

处理电子邮件验证错误的最佳方法是什么?

实施全面的错误处理策略,包括:

  • 清晰、用户友好的错误消息
  • 正确记录所有验证尝试
  • 临时失败的重试机制
  • 替代验证方法作为备份

此外,请遵循电子邮件验证最佳实践,以最大限度地减少错误发生。

验证令牌应该多久过期一次?

验证令牌通常应在 24 小时后过期,以平衡安全性与用户便利性。此时间范围为用户提供了足够的机会来完成验证,同时限制了潜在令牌滥用的窗口。为了增强安全性,请考虑为需要更多时间的用户实施更短的过期时间(4-8 小时)和令牌刷新机制。

我应该实施实时电子邮件验证吗?

实时验证可以增强用户体验,但应谨慎实施。使用去抖客户端验证进行即时格式检查,但避免实时服务器端验证以防止过多的 API 调用。相反,当用户提交表单时,执行全面的电子邮件送达率检查。

以上是分步电子邮件验证 JavaScript 教程:最佳实践和代码示例的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

了解JavaScript引擎:实施详细信息了解JavaScript引擎:实施详细信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:学习曲线和易用性Python vs. JavaScript:学习曲线和易用性Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Python vs. JavaScript:社区,图书馆和资源Python vs. JavaScript:社区,图书馆和资源Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C到JavaScript:所有工作方式从C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript引擎:比较实施JavaScript引擎:比较实施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

超越浏览器:现实世界中的JavaScript超越浏览器:现实世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

使用Next.js(后端集成)构建多租户SaaS应用程序使用Next.js(后端集成)构建多租户SaaS应用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具