首页 文章 精选 留言 我的

精选列表

搜索[管理后台],共10000篇文章
优秀的个人博客,低调大师

网站前端和后台性能优化26

开发灵巧的事件处理程序 Develop Smart Event Handlers tag:javascript 如果有太多的事件处理逻辑部署在DOM树的不同元素上,它们的频繁执行会拖慢页面的响应速度。而使用事件委托是一个好的解决方法。如果在一个Div中有10个按钮,与其在每个按钮上都放一个事件处理程序,步入只在Div上放一个事件处理程序。事件会冒泡上溯,这样你就会捕获这一事件,并找出是哪个按钮发起的它。 同样,你并不需要等待onload事件来启动一些操作DOM树的程序。你只需要保证你需要操作的元素可用就可以了。你不需要等待所有的图片下载完毕,你应当使用DOMContentLoaded事件来替代onload事件,当然,目前并不是所有浏览器都支持这一事件,你可以使用YUI Event组件,其中包含了一个onAvailable函数。 查看Julien Lecomte的"High Performance Ajax Applications"获取更多信息。

优秀的个人博客,低调大师

网站前端和后台性能优化22

避免404错误 No 404s tag:内容 一个获得没用的404响应的HTTP请求对于宝贵的HTTP请求资源来说是完全不必要的,而且这样还会减慢用户的体验。 有的网站提供了有帮助的404错误信息,比如"你是否在寻找……?",这样虽然能提高用户体验,但同样浪费了服务端资源(比如数据库)。尤其不妙的是在请求一个外部的Javascript脚本文件失败时获得的一个404错误,因为这样不但会堵塞并行的下载,而且浏览器会尝试分析404响应的内容,来辨识它是否是有用的Javascript代码。

优秀的个人博客,低调大师

网站前端和后台性能优化11

避免重定向 (Avoid Redirects) tag:content 重定向结束于 301或302状态码。这里有一个301响应的HTTP头的例子: HTTP/1.1 301 Moved Permanently Location: http://example.com/newuri Content-Type: text/html 浏览器会自动把用户转向Location域中指明的Url地址。HTTP头里包含了重定向所需的所有信息。响应的主体一般是空的。301或者302响应都不会被实际缓存,除非添加额外的头部,比如 Expires或者Cache- Control指明了它应该被缓存。meta refresh标签和JavaScript也可以将用户重定向到不同的URL,但如果你必须执行重定向,最好的方法是使用标准的3XX HTTP状态代码,以便使后退按钮工作正常。 需要谨记的是,重定向降低了用户体验。在用户和HTML文档之间插入的重定向延误了页面的呈现和组件下载,因为它们都不可能在获得HTML文档之前开始。 一种最浪费性能的重定向频繁发生而网络开发者们却往往没有意识到,那就是当地址中应当有一个左斜线(/)却没有的时候。比如,访问http://astrology.yahoo.com/astrology会导致一个301效应并重定向到http://astrology.yahoo.com/astrology/(注意这里加了一个左斜线)。在Apache中,这可以使用mod_rewrite,或者在Apache事件处理中使用DirectorySlash指令来修补。 使用重定向的另一个常见场景是连接旧网站和新网站。还包括连接网站的不同部分,或者在不同情况下(比如依据浏览器的类型,用户的类型等)重定向用户。使用重定向来连接两个网站很简单而且需要很少的额外代码。虽然在这些情况下使用重定向减少了开发者的麻烦,但却降低了用户体验。如果两部分在同一个服务器上,可以使用Alias 和rewrite来替代重定向。如果域名变更引起了重定向,可以创建一个CNAME(一种可以创建一个别名使一个域名指向另一个的DNS记录)结合 Alias 或者mod_rewrite来替代重定向。

优秀的个人博客,低调大师

网站前端和后台性能优化14

让Ajax可以缓存 (Make Ajax Cacheable) tag:content Ajax 的好处之一是它能给用户提供瞬间的响应,因为它从服务端异步请求数据。但Ajax不能保证用户在等候那些异步的JavaScript和XML响应返回时什么都不做。在应用程序中,用户是否继续等待取决于Ajax怎样应用。比如,在一个基于Web的Email客户端用户会 等候Ajax返回他们所搜索的邮件信息。记住异步并不代表“即刻”。 为了提高性能,优化Ajax响应很重要。提高Ajax性能最重要的方式是使响应缓存,正如“添加一个过期期限和缓存控制头”这一节讨论的。这些原则同样适用于Ajax。 Gzip组件 减少DNS查询 压缩JavaScript 避免重定向 设定ETag 我们看一个例子。一个Web2,0的邮件客户端可能会用Ajax自动下载用户地址簿。如果用户从上次使用邮件网站以来没有修改她的地址簿,那么如果Ajax响应使用了长期失效时间或者缓存控制头部,地址簿就可以从缓存中读取出来。浏览器必须被告知“使用之前的缓存地址簿”而不是“请求一个新的地址簿”。可以在地址簿Ajax的URL中添加一个标识用户最后一次修改地址簿的时间戳,比如,&t=1190241612。如果地址簿从最后一次下载后没有被更改,时间戳将相同而地址簿将会从浏览器的缓存中得到来替代额外的HTTP传输。如果用户更改了她的地址簿,时间戳会保证新的URL不会和缓存中的匹配,而且浏览器会请求会请求更新的地址簿记录。 即使你的Ajax响应时动态创建的,而且只适用于一个用户,它们依然会被缓存。这样做会让你的Web2.0应用程序更快。

优秀的个人博客,低调大师

网站前端和后台性能优化19

减小DOM元素的数量 (Reduce the Number of DOM Elements) tag:content 复杂的页面意味着更多的字节需要被下载而且也意味着在JavaScript中遍历DOM更慢。比如你在页面中添加一个事件,让它在500或者 5000个DOM元素中循环,它们的效率是不同的。 更多的DOM元素表明有些标签需要被改良而并不一定需要移除实际内容。你是否为了布局而使用繁琐 的网一样的表格?你是否只是为了弥补一些布局的问题而使用了更多的div标签?也许还有更好和更符合语义的标签可以使用。 YUI CSS utilities可以很好的帮助进行布局:grid.css 可以帮助你进行所有的布局,front.css 和 reset.css 可以帮助你去除浏览器默认的格式。这是你开始重新审视你的标签的机会,比如只在语义符合时使用div标签,而不是用它来另起一行。 DOM 元素的数量很好检测,只要在Firebug的控制台里输入: document.getElementsByTagName_r('*').length 那么多少DOM元素算多呢?查看下类似的使用较好的标签的页面。比如Yahoo! Home Page是一个很丰富的页面但只有700以下的DOM元素(HTML 标签)。

优秀的个人博客,低调大师

网站前端和后台性能优化17

后加载组件 (Post-load Components) tag:content 你可以仔细端详下你的页面然后自问:“什么是在页面初始化时必须的?”那么其余的内容和组件可以放在后面。 JavaScript是理想的用来分割onload事件之前和之后的选择。例如你有执行拖放、下拉和动画的JavaScript代码和菜单,它们可以稍后加载,因为用户在初始呈现之后才会在页面上拖动元素。其他的可以被后加载的地方包括隐藏的内容(当用户做某项操作才会展现的内容)和被折叠的图片。 可以帮助你的工具有: YUI Image Loader能帮助你延缓加载折叠的图片,而且YUI Get utility 能够很简单的包装运行中的JS和CSS。比如,打开Firebug的网络选项卡去查看Yahoo! Home Page。 当性能指标和其它网站开发的好的实践一致时是不错的。渐进增强的观念告诉我们当支持JavaScript时,会提高用户体验,但你必须确保在没有JavaScript时页面也能工作。所以当你确保页面工作正常时,你会通过延后加载的那些更花哨的脚本比如拖放和动画,来增强你的页面。

优秀的个人博客,低调大师

网站前端和后台性能优化2

使用内容分布式网络 (Use a Content Delivery Network) tag:server 用户连接你的网站服务器的速度影响响应的快慢。把你的网站布置在多台分布于不同地域的服务器上,会让用户觉得你的页面加载速度更快。那么我们应该从哪里开始呢? 不要一开始就把重新设计你的网站使其能够适应分布式结构作为实现网站地域分布的第一步。根据你的网站的复杂程度不同,更新网站结构的过程也许会包含诸如同步会话状态、在服务器间复制数据库等一系列复杂的步骤。这样你提高用户访问速度的目的反而会被更新网站架构的工作耽误。 记住,用户80-90%的访问时间被花费在下载页面中的图片、样式表、脚本、Flash这些组件上。这是网站展示的黄金法则。那么与其重新设计网站的结构,不如先实现这些静态组件的分布。这不仅仅可以大幅减少响应时间,而且由于内容分布式网络(content delivery networks)的存在,这将是个很简单的工作。 内容分布式网络(CDN)是一系列分布在不同地域的服务器的集合,能够更有效的给用户发送信息。它会根据一种衡量网域距离的方法,选取为某个用户发送数据的服务器。比如,到达用户最少跳或者最快相应速度的服务器会被选中。 一些大型Internet公司拥有他们自己的CDN,但使用公用的CDN服务提供商更为划算,比如 Akamai Technologies, Mirror Image Internet, 或者Limelight Networks。对于刚起步的公司和个人网站来说,CDN服务的花费也许会偏高。但当你的目标用户越来越多而且趋于国际化,用CDN来降低响应时间就很必要了。在Yahoo!,把静态的内容从自己的网络服务器移到CDN提高了用户20%甚至更多的访问速度。转向CDN会是一个只需要相对简单的代码更新的工作,而且那将会显著的提高你的网站访问速度。

优秀的个人博客,低调大师

网站前端和后台性能优化8

使用外部的JavaScript和CSS (Make JavaScript and CSS External) tag:javascript,css 很多性能规则都是解决怎样处理独立的组件的问题的。但是,考虑这些之前,你应该先考虑一个更基本的问题:JavaScript和CSS应该被放于外部的文件,还是内联在页面里? 在实际应用中使用外部的文件往往产生更快的页面,因为浏览器会缓存JavaScript和CSS文件。而内联在页面里的JavaScript和CSS会在每次请求页面时下载。这会减少所需的HTTP请求数,但增大HTML文档的体积。而另一方面,如果放在外部文件里的JavaScript和CSS被浏览器缓存,则既不用增加HTTP请求的数量,HTML文档的体积也会减少。 关键的问题是,外部的JavaScript和CSS的组件被缓存的频率和HTML文档被请求的次数相关。虽然很难去量化,但可以被用很多指标衡量。如果你的网站的用户在每个会话中浏览了很多网页而且很多页面重用了相同的JavaSctipt和样式表,缓存外部文件是有很大潜在的好处的。 很多网站都符合这样的指标。对于这些网站来说,最好的解决方案是把JavaScript和CSS发布为单独的文件。唯一的例外,对于主页,内联的文件更好一些,例如 Yahoo!'s front page 和 My Yahoo!。主页在每个会话中只有很少浏览(也许只有一次),你会发现内联的 JavaScript和CSS会让终端用户的响应更快。 对于有很多页面浏览量的首页来说,有很多能平衡内联文件所提供的HTTP请求减少的效果与外部文件缓存获得的好处的技巧。一种这样的技巧就是把JavaScript和CSS内联在说夜里,但在页面完成加载时动态下载外部文件。随后的页面会调用浏览器中已经缓存的外部文件。

优秀的个人博客,低调大师

网站前端和后台性能优化7

不使用CSS表达式 (Avoid CSS Expressions) tag:css CSS表达式是一种有力的(同时也很危险的)动态设置CSS属性的方法。从IE5开始支持CSS表达式。比如,使用CSS表达式可以实现背景颜色每小时变换的效果。 background-color: expression_r( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" ); 如上所示,表达式方法采用了 Javascript的表达。CSS属性则被设为Javascript表达式的结果。其它的浏览器会忽略CSS表达式,所以对于设置专属IE的属性以便在不同浏览器间能有一致的体验是有用的。、 而CSS表达式的问题是它比大多数人期望的执行次数更频繁。表达式不仅仅在页面展现和重新设置大小的时候执行,在页面滚动,甚至用户在页面上挪动鼠标时都会执行。给CSS表达式添加一个计数器可以跟踪CSS在什么时候和怎样执行。在页面上移动鼠标可以轻易的产生一万次以上的执行。 使用一次性的表达式是减少CSS表达式的执行次数的一个方法,当表达式第一次执行时,CSS表达式会被一个确定的值代替。如果在页面生命周期中,样式属性必须动态的设定,使用事件处理替代CSS表达式是一个可选的方法。如果必须使用CSS表达式,要记得它们会执行上千次并影响页面的性能。

优秀的个人博客,低调大师

网站前端和后台性能优化6

把脚本放在最后(Put Scripts at the Bottom) tag:javascript 脚本可能会堵塞并发的下载。HTTP/1.1规范建议浏览器在每个域名下只进行两个并发下载。如果你把图片放在多个域名下,可以实现多于两个的并发下载。当脚本被下载时,即使使用不同的域名。浏览器也不会进行任何其它的下载。 有些情况下把脚本放到底部并不太容易。比如,脚本使用了document.write 来添加部分页面中的内容,就不能放到页面中更后面的位置。还可能有作用域的问题。很多情况下,还有一些变通的方法。 通常的建议是使用延迟脚本。DEFER属性表明脚本不包含document.write,而且提示浏览器继续展现。不幸的是,Firefox不支持DEFER属性。IE中,脚本可以被延迟,但并不如你期望的那么久。如果一个脚本可以被延迟,那么它也可以被放在页面的底部。这会让你的页面加载的更快。

优秀的个人博客,低调大师

网站前端和后台性能优化10

缩小JavaScript和CSS (Minify JavaScript and CSS) tag:javascript,css 缩小是指从代码中删除不必要的字母,减少文件体积从而提高加载速度。缩减代码时需要移除所有的注释,以及不需要的空白(空格,新行和tab)。这样处理JavaScript之后,会由于下载文件的体积被减少而提高响应的性能。两个常用的缩减JavaScript代码的工具是JSMin 和YUI Compressor。YUI compressor也可以压缩CSS。 代码混淆是另一个可用于源代码的优化方案。它比压缩更为复杂,而且在混淆的过程中更容易产生 Bug。纵观U.S.的前十大网站,压缩获得了21%的体积减小而代码混淆达到了25%。虽然代码混淆的压缩程度更高,但压缩JavaScript的风险更小。 不仅仅要压缩外部的脚本和样式表,内敛的

优秀的个人博客,低调大师

java后台创建url连接,获取接口数据

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/78982905 简介 1. 在实践中,当项目不断进行新功能开发的时候,我们就不可能将所有的方法、功能点全部都写在同一个项目里面,这样也不符合脱耦的趋势; 2. 那么,在项目中,我们既要增加新的功能点,又要最大限度地降低耦合度,我们就要不断地对接口进行深入发掘; 3. 像阿里的分布式服务框架dubbo,也是一种基于接口开发的服务框架,它不仅能松耦合,而且功能点都是通过不断增加接口来不断增加; 4. 本篇博客不讲述接口如何开发,而是简单地介绍,如何通过java创建url连接,获取接口返回来的json数据; 项目实践 /** * 获取接口数据,返回json格式字符串,方法1 * @param url 接口路径 * @param params 传递参数,自定义 * @param key 传递参数标识,自定义 * @return */ public String getData1(String url,String params,String key){ String rs = null; CloseableHttpClient httpClient = HttpClient.createDefault(); try{ //拼接参数,转义参数 String connUrl = url+"?params="+URLEncoder.encode(params,HTTP.UTF-8)+"&key="+key; //创建连接 HttpGet get = new HttpGet(connUrl); //获取以及解析数据 CloseableHttpResponse resp = httpClient.execute(get); rs = EntityUtils.toString(resp.getEntity(),HTTP.UTF-8); }catch(IOException e){ System.out.println("出错了") } return rs; } /** * 获取接口数据,返回json格式字符串,方法2 * @param url 接口路径 * @param params 传递参数,自定义 * @param key 传递参数标识,自定义 * @return */ public String getData2(String url,String params,String key){ HttpURLConnection conn = null; BufferedReader reader = null; String rs = null; try { //拼接参数,转义参数 String connUrl = url+"?params="+URLEncoder.encode(params,HTTP.UTF-8)+"&key="+key; //创建连接 URL url = new URL(connUrl); conn = (HttpURLConnection) url.openConnection(); conn.setUseCaches(false); conn.setConnectTimeout(30000); conn.setReadTimeout(30000); conn.setInstanceFollowRedirects(false); conn.connect(); //获取并解析数据 InputStream is = conn.getInputStream(); reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); StringBuffer sb = new StringBuffer(); String strRead = null; while ((strRead = reader.readLine()) != null) { sb.append(strRead); } rs = sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } if (conn != null) { conn.disconnect(); } } return rs; } 总结 1. 上面提供了两种方法来创建连接,获取接口数据,可自选比较合适的方法; 2. 返回的rs都是json格式的字符串,可直接使用JSONObject object = JSONObject.fromObject(rs)来转换成json对象,然后进行多层次的解析; 3. 实践是检验认识真理性的唯一标准,试一试就知道好不好用了;

优秀的个人博客,低调大师

后台(40)——MyBatis输出映射resultType以及resultMap

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)— 核心基础 Android多分辨率适配框架(2)— 原理剖析 Android多分辨率适配框架(3)— 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 自定义View系列教程08–滑动冲突的产生及其处理 版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 我们知道:MyBatis通过resultType对sql的输出参数进行定义,参数的类型可以是:基本类型、HashMap、pojo。在此分别介绍为resultType传入三种类型的不同处理方式。 基本类型 在此,请看一个小例子:统计学生的女同学 先看mapper.xml <select id="countStudent" parameterType="String" resultType='int'> SELECT count(*) from student where gender=#{value} </select> 此处,resultType的类型是int 再来看mapper.java public int countStudent(String string); 最后来看一下测试代码: @Test public void countStudent() throws IOException { SqlSession sqlSession = sqlSessionFactory.openSession(); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); int count = studentMapper.countStudent("female"); System.out.println("count="+count); sqlSession.commit(); sqlSession.close(); } HashMap 把resultType的类型指定为hashmap时在执行完sql之后MyBatis将输出的字段名称作为map的key,value为字段值。现在,我们在上个例子的基础上稍加改造。 先看mapper.xml <select id="countStudentByHashMap" parameterType="String" resultType='hashmap'> SELECT count(*) as total from student where gender=#{value} </select> 此处,resultType的类型是hashmap。我们将查询的结果放在total列中 再来看mapper.java public HashMap<String, Object> countStudentByHashMap(String string); 嗯哼,返回的类型是一个HashMap 最后来看一下测试代码: @Test public void countStudentByHashMap() throws IOException { SqlSession sqlSession = sqlSessionFactory.openSession(); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); HashMap<String, Object> hashMap = studentMapper.countStudentByHashMap("female"); System.out.println("total="+hashMap.get("total")); sqlSession.commit(); sqlSession.close(); } 我们从查询的结果hashmap中取出key为total对应的值 pojo 我们可将resultType指定为pojo,从而查询出对应的结果。比如,我们可以将resultType的类型指定为Student,从而查询出单个Student或者一个List,在此以查询单个Student为例 先来看mapper.xml <select id="selectStudentByID" parameterType="int" resultType="cn.com.Student"> SELECT * from student where id=#{value} </select> 在此指定resultType的类型是Student 再来看mapper.java public Student selectStudentByID(int id); 最后请看测试 @Test public void selectStudentByID() throws IOException { SqlSession sqlSession = sqlSessionFactory.openSession(); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); Student student = studentMapper.selectStudentByID(13); System.out.println(student); sqlSession.commit(); sqlSession.close(); } 在此请注意: 使用resultType进行输出映射时务必将查询的列名与pojo中的属性名保持一致! 看到这里,或许有人会问了:如果如果查询出来的列名和pojo的属性名不一致又怎么办呢?嗯哼,此时最好就不要再用resultType了,可以考虑使用resultMap,请继续往下看 resultMap 为了便于说明,我们来创建一个新的类_Student /** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */ package cn.com; import java.util.Date; public class _Student { private int _id; private String _name; private String _gender; private Date _birthday; public int get_id() { return _id; } public void set_id(int _id) { this._id = _id; } public String get_name() { return _name; } public void set_name(String _name) { this._name = _name; } public String get_gender() { return _gender; } public void set_gender(String _gender) { this._gender = _gender; } public Date get_birthday() { return _birthday; } public void set_birthday(Date _birthday) { this._birthday = _birthday; } @Override public String toString() { return "_Student [_id=" + _id + ", _name=" + _name + ", _gender=" + _gender + ", _birthday=" + _birthday + "]"; } } 首先在mapper.xml中定义一个resultMap <resultMap type="cn.com._Student" id="studentResultMap"> <id column="id" property="_id" /> <result column="name" property="_name" /> <result column="gender" property="_gender" /> <result column="birthday" property="_birthday" /> </resultMap> <resultMap>标签中的type属性表示pojo,请参见代码第1行 <resultMap>标签中的id属性表示resultMap的名字,请参见代码第1行 <id>标签表示数据库表中的主键与pojo的属性的映射关系;比如,此处,将表中的id字段映射为pojo中的_id,请参见代码第2行 <restult>标签表示数据库表中除了主键以外的其他字段与pojo的属性的映射关系,请参见代码第3-5行 然后请看mapper.xml中的SQL语句 <select id="_selectStudentByID" parameterType="int" resultMap="studentResultMap"> SELECT * from student where id=#{value} </select> 此处利用resultMap指定了返回的类型为我们刚才定义的studentResultMap 再来看mapper.java public Student _selectStudentByID(int id); 最后来瞅瞅测试代码 @Test public void _selectStudentByID() throws IOException { SqlSession sqlSession = sqlSessionFactory.openSession(); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); _Student _student = studentMapper._selectStudentByID(13); System.out.println(_student); sqlSession.commit(); sqlSession.close(); } 输出结果: _Student [_id=13, _name=大泽玛利亚, _gender=female, _birthday=Thu Mar 16 00:00:00 CST 2017]

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册