最近我发现了Google Closure Compiler这样很酷的东西。是否有替代方案可以提供从编译的静态类型语言中获益的机会?
更新
它不是关于真正的编译器,而是关于 JavaScript-JavaScript 翻译器,它提供类型验证等、优化,也许还有压缩。
最近我发现了Google Closure Compiler这样很酷的东西。是否有替代方案可以提供从编译的静态类型语言中获益的机会?
更新
它不是关于真正的编译器,而是关于 JavaScript-JavaScript 翻译器,它提供类型验证等、优化,也许还有压缩。
从您的评论中:
我对类型检查、接口检查、私有字段检查等感兴趣,所有东西都可以让你编写安全代码,而不仅仅是最小化程序。
JavaScript 是一种动态类型语言,没有对类、接口或访问修饰符的内置支持。Closure Compiler 通过使用嵌入在 JSDoc 注释中的信息来支持各种语言外功能,例如接口和访问修饰符。一些 IDE 还使用 JSDoc 标记信息提供静态分析,例如,请参阅WebStorm 和 PhpStorm 博客:5.0 中的新功能:Google Closure Compiler JSDoc annotations。
在 JavaScript 缩小器领域有许多选项,例如YUI Compressor、UglifyJS、dojo shrinksafe、Microsoft Ajax Minifier和JSMIN。但是,这些工具中没有一个为基于 JSDoc 的分析提供与 Closure Compiler 相同级别的支持。
相关堆栈溢出问题:
Closure compiler (Google) 是一个真正的 javascript 编译器。替代方案包括 typescript (Microsoft) 和 Flow (facebook)。闭包编译器使用 jsdoc 注释来注释类型。Typescript 使用与 es3/es5 不同的语法来提供编译为纯 javascript 的类型注释。Flow 搭载 OCaml 语言(擅长类型推断)以推断尽可能多的类型信息,但也可以使用注释语法中的注释。闭包编译器也在致力于更好的类型推断,但它还没有准备好投入生产。
回应@EASI:闭包编译器是一个真正的编译器,而不仅仅是一个缩小器。它的工作原理是:
将一组输入 .js 文件和一组外部文件(为 ecma 3、5、6 和常见浏览器对象(如 Window 等)定义接口)解析为抽象语法树 (AST)。
运行一系列编译器通过 AST 来重写、转换、消除死代码等。
将 AST 发送回 js 源代码。它要么将文件与删除的注释连接在一起 (WHITESPACE_ONLY),重命名和缩小函数定义中的符号 (SIMPLE),要么将所有符号重命名并重写为缩小和混淆的形式 (ADVANCED)。
这是编译器通行证的列表,供感兴趣的人使用。如您所见,发生了很多事情:
AliasExternals.java
AliasStrings.java
AmbiguateProperties.java
AnalyzeNameReferences.java
AnalyzePrototypeProperties.java
AstValidator.java
CallGraph.java
ChainCalls.java
CheckConformance.java
CheckDebuggerStatement.java
CheckEventfulObjectDisposal.java
CheckGlobalNames.java
CheckMissingGetCssName.java
CheckRegExp.java
CheckSideEffects.java
ClosureCodeRemoval.java
ClosureOptimizePrimitives.java
CollapseAnonymousFunctions.java
CollapseProperties.java
CollapseVariableDeclarations.java
ConstCheck.java
ConstParamCheck.java
ConvertDeclaredTypesToJSDoc.java
ConvertToDottedProperties.java
ConvertToTypedES6.java
CoverageInstrumentationPass.java
CreateSyntheticBlocks.java
CrossModuleCodeMotion.java
CrossModuleMethodMotion.java
DeclaredGlobalExternsOnWindow.java
DefaultPassConfig.java
Denormalize.java
DisambiguateProperties.java
ErrorPass.java
Es6ToEs3ClassSideInheritance.java
ExpandJqueryAliases.java
ExportTestFunctions.java
ExternExportsPass.java
ExtractPrototypeMemberDeclarations.java
FlowSensitiveInlineVariables.java
FunctionNames.java
FunctionRewriter.java
GatherExternProperties.java
GatherRawExports.java
GenerateExports.java
GlobalNamespace.java
GlobalTypeInfo.java
GroupVariableDeclarations.java
ImplicitNullabilityCheck.java
InferConsts.java
InjectEs6RuntimeLibrary.java
InlineFunctions.java
InlineObjectLiterals.java
InlineProperties.java
InlineVariables.java
InstrumentFunctions.java
JsMessageVisitor.java
MarkNoSideEffectCalls.java
MethodCompilerPass.java
MinimizeExitPoints.java
NameAnalyzer.java
NameAnonymousFunctions.java
NameAnonymousFunctionsMapped.java
NameReferenceGraphConstruction.java
NewTypeInference.java
Normalize.java
ObjectPropertyStringPostprocess.java
ObjectPropertyStringPreprocess.java
OptimizeArgumentsArray.java
OptimizeCalls.java
OptimizeParameters.java
PeepholeOptimizationsPass.java
PhaseOptimizer.java
PrepareAst.java
ProcessCommonJSModules.java
ProcessDefines.java
ProcessTweaks.java
PureFunctionIdentifier.java
RecordFunctionInformation.java
RemoveUnusedClassProperties.java
RemoveUnusedNames.java
RemoveUnusedPrototypeProperties.java
RemoveUnusedVars.java
RenameLabels.java
RenameProperties.java
RenamePrototypes.java
RenameVars.java
ReplaceCssNames.java
ReplaceIdGenerators.java
ReplaceStrings.java
RescopeGlobalSymbols.java
RuntimeTypeCheck.java
SanityCheck.java
ShadowVariables.java
SideEffectsAnalysis.java
SimpleDefinitionFinder.java
StrictModeCheck.java
StripCode.java
SymbolTable.java
TransformAMDToCJSModule.java
TypeInferencePass.java
TypedScopeCreator.java
UnreachableCodeElimination.java
VariableVisibilityAnalysis.java
是的,
有 Java、JS、PHP、CSS 和 HTML“缩小器”。例如,当您使用 Google GWT Java 进行编程时,代码会生成为 JS 的最小化。
他们使用术语编译器,但它是不正确的。编译器将一种人类可读的语言代码转换为只有解释器或机器才能读取的目标代码。这个谷歌工具的作用是优化您的代码,以便解释器可以更快地读取它。脚本语言需要解释器才能执行。编译成机器语言的程序的执行速度比任何解释器都快。但是当然,任何程序的速度都取决于它的执行流程项目和开发团队的经验。
新的:
您是否尝试过在专门的 IDE 中编写 JavaScript 代码?如果您正在寻找类型检查,您可以尝试以下方法之一:
他们现在有了更大的支持,不仅对 PHP,而且对 JavaScript,代码自动完成、类型验证、动态语法突出显示、多语言语法突出显示和面向对象分析以及键入时自动完成。
我认为furiascript.com可能是一个有趣的选择。