最近我发现Google Closure Compiler这么酷。有没有其他方法可以获得编译的静态类型语言的好处?
的更新 的
它不是关于真正的编译器,而是关于JavaScript-JavaScript转换器,它提供类型验证等,优化和压缩。
答案 0 :(得分:6)
来自你的评论:
我对类型检查,界面检查,私人字段检查等感兴趣,所有东西都允许你编写安全代码,而不仅仅是最小化。
JavaScript是一种动态类型语言,没有对类,接口或访问修饰符的内置支持。 Closure Compiler通过使用JSDoc注释中嵌入的信息来支持各种语言特性,例如接口和访问修饰符。一些IDE还使用JSDoc标签信息提供静态分析,例如,参见 WebStorm& PhpStorm博客:New in 5.0: Google Closure Compiler JSDoc annotations 。
在JavaScript缩小器区域中,有许多选项,例如YUI Compressor,UglifyJS,dojo shrinksafe,Microsoft Ajax Minifier和JSMIN。但是,这些工具都没有像Closure Compiler那样为基于JSDoc的分析提供相同级别的支持。
相关的堆栈溢出问题:
答案 1 :(得分:2)
Closure编译器(Google)是一个真正的javascript编译器。替代品包括打字稿(Microsoft)和Flow(facebook)。 Closure编译器使用jsdoc注释来注释类型。 Typescript使用与es3 / es5不同的语法来提供编译为纯JavaScript的类型注释。 Flow捎带到OCaml语言(在类型推断方面表现优异)以推断尽可能多的类型信息,但也可以在注释语法中使用注释。 Closure编译器也在进行更好的类型推断,但还没有为生产做好准备。
响应@EASI:闭包编译器是一个真正的编译器,而不仅仅是一个缩小器。它的工作原理是:
将一组输入.js文件和一组extern文件(定义了ecma 3,5,6的接口和常见的浏览器对象,如Window等)解析为抽象语法树(AST)。 / p>
通过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
答案 2 :(得分:0)
是,
有Java,JS,PHP,CSS和HTML“ minifiers ”。 例如,当您使用Google GWT Java进行编程时,代码将作为JS的最小化生成。
他们使用术语编译器,但它不正确。编译器将一个人类可读的语言代码转换为只有解释器或机器才能读取的目标代码。这个谷歌工具的作用是优化你的代码,以便解释器可以更快地读取它。脚本语言需要执行解释器。编译成机器语言的程序执行速度比任何解释器都快。但当然,任何程序速度都取决于它的执行流程项目和开发团队的经验。
新强>
您是否尝试在专用IDE中制作JavaScript代码? 如果您正在寻找类型检查,您可以尝试其中一种:
现在,他们不仅支持PHP,而且支持JavaScript,支持代码自动完成,类型验证,动态语法突出显示,多语言语法突出显示和面向对象分析以及键入时自动完成。
答案 3 :(得分:0)
我认为furiascript.com可能是一个有趣的选择。