www.91084.com

GVKun编程网logo

njs 0.7.12 发布,nginx 的 JavaScript 脚本语言(nginx node.js)

29

在这篇文章中,我们将带领您了解njs0.7.12发布,nginx的JavaScript脚本语言的全貌,包括nginxnode.js的相关情况。同时,我们还将为您介绍有关10个有趣的JavaScript

在这篇文章中,我们将带领您了解njs 0.7.12 发布,nginx 的 JavaScript 脚本语言的全貌,包括nginx node.js的相关情况。同时,我们还将为您介绍有关10 个 有趣的 JavaScript 的脚本语言、AJAX与JavaScript脚本语言、CoffeeScript 1.12.0 发布,脚本语言、CoffeeScript 1.12.1 发布,脚本语言的知识,以帮助您更好地理解这个主题。

本文目录一览:

njs 0.7.12 发布,nginx 的 JavaScript 脚本语言(nginx node.js)

njs 0.7.12 发布,nginx 的 JavaScript 脚本语言(nginx node.js)

njs 0.7.12 已发布。njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能耗更低、更符合 nginx 应用场景的小虚拟机实现,可以理解成 nginx 为其实现了一套自己的词法解析。

作为 nginx 的插件,njs 的安装方式是重新编译 nginx。

新版本下载地址:http://nginx.org/en/docs/njs/install.html

主要变化

nginx modules:

  • Bugfix:修复了 Fetch API 中的Headers()constructor。

Core:

  • Feature: 在 crypto 模块中添加了Hash.copy()方法 。

  • Feature:添加了 zlib 模块。

  • Improvement:增加了对export {name as default}语句的支持。

  • Bugfix:根据规范修复了Numberconstructor。

 更多详情可查看 Changelog

10 个 有趣的 JavaScript 的脚本语言

10 个 有趣的 JavaScript 的脚本语言

我们都知道javascript并不是实现所有任务的最佳语言,当遇到复杂的应用时,它可能就不太适合。为了避免这个问题,已经创建了几种新的语言和现有语言的变体,它们都生成可以在浏览器中运行的代码,而无需编写任何javascript代码,也不用考虑语言的局限性。

Dart 是一种经典的面向对象语言,其中所有事物都是对象,任何对象都是类的实例(对象也可以充当函数)。它专门用于构建浏览器、服务器和移动设备的应用程序。它由谷歌维护,并且是 驱动下一代 AdWords 用户界面的语言 , 而 AdWords 是给谷歌创造收入的最重要的产品,这本身就是在证明其大规模的力量。

该语言可被翻译成 JavaScript ,以便在浏览器中使用,或者由 Dart VM 直接解释执行,这也允许你构建服务器应用程序。可以使用 Flutter SDK 创建移动应用程序。

复杂的应用程序还需要一组成熟的库和专门为此任务而设计的语言特性,而 Dart 包含所有这些库和特性。一个流行的库的例子是 AngularDart ,Angular 的 Dart 版本。

它允许你编写类型安全的代码,而不会太有侵入性;你可以编写类型,但你不需要这样做,因为它们可以被推断出来。这允许创建快速原型,而不必过度考虑细节,但一旦你的原型可以工作,你可以添加类型以使其更加健壮。

立即学习“Java免费学习笔记(深入)”;

关于虚拟机中的并发编程,Dart 使用所谓的 Isolates 连同它们自己的内存堆,来代替共享内存线程(Dart 是单线程的),使用消息实现通信。 在浏览器中,这个事件稍有不同:你并不是创建新的 isolates, 而是创建新的 Workers 。

// Example extracted from dartlang.org

import ''dart:async'';
import ''dart:math'' show Random;

main() async {
  print(''Compute π using the Monte Carlo method.'');
  await for (var estimate in computePi()) {
    print(''π ≅ $estimate'');
  }
}

/// Generates a stream of increasingly accurate estimates of π.
Stream<double> computePi({int batch: 1000000}) async* {
  var total = 0;
  var count = 0;
  while (true) {
    var points = generateRandom().take(batch);
    var inside = points.where((p) =&gt; p.isInsideUnitCircle);
    total += batch;
    count += inside.length;
    var ratio = count / total;
    // Area of a circle is A = π⋅r², therefore π = A/r².
    // So, when given random points with x ∈ ,
    // y ∈ , the ratio of those inside a unit circle
    // should approach π / 4. Therefore, the value of π
    // should be:
    yield ratio * 4;
  }
}

Iterable<point> generateRandom([int seed]) sync* {
  final random = new Random(seed);
  while (true) {
    yield new Point(random.nextDouble(), random.nextDouble());
  }
}

class Point {
  final double x, y;
  const Point(this.x, this.y);
  bool get isInsideUnitCircle =&gt; x * x + y * y <p> </p><p> 开始使用Dart</p><h2>TypeScript</h2><p>TypeScript 是 JavaScript 的超集;有效的 JavaScript 程序也是有效的 TypeScript 程序,但后者添加了静态类型。其编译器也可以充当从 ES2015+ 到当前实现的转译器,所以你总能获得最新的功能。</p><p>不同于许多其他语言,TypeScript 保持 JavaScript 的精神完好无缺,只增加了功能来提高代码的可靠性。这些是类型注释,以及其他类型相关的功能,使得编写 JavaScript 更加愉快,这得益于启用了静态分析器等专门的工具来帮助重构过程。另外,类型的添加改进了应用程序不同组件之间的接口。</p><p>类型推断受到支持,因此你不必从一开始就编写所有的类型。你可以编写快速解决方案,然后添加所有的类型以获取对代码的信心。</p><p>TypeScript 也支持高级的类型,如 intersection(交集) 类型 、 union(并集、联合) 类型、 类型别名、 可区分联合(discriminated union)和类型保护。你可以在 TypeScript 文档 站点的 高级类型 页面中查看所有这些类型。</p><p>如果你使用 React,则还可以通过添加 React 类型来支持 JSX。</p><pre>class Person {
    private name: string;
    private age: number;
    private salary: number;

    constructor(name: string, age: number, salary: number) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    toString(): string {
        return `${this.name} (${this.age}) (${this.salary})`;
    }
}
登录后复制

 

Elm 是一种纯粹的函数编程语言,它编译成 JS、 HTM L和 CSS。 你可以只使用 Elm 构建一个完整的站点。这使之成为 JavaScript 框架如 React 的一个很好的替代方案。用它构建的应用程序会自动使用虚拟 DOM 库,使其速度非常快。其一大优点是内置的体系结构,它使你忘记了数据流,而将重点放在数据声明和逻辑上。

在 Elm 中,所有函数都是纯粹的,这意味着它们将总是对给定输入返回相同的输出。除非你指定,否则它们不能做任何其他事情。例如,为了访问远程 API,你将创建 command (命令)函数来与外界通信,以及创建 subscription (订阅)以侦听响应。纯粹性的另一点是,值是不可变的;当你需要某样东西时,你创建新值,而不是修改旧值。

Elm 的采用可以是渐进式的;可以使用 ports (端口) 与 JavaScript 和其他库进行通信。虽然 Elm 尚未达到版本 1,但它正被用于复杂和大型的应用程序,使其成为复杂的应用程序的可行的解决方案。

Elm 最具吸引力的功能之一是初学者友好的编译器,不是生成难以阅读的消息,而是生成代码,可以帮助你修复你的代码。如果你在学习该语言,编译器本身就可以大有助益。

module Main exposing (..)

import Html exposing (..)


-- MAIN


main : Program Never Model Msg
main =
    Html.program
        { init = init
        , update = update
        , view = view
        , subscriptions = subscriptions
        }



-- INIT


type alias Model = String


init : ( Model, Cmd Msg )
init = ( "Hello World!", Cmd.none )


-- UPDATE


type Msg
    = DoNothing


update : Msg -&gt; Model -&gt; ( Model, Cmd Msg )
update msg model =
    case msg of
        DoNothing -&gt;
            ( model, Cmd.none )


-- VIEW


view : Model -&gt; Html Msg
view model =
    p [] [text model]


-- SUBSCRIPTIONS


subscriptions : Model -&gt; Sub Msg
subscriptions model =
    Sub.none
登录后复制

 

开始使用 Elm

PureScript

PureScript 是由 Phil Freeman 创建的纯函数式强类型的编程语言。它旨在给可用的 JavaScript 库提供强大的兼容性,在精神上类似于 Haskell,但保持 JavaScript 的核心。

PureScript 的一个强项是它的极简主义。它不包括在其他语言中被认为是必需的功能的任何库。例如,不是编译器本身包含生成器和 promises,而是你可以使用特定的库来完成任务。你可以为所需功能选择想要的实现,这样可以在使用 PureScript 时实现高效和个性化的体验,同时保持生成的代码尽可能小。

其编译器的另一个显著特征就是能够在保持与 JavaScript 的兼容性的同时, 用库和工具生成整洁和可读的代码。

像其他语言一样,PureScript 有自己的构建工具叫做 Pulp,可以与 Gulp 进行比较, 但是用于以这种语言编写的项目。

关于类型系统,与 Elm不同,即另一种 ML 式的语言,PureScript 支持高级类型的功能,如取自 Haskell 的 higher-kinded types(高级类类型) 以及 type classes(类型类), 从而允许创建复杂的抽象。

module Main where

import Prelude
import Data.Foldable (fold)
import TryPureScript

main =
    render $ fold
      [ h1 (text "Try PureScript!")
      , p (text "Try out the examples below, or create your own!")
      , h2 (text "Examples")
      , list (map fromExample examples)
      ]
  where
    fromExample { title, gist } =
      link ("?gist="  gist) (text title)

    examples =
      [ { title: "Algebraic Data Types"
        , gist: "37c3c97f47a43f20c548"
        }
      , { title: "Loops"
        , gist: "cfdabdcd085d4ac3dc46"
        }
      , { title: "Operators"
        , gist: "3044550f29a7c5d3d0d0"
        }
      ]
登录后复制

 

开始使用 PureScript

CoffeeScript

CoffeeScript 是一种语言,旨在公开 JavaScript 的良好部分,同时提供更整洁的语法并保留语义。虽然该语言的流行度近年来一直在减弱,但它正在改变方向,现在正在获得一个新的主要版本,为 ES2015+ 的功能提供支持。

你用 CoffeeScript 编写的代码被直接翻译为可读的 JavaScript 代码,并保持与现有库的兼容性。从版本 2 开始,编译器将产生与最新版本的 ECMAScript 兼容的代码。例如,每次你使用一个类,你就获得一个 JavaScript 类。另外,如果你使用 React,也有好消息: JSX 与 CoffeeScript 兼容。

以上内容介绍了10个有趣的语言,这些语言都可以转换成JavaScript代码在浏览器中执行,也可以在Node.js这样的平台上执行。希望能帮助到大家。

相关推荐:

如何用php传递数组给js脚本

JavaScript实现浏览器用户代理检测脚本的方法详解

JavaScript中关于表单脚本的实用技巧

以上就是10 个 有趣的 JavaScript 的脚本语言的详细内容,更多请关注php中文网其它相关文章!

AJAX与JavaScript脚本语言

AJAX与JavaScript脚本语言

上一篇博客中提到了ajax并非是一种新的技术,而是几种原有技术的结合体,XMLHttpRequest对象是AJAX的核心技术,而JavaScript也起到了不小的作用,XMLHttpRequest对象我们已经介绍过了,详情请见点击打开链接,下面我将介绍JavaScript的高级知识部分


一.数组的使用

1.创建数组

(1)一维数组

//使用new Array()

var array1 = newArray();

//使用[]操作符

var array2 = [];

//创建的同时定义数组中的元素,使用new Array()方式

var array3 = newArray(1,2,3);

//使用[]操作符

var array4 = [1,3];

(2)多维数组

//使用new Array()

var array5 = newArray(1,new Array(2,3),4);

//使用[]操作符

var array6 =[1,[2,3],4];


2.元素的获取

(1)一维数组

//利用数组下标进行元素的获取

array3[1]; //获取到array3中的第二个元素

(2)多维数组

array5[1][0];


3.元素的设置

(1)一维数组

array4[2] = 111;//设置array4中的第三个元素的值为111

(2)多维数组

array5[1][0] = 222;

JavaScript中的数组是可以动态改变大小的,因此可以直接给一个不存在的下标设置元素值

array6[99] = 100;

4.数组中的方法

(1)concat

这个方法可以用来做数组的连接或者说合并,原数组内容不会变更,将返回一个新的数组

var array41 =array4.concat(101,102,103);

var array42 =array4.concat([104],[105]);

var array43 =array4.concat(array4);

(2)join

这个方法可以将数组当中的元素,按照制定的分隔符连接成字符串的输出,原数组的内容不会改变

var strarray431 =array43.join("");//返回的结果为1211112111

var strarray432 =array43.join("+");//返回的结果为1+2+111+1+2+111

(3)slice

这个方法可以返回当前数组的子数组,原数组的内容不会改变

var slicearray1 =array43.slice(0,3);//从0下标开始,到3下标之前的元素返回成新的数组,返回结果为1,111

var slicearray2 =array43.slice(4);//从4下标开始,到数组尾部的所有元素返回成新的数组,返回结果为2,111

var slicearray3 =array43.slice(-2,-1);//从当前数组的倒数第二个元素开始,到倒数第1个元素之前的所有内容,返回成新的数组,返回结果为2

(4)push,pop

在数组尾端追加(push)或删除(pop)元素,将会改变原数组的内容

array43.push(200);

array43.push(201,202);

array43.push([203,204]);

array43.push(array41);

var arraypop =array43.pop();

var arraypop =array43.pop();

(5)unshift,shift

在数组的开头进行追加(unshift)或删除(shift)的操作,将会改变数组的内容

array43.unshift(300);

array43.unshift(301,302);

array43.unshift([303,304]);

var arrayshift =array43.shift();

var arrayshift2 =array43.shift();

(6)reverse

这个方法可以翻转数组中的元素,修改原数组的内容

array43.reverse();

(7)sort

这个方法可以对数组中的元素进行排序,修改原数组的内容

array43.sort();//没有参数,是按照字母序对数组中的元素进行升序的排序

array43.sort(function(a,b){ return a - b;});//就是按照数值大小进行的一个升序的排序,如果返回的是负值,则a会出现的b前面

array43.sort(function(a,b){return b - a; });//就是按照数值大小进行了一个降序的排序

(8)splice

可以删除数组中的一部分元素,并且把删除的内容进行返回;也可以在制定的位置添加元素,原数组的内容发生改变var splicearray1 = array43.splice(4,2);//从下标为4的元素开始删除,删除2个元素

var splicearray2 =array43.splice(4);//从下标为4的元素开始删除,直到数组末尾的元素都被删除array43.splice(1,400,401);//在下标为1之前,插入400,401

array43.splice(1,[400,401]);//在下标为1之前,插入数组[400,401]

二.对象的创建与属性的操作

1.创建对象

//方式1

var obj1 = new Object();

//方式2

var obj2 = {};

2.增加属性,使用.操作符

obj1.num = 1;

obj1.str = "String";

obj1.hello = function(){alert("hello!"); }

obj2.obj = obj1;

3.属性的访问

//方法1,使用.操作符

alert("obj2.obj.num");alert("obj2.obj.str"); obj1.hello();

//方法2,使用[]操作

alert(obj2["obj"]["num"]);

alert(obj2["obj"]["str"]);

obj1["hello"]();

4.对象直接量定义方法,利用{}

var obj3 = { num:1,str:"String",hello:function(){ alert("hello"); }}


三.类

1.类的定义

function 模拟

function ClassName(){

}*/

提示:建议采用下面的形式来定义一个js中的类,可以和普通的function进行区分;建议类名首字母大写,以便更好的和普通的function进行区分

var ClassName=function(){

}

举例:

           //定义一个Book类,这个function还承担了模拟构造函数的工作
           //在使用new操作符创建Book类的对象时,这个function中的代码会被执行
           //this代表当前对象,下面执行book1的时候this指book1,执行book2的时候this指book2     
            var Book =function(name){
               //定义公有有的属性
                this.name= name;
               //定义公有的方法
               this.getName = function(){
                    returnthis.name;
                };
               this.setName = function(nname){
                   this.name = nname;
                };
            };     
            functionootest(){
               var book1 = new Book("AJAX");//这个new操作符相当于先创建了一个简单对象,调用了类的构造函数
                var book2= new Book("AJAX2");
               alert(book1.getName());
               alert(book2.getName());
               book1.setName("Java");
               alert(book1.getName());        
            }
 

改进之后的,使用上了原型,prototype

              var Book =function(name){
               //共有属性在构造方法里面定义,通过this关键字
                this.name= name;
                if(typeofBook._init ==="undefined"){
                   //共有方法在构造方法外定义,通过原型定义
                    Book.prototype.setName = function(nname){
                    this.name= nname;
                     };
                    Book.prototype.getName = function(){
                    return this.name;
                     };
                }
                Book._init= true;
            };
   
            functionootest(){  
               var book1 = new Book("AJAX");//这个new操作符相当于先创建了一个简单对象,调用了类的构造函数
               var book2= new Book("AJAX2");
               alert(book1.getName());
               alert(book2.getName());
               book1.setName("Java");
               alert(book1.getName());
          }
 

2.类的属性和方法的定义

(1)私有的属性和方法的定义及调用

                 //普通的方法
                var priObj = new function(){
                    var priname ="wang";
                    this.getName = function(){
                        return priname;
                    };
                    this.setName=function(nname){
                        priname = nname;
                    };
                };
       
               //利用匿名方法直接调用的方式,来实现一个对象拥有私有的信息
                var priObj = (function(name){
                    var priname = name;
                    return{
                        getName:function(){
                            return priname;
                        },setName:function(nname){
                            priname = nname;
                        }
                    };
                })("wang");


(2)定义公有的静态属性

            Book.staticValue = 10;
            //定义公有的静态方法
            Book.changeValue = function(){
                Book.staticValue++;
            };
 

改进之后的,使用上了原型,prototype

  var Book =function(name){
               //共有属性在构造方法里面定义,通过this关键字
                this.name= name;
                if(typeofBook._init ==="undefined"){
                   //共有方法在构造方法外定义,通过原型定义
                    Book.prototype.setName = function(nname){
                    this.name= nname;
                     };
                    Book.prototype.getName = function(){
                    return this.name;
                     };
                    Book.prototype.getCount = function(){
                    addCount();
                    return count;
                     };
                }
                Book._init= true;

(3)利用局部变量来模拟私有属性和方法

	var count= 0;
                varaddCount = function(){
                   count++;
                };
            };
    
            functionootest(){
                //根据类名反射生成对象,只知道Book,只要要传的参数"wang"
                var book =reflect("Book",["wang"]);
               alert(book.getName());
                //判断一个对象是否拥有某个属性
               //hasOwnProperty这个方法只能判断在对象上直接定义的属性,对于继承来的属性不能直接判断
                var bool =book.hasOwnProperty("name");
               alert(bool);
                //需要有一个替代方法,让getName这种继承的属性也能被判断
                var bool2 =book.hasProperty("getName");
               alert(bool2);
               
               //遍历book对象上的所有属性
                for(varproName in book){
                   alert(book[proName]);
                }
               
               //如果我们需要获得一个对象上,所有属性值不是function的属性
                varproArray = [];
                for(varproName in book){
                    vartemp = book[proName];
                   if(typeof temp !== "function"){
                       proArray.push(proName);
                    }
                }
               alert(proArray);

四.创建命名空间

1.方法:createNameSpace("SpaceName");

我想再创建一个Book类,为了避免与刚刚创建的Book冲突,因此需要一个命名空间,使新建的Book在此命名空间中,它就相当于一个包,也可以理解为 这两个Book类的路径不一样了.

  //我需要一个叫做com.wang的命名空间,然后这个Book类属于这个命名空间
    createNameSpace("com.wang");
  //定义com.wang这个命名空间上的 Book类
   com.wang.Book = function(){
                    
     }
   varcomwangBook = new com.wang.Book ();
               
   };    

2.创建命名空间上的辅助方法

functioncreateNameSpace(nameSpace){
                 //com.wang,如果需要建立命名空间,实际上就是要保证有一个com的对象,并且com中有一个wang的属性值,这个属性值也是一个对象
                  varattrs = nameSpace.split(".");

(1)判断根节点对象是否存在,不存在才进行创建

                 var obj;
                  try{
                      obj= eval(attrs[0]);
                 }catch(e){
                     window[attrs[0]] = [];
                      obj= window[attrs[0]];
                  }

(2)对根节点对象(命名空间)下面的子孙对象进行逐一的遍历判断,如果不存在,就进行创建

   for (vari = 1;i<attrs.length ; i++){
                    if(obj[attrs[i]] === undefined){
                        obj[attrs[i]] = {};
                     }
                    
                    //修改当前对象,继续进行遍历
                     obj =obj[attrs[i]];
                 }
              }

(3)扩展Object类的方法,判断当前对象是否有某个属性

  Object.prototype.hasProperty=function(){
                   return(this && this[proName])!== undefined;
                }

(4)反射创建对象方法

    //第一个参数是类名
          //第二个参数是创建对象需要的所有参数组成的数组
           functionreflect(className,args){
               try{
                  //如何把字符串类型的className转换成对应的一个函数
                   varrClass = eval(className);
                  //为了创建对象需要的所有参数在一个数组里面["1","2"];
                  //最终我们调用new创建的时候,参数表的写法应该("1","2");
                   varoargs = args.join(",");
                   var obj= new rClass(oargs);
                   returnobj;
               }catch(e){
                   returnnull;
               }         
           }
 

以上为JavaScript中的一些知识,其实都是最基础的,与之前的学习进行对比,好多地方也是相似的,上面提到的类的创建的,还有他的一些属性,方法,不管是私有的还是公有的,都是模拟的,貌似它的很多东西都是模仿来的,以后的学习还需要不断的总结分析,不能与之前的脱了干系,JavaScript也是面向对象,与C#的面向对象编程学习也有很多不同之处,需要对比学习,这些东西还需要不断的学习.

CoffeeScript 1.12.0 发布,脚本语言

CoffeeScript 1.12.0 发布,脚本语言

CoffeeScript 1.12.0 发布了。 coffeeScript这一门编程语言构建在JavaScript之上,其被编译成高效的JavaScript,这样你就可以在web浏览器上运 行它,或是通过诸如用于服务器端应用的Node.js一类的技术来使用它。编译过程通常都很简单,产生出来的JavaScript与许多的最佳做法都保持了一致。 此次更新内容:

  • CoffeeScript 现在支持 ES2015 标记的模板字面量。Note that using tagged template literals in your code makes you responsible for ensuring that either your runtime supports tagged template literals or that you transpile the output JavaScript further to a version your target runtime(s) support.

  • CoffeeScript 现在提供一个 for…from 用于 ES2015 的输出语法  for…of。Sorry they couldn’t match, but we came up with for…of first for something else.) This allows iterating over generators or any other iterable object. Note that using for…from in your code makes you responsible for ensuring that either your runtime supports for…of or that you transpile the output JavaScript further to a version your target runtime(s) support.

  • 在单反引号嵌入在 JavaScript 中,反引号现在可以通过\`转义

  • 浏览器测试现在再次在浏览器中运行,如果您想测试浏览器,可以在这里访问

  • ES2015 中仅限用于 CoffeeScript 的关键字 imports and exports 现已被忽略.

  • 编译器现在在尝试导出匿名类时抛出一个错误

  • 与 Token 和位置数据相关的错误修复,更好的源映射和改进与下游工具的兼容性

完整更新内容和发布说明

下载地址

  • Source code (zip)

  • Source code (tar.gz)

CoffeeScript 1.12.1 发布,脚本语言

CoffeeScript 1.12.1 发布,脚本语言

脚本语言 CoffeeScript 1.12.1 发布了。本次更新如下:

  • 您现在可以导入名为默认的模块成员,例如 import {default} from''lib''。 虽然在 ES2015 中,你不能导入整个模块,并将其命名为默认值(因此不允许从 ''lib'' 导入默认值)。

  • Fix regression where from as a variable name was breaking for loop declarations. For the record, from is not a reserved word in CoffeeScript; you may use it for variable names. from behaves like a keyword within the context of import and export statements, and in the declaration of a for loop; though you should also be able to use variables named fromin those contexts, and the compiler should be able to tell the difference.

发布说明完整更新内容

下载地址

  • Source code (zip)

  • Source code (tar.gz)

关于njs 0.7.12 发布,nginx 的 JavaScript 脚本语言nginx node.js的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于10 个 有趣的 JavaScript 的脚本语言、AJAX与JavaScript脚本语言、CoffeeScript 1.12.0 发布,脚本语言、CoffeeScript 1.12.1 发布,脚本语言的相关信息,请在本站寻找。

本文标签: