今天学习JavaScript作为初学者将是一个非常艰苦的旅程。这是一所二十岁的语言,最初是为不同的,更简单的网络设计的语言。在努力满足现代网络的新挑战时,我们已经获得了这么多的译者,捆绑,UI框架和语法变体;自从vanilla js只需要你到目前为止,这些抽象是必要的。但随着生态系统的增长和语言发展,事情才会变得更加令人困惑。所有增长都导致重复:有两种多种进出函数的方法,彼此不兼容,以及两种不同的方式检查平等。您必须以某种方式筛选所有选项,以便选择和选择开发工具包的工具:
我认为Web开发需要精简 - 有更重要的事情要思考,而且它不是Redux vs Mobx。
所以当我遇到薄荷时,我都是耳朵。什么薄荷承诺是一种简化的前端开发经验。这不是一个像反应的图书馆,也不像角度一样。这是一个专为单页应用开发而设计的全新语言。语言被转发给JavaScript。
作者将榆树称为他的主要灵感,而且它表明。语言吹捧非常榆树特征:
那么你为什么要关心这种语言?你为什么要为你的下一个项目尝试一下?
由于薄荷提供了一组语言级功能,因此不可能在JavaScript中复制,而无需借助基础知识的“Heckin Chunk”。
薄荷的整个可执行文件重量〜34MB,并且涵盖大多数用例而不借助外部依赖性。一个很好的副作用是你永远不必离开MINT的文档,以获取有关第三方库的信息。实际上,MINT可执行文件包含文档的脱机版本,可以使用一个简单的终端命令打开。
以下是一些令人眼花的功能,我注意到使用薄荷来开发个人项目。
薄荷是一种静态类型的语言。它从榆树和Haskell汲取灵感,并分享了他们对零运行时异常的承诺。这意味着如果您的薄荷代码编译,则可以100%确定不会遇到未定义值的错误。这可以说是它最重要的特征。
但在我们谈论运行时错误之前,我们首先需要进入薄荷的详尽型号检查。在MINT中,您必须处理所有可能的数据值。例如,涉及符合枚举的此交换盒语句:
enum usertype {trialfreepremium} fun help(type:usertype):string {case(type){usertype ::试验=> "你正在审判" Usertype :: free => "升级到高级" }}
这将抛出编译错误,因为我们没有处理类型为usertype :: premium的可能性。
薄荷中没有空值;而是错误和意外值被编码为枚举。函数具有错误,例如HTTP请求和JSON.parse返回可能或结果枚举,必须始终处理其枚举。
枚举结果(错误,值){err(错误)确定(值)} //内置enumenum可能(值){nother只是(value)} //内置的enumresult(http.errorresponse,响应)// http请求,返回错误或ok concoptemaybe(对象)//json.parse,可能会返回任何内容。
只有一个平等运算符,它不支持隐式类型的胁迫,因此不允许对多种数据类型进行比较。
MINT只有一个平等运算符(==),它不允许对多种数据类型进行比较。 JavaScript有两个平等运营商:
无论数据类型如何,都会比较两个操作数值的双重(==)。当这些操作数具有不同的数据类型时,它们被隐式地胁迫。
双重等于非常有问题,不鼓励其使用。 1和“1”是相等的,所以是假的,而且这些例子可能看起来有点合理,所以让我们进一步走一点:
这是什么疯狂?你可能会问。为什么它是JavaScript的平等系统。轻轻地把东西弄得一团糟。双重平等标志调用类型胁迫是热闹的,因为它的头痛诱导;微妙的虫子肯定会在没有倾心的使用情况下裁剪。
相比之下,MINT甚至不会允许您比较两种不同的数据类型。
假设您想将对象与嵌套对象进行比较,因此平等运算符不可能:
Actor1和Actor1duplicate变量显然具有相同的值,但JavaScript不会认为它们相等。要比较这些函数,您需要通过使用来自Node.js util模块的IsDeepStrictequal函数或通过添加Lodash等第三方依赖项来滚动自己的递归函数。
Const Actor1 = {名:" Tom Cruise"电影:[{标题:"使命不可能" const} const actor1duplicate = {name:" tom cruise"电影:[{标题:"使命不可能" const} const antor2 = {name:" daniel craig"电影:[{标题:"幽灵" }]} Actor1 === Actor1 // Trueactor1 === Actor2 // Falseacor1duplicate === Actor1 // false
您可能会说:但是如果没有语言级别支持,这可以解决。是的,这是真的,但语言级别支持与使用用户定义的函数的支持有很大差异。
为了说明这一点是另一种情况:我们如何在JavaScript中使用唯一对象创建迭代?
运行上面的代码不会删除重复的actor,因为set初始化参数中的每个数组项是一个对象,JavaScript使用用于非原始值的引用平等。所以在JavaScript中:
答案通常非常笨重地使用JSON.Stringify(对象)来修改对象的原型并使用Lodash等依赖项。
但由于价值平等是MINT中的语言级功能,因此意味着不需要外部依赖性和额外的复杂性。由于设置项目在内部使用它们的值而不是引用:
重复数据删除只能被动地,而不是由于针对这个单一用例而明确编写的函数,而是由于如何设计语言。
语言级实现也意味着均匀性。您可以期望每个人的代码或库都表现得不起,因为他们可以访问相同的数据类型和它们的相应操作。
不可变数变量不可改变。因此,您的申请可以保证州。这允许更少的错误,更好的性能,更容易调试代码。
数字= [1,2,3]数字[0] = 100 / * Won' t工作* / user = {name =" user1",电子邮件="电子邮件@ gmail.com& #34;} user.name =" simdi" / * Won' t工作* / updatedUser = {用户|名称=" simdi",电子邮件="电子邮件@ gmail.com" } / *看起来类似于传播操作员语法:const updateduser = {...用户,名称:" simdi",电子邮件:"电子邮件@ gmail.com"} * /更新numbers = array.updateat(0,(){100},数字)
除Object.freeze中,您需要额外的第三方库,如immutable.js,以在JavaScript代码中使用不可变数据结构。
MINT实现了一些功能编程想法,如部分应用程序。部分应用程序允许您懒自应用功能参数;您不需要用其所有参数调用函数。相反,当您用较少的参数调用而不是预期的函数时。它只是返回剩余参数的新函数。
//部分应用程序examplefun添加(a,b){a + b} add(5,1)== 6increment = Add(1)递减= Add(5)增量(5)== 6打击(5)== 4
部分应用程序允许您从一般目的创建专用函数。在Javascript中这样做需要通过第三方库。但薄荷没有额外的库处理这一点。
有趣的双(x:number){x * 2} fun add(x,y){}有趣边界(min,max,score){} x =得分|>双|>添加(5)/ *部分应用* / |>绑定(0,10)
这个|>语法称为管道操作员,它允许您沿着一系列功能“通过”值。如果您注意到,则部分应用函数,添加和绑定频率,因为它们被称为少于它们的值。部分应用程序和管道语法具有协同作用,并且无法使用当前的JavaScript复制此协同作用。
公平有一个TC39的提案,用于将管道运营商添加到JavaScript,这将根据管道与管道相同。但是,它仍然在舞台上,因此除非您安装Babel插件,否则您将无法使用它,因为没有浏览器支持它。
MINT中的样式用样式关键字声明。这些样式在本地范围内为组件。您使用常规SASS语法编写样式:
MINT中的风格带有一些额外的额外津贴:字符串插值和样式道具。使用String Interpolation在样式中,您可以轻松地将表达式嵌入到CSS定义中直接评估为字符串类型的表达式。样式道具允许像函数一样传递参数。
style buttonstyle(primary:bool,color:string,hovercolor:string){padding:2em;颜色:#{color}; //字符串插值背景 - 颜色:白色;如果(主要){背景 - 颜色:蓝色;}&:悬停{背景 - 颜色:黑色;颜色:#{hovercolor}; }}
使用内置样式对象执行与反应类似的事情,因为不支持伪选择器,除非您使用CSSmodules等第三方样式替代品,否则使用CSSmodules和样式组件。即便如此,CSS模块不支持样式道具和字符串插值,因为此示例显示:
/ * button.css * /。按钮{padding:2em;}。主{背景 - 颜色:蓝色;}。按钮:悬停{背景 - 颜色:黑色;} / * button.jsx * /<按钮classname = { `$ {styles.button} $ {props.primary?样式。''}`}}>这是一个按钮< / button>
使用CSS模块通知,没有办法基于道具动态设置悬停颜色。
风格的组件紧密耦合到其款式。难以重复使用与其他元素相同的风格。
MINT允许您通过链接“::”表达式来撰写样式。返回上一个按钮示例,让我们创建一个动画样式:
薄荷中的进口是隐含的;您从不使用导入语句导入任何内容。没有导入关键字。这可以防止大量Codebases中的疯狂嵌套导入常见:
它使任何组件,函数或模块重新定位到任何文件夹或文件中,因为没有任何导入语句来解析。
你可能会认为这是一个缺点。对于一个,这种缺乏冗长可能会令人困惑地令人困惑。其次,它意味着像组件,函数和模块一样的顶级构造不能具有相同的名称。一种方法来避免这种情况是使用模块“命名空间”这些构造。当然,在大的CodeBases中,您需要提出一个良好的命名方案来避免模块命名冲突。
当前的JavaScript生态系统尝试从其他语言中遵循其他语言的概念,将它们实现为库,并且当无法使用Babel等转发器来访问下一代JavaScript功能时。
这是javascript的多功能性的证明,但也是它的垮台;它导致碎片化,有一千个和一种方法可以做一件事。
如果薄荷捕获(我希望它),您将不会思考是否使用WebPack或Parcel,Redux或MobX,样式组件或Sass。相反,您将使用单一语言级别实现。提出一个问题,你不必说哦,我正在使用这个库来导航或该库进行国家管理。给出的答案将广泛适用于他人。
也许我们前往一个我们认为javascript的时代,我们都知道它 - 我们都知道它,但我们几乎没有代码,而是在张版,榆树,理由和薄荷中封装它,然后抽出它作为低级别的Arcana。
我相信薄荷的目标是一个高贵的目标,但一个思想必须娱乐 - 如果它不会抓住它会成为它试图摧毁的东西?相关XKCD漫画:
标签:MINT,单页应用程序,Web开发