小编Zhu*_*Tao的帖子

网页的加载和执行顺序?

我已经完成了一些基于Web的项目,但我对普通网页的加载和执行顺序没有太多考虑.但现在我需要了解细节.很难从Google或SO中找到答案,所以我创建了这个问题.

示例页面如下所示:

<html>
 <head>
  <script src="jquery.js" type="text/javascript"></script>
  <script src="abc.js" type="text/javascript">
  </script>
  <link rel="stylesheets" type="text/css" href="abc.css"></link>
  <style>h2{font-wight:bold;}</style>
  <script>
  $(document).ready(function(){
     $("#img").attr("src", "kkk.png");
  });
 </script>
 </head>
 <body>
    <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
    <script src="kkk.js" type="text/javascript"></script>
 </body>
</html>
Run Code Online (Sandbox Code Playgroud)

所以这是我的问题:

  1. 这个页面如何加载?
  2. 加载的顺序是什么?
  3. 什么时候执行JS代码?(内联和外部)
  4. 什么时候执行CSS(应用)?
  5. $(文件).ready什么时候执行?
  6. 请下载abc.jpg吗?或者只是下载kkk.png?

我有以下理解:

  1. 浏览器首先加载html(DOM).
  2. 浏览器开始逐行从上到下加载外部资源.
  3. 如果<script>满足a,则将阻止加载并等待加载并执行JS文件,然后继续.
  4. 其他资源(CSS /图像)并行加载并在需要时执行(如CSS).

或者是这样的:

浏览器解析html(DOM)并获取数组或类似堆栈结构的外部资源.加载html后,浏览器开始并行加载结构中的外部资源并执行,直到加载所有资源.然后,根据JS,DOM将根据用户的行为进行更改.

任何人都可以详细解释当你得到html页面的响应时会发生什么?这在不同的浏览器中有所不同?关于这个问题的任何参考?

谢谢.

编辑:

我用Firebug在Firefox上做了一个实验.它显示如下图: 替代文字

html javascript css

239
推荐指数
4
解决办法
14万
查看次数

Javascript臭名昭着的循环问题?

我有以下代码片段.

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function () {
            alert(i);
        };
        document.body.appendChild(link);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码用于生成5个链接,并使用alert事件绑定每个链接以显示当前链接ID.但它不起作用.当您单击生成的链接时,他们都会说"链接5".

但是以下代码片段可以满足我们的期望.

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function (num) {
            return function () {
                alert(num);
            };
        }(i);
        document.body.appendChild(link);
    }
}
Run Code Online (Sandbox Code Playgroud)

以上两个片段均引自此处.正如作者的解释,似乎关闭使魔术.

但它是如何工作的以及闭包如何使其工作都超出了我的理解范围.为什么第一个不工作而第二个工作?任何人都可以详细解释这个魔法吗?

谢谢.

javascript closures

216
推荐指数
5
解决办法
7万
查看次数

客户端逻辑还是服务器端逻辑?

我已经完成了一些基于网络的项目,我遇到的大多数困难(问题,混淆)都可以在帮助下找到.但是我仍然有一个重要的问题,即使在询问了一些有经验的开发人员之后:当使用服务器端代码和客户端脚本(JavaScript)实现功能时,应该首选哪一个?

一个简单的例子:

要渲染一个动态HTML页面,我能格式化服务器端代码(PHP,Python)的页面,并(在客户端更多的逻辑在服务器端,以下)使用Ajax来获取格式化的页面直接呈现它.

我还可以使用Ajax来获取数据(未格式化,JSON),并使用客户端脚本来格式化页面,并与更多的处理使得它(服务器从一个数据库或其他来源的数据,并将其返回给客户端使用JSON或XML.客户端更多逻辑,服务器更少逻辑.

那么我怎样才能决定哪一个更好?哪一个提供更好的性能?为什么?哪一个更方便用户?

随着浏览器的JS引擎的发展,JS可以在更短的时间内解释,所以我更喜欢客户端脚本吗?

另一方面,随着硬件的发展,服务器性能不断提高,服务器端逻辑的成本也会降低,所以我更喜欢服务器端脚本?

编辑:

有了答案,我想简要总结一下.

客户端逻辑的优点:

  1. 更好的用户体验(更快).
  2. 减少网络带宽(降低成本).
  3. 提高可扩展性(减少服务器负载).

服务器端逻辑的优点:

  1. 安全问题.
  2. 更好的可用性和可访问性(移动设备和旧浏览器).
  3. 更好的SEO.
  4. 易于扩展(可以添加更多服务器,但无法使浏览器更快).

在面对特定情况时,我们似乎需要平衡这两种方法.但是怎么样?什么是最佳做法?

除以下条件外,我将使用客户端逻辑:

  1. 安全关键.
  2. 特殊群组(禁用JavaScript,移动设备等).

performance

57
推荐指数
3
解决办法
2万
查看次数

关于Web开发的一些基本但重要的问题?

到目前为止,我已经使用PHP,Python和Java开发了一些基于Web的应用程序.但是一些基本但非常重要的问题仍然是我所不知道的,所以我发这篇文章是为了得到你们的帮助和澄清.

假设我使用一些编程语言作为我的后端语言(PHP/Python/.Net/Java等),并使用Web服务器(apache/lighttpd/nginx/IIS等)部署我的应用程序.并且假设在时间T,我的一个页面得到来自不同用户的100个同时请求.所以我的问题是:

  1. 我的Web服务器如何处理这100个同时发出的请求?Web服务器是否会为每个请求生成一个进程/线程?(如果是,进程或线程?)
  2. 后端语言的解释器如何做?它将如何处理请求并生成正确的html?解释器是否会为每个请求生成一个进程/线程?(如果是,进程或线程?)
  3. 如果解释器将为每个请求生成一个进程/线程,那么这些进程(线程)如何?他们会分享一些代码空间吗?他们会互相沟通吗?如何处理后端代码中的全局变量?或者它们是独立的进程(线程)?进程/线程的持续时间有多长?它们会在处理请求并返回响应时被销毁吗?
  4. 假设Web服务器只能支持100个并发请求,但现在它同时有1000个请求.它如何处理这种情况?它会像队列一样处理它们并在服务器可用时处理请求吗?还是其他方法?
  5. 这几天我读了一些关于Comet的文章.而且我发现长连接可能是处理实时多用户用例的好方法.那么长连接怎么样?它是某些特定Web服务器的功能还是可用于每个Web服务器?长连接需要一个长期存在的解释程序吗?

编辑:最近我读了一些关于CGI和fastcgi的文章,这让我知道fastcgi的方法应该是hanlde请求的典型方法.

该协议在多个独立的FastCGI请求之间复用单个传输连接.这支持能够使用事件驱动或多线程编程技术处理并发请求的应用程序.

引自fastcgi规范,其中提到了可以处理多个请求的连接,并且可以在多线程技术中实现.我想知道这个连接可以被视为进程,它可以为每个请求生成多个线程.如果这是真的,我对如何处理每个线程中的共享资源变得更加困惑?

PS感谢托马斯关于将帖子分成几个帖子的建议,但我认为问题是相关的,最好将它们组合在一起.

感谢S.Lott给出了很好的答案,但每个问题的一些答案都过于简短或根本没有涉及.

感谢大家的回答,这让我更接近事实.

webserver cpu-usage

55
推荐指数
3
解决办法
8318
查看次数

关于Django中的IP 0.0.0.0

我们有一台服务器,我们正在运行一个Django支持的站点.由于我们想测试网站,我们正在使用Django的内置开发服务器(即runserver).但是我对以下命令的ip感到好奇:

python manage.py runserver 0.0.0.0:80
Run Code Online (Sandbox Code Playgroud)

它导致我们可以使用服务器的远程IP访问的运行站点.
但是当使用时127.0.0.1:

python manage.py runserver 127.0.0.1:80
Run Code Online (Sandbox Code Playgroud)

没有人可以从另一台PC上使用服务器的ip访问该站点.

所以为什么?0.0.0.0究竟意味着什么(Google称这是默认路线)?为什么无法127.0.0.1:80远程访问?

django ip

44
推荐指数
2
解决办法
3万
查看次数

从输入网址到浏览器的地址栏以获取浏览器中呈现的页面的完整过程是什么?

我很长时间都在考虑这个问题.这是一个很大的问题,因为它几乎涵盖了与网络开发相关的所有角落.

根据我的理解,这个过程应该是这样的:

  1. 输入地址栏的URL
  2. 请求将根据您的网络配置发送到DNS服务器
  3. DNS会将您路由到域名的真实IP
  4. 一个请求(带有完整的Http头)将被发送到服务器(用3的IP来识别)的80端口(假设我们没有指定另一个端口)
  5. 服务器将搜索侦听端口并将请求转发到正在侦听80端口的应用程序(比如说这里是nginx)或转发到另一台服务器(然后3的服务器就像负载均衡器)
  6. nginx将尝试将url与其配置匹配并直接充当静态页面,或者调用相应的脚本intepreter(例如PHP/Python)或其他应用程序来获取动态内容(使用DB查询或其他逻辑)
  7. 将使用完整的Http响应头将html发送回浏览器
  8. 浏览器将使用其解析器解析html的DOM
  9. 外部资源(JS/CSS/images/flash/videos ..)将按顺序请求(或不?)
  10. 对于JS,它将由JS引擎执行
  11. 对于CSS,它将由CSS引擎呈现,HTML的显示将根据CSS进行调整(也是按顺序或不是?)
  12. 如果DOM中有iframe,则从步骤1-12开始执行单独的相同过程

以上是我的理解,但我不知道它是否正确?多少精确?我错过了什么?

如果它是正确的(或几乎正确),我希望:

  1. 在您的文字中使步骤的描述更精确,或者如果有大的变化则写下您的步骤
  2. 对您最熟悉的每个步骤做出深入的解释.
  3. 每步一个答案.其他人可以在每个答案的评论中补充.

我希望这个主题可以帮助所有Web开发人员更好地了解我们每天的工作.

我会根据答案更新这个问题.

谢谢.

html browser webserver tcp

17
推荐指数
1
解决办法
8111
查看次数

ORM的含义是什么?

我曾经开发过几个基于python框架Django的项目.它大大提高了我的产量.但是当项目发布并且访问者越来越多时,数据库成为性能的瓶颈.

我试着解决这个问题,并发现它是ORM(django)使它变得如此缓慢.为什么?因为Django必须为程序员提供统一的接口,无论你使用什么db后端.所以它肯定会牺牲一些db的性能(将一个原始sql设置为几个sql并且永远不会使用特定于db的操作).

我想知道ORM绝对有用,它可以:

  1. 为progarammers提供统一的OO接口
  2. 使db后端迁移更容易(从mysql到sql server或其他)
  3. 提高代码的健壮性(使用ORM意味着更少的代码,更少的代码意味着更少的错误)

但如果我没有迁移的要求,ORM的含义对我来说是什么意思?

PS.最近我的朋友告诉我,他现在正在做的只是将ORM代码重写为原始sql以获得更好的性能.太遗憾了!

那么除了我上面提到的,ORM的真正含义是什么?(如果我犯了错误,请纠正我.谢谢.)

database oop orm

7
推荐指数
1
解决办法
7047
查看次数

将静态数据存储在数组或数据库中?

我们总是有一些静态数据可以作为数组存储在文件中,也可以存储在基于Web的项目的数据库表中.那么哪一个应该是首选?

在我看来,数组有一些优点:

  1. 更灵活(它可以是任何结构,指定一个非常复杂的关系)
  2. 更好的性能(它将被加载到内存中,与数据库的I/O操作相比,它具有更好的读/写性能)

但我的同事认为他更喜欢DB方法,因为它可以保持统一的数据持久性接口,并且更加灵活.

那应该是首选的?或者我们如何选择?或者我们应该在某些场景中选择一个而在其他场景中更喜欢?什么是场景?

编辑:

让我澄清一下.正如本杰明对标题所做的更改一样,我们想要存储在数组(文件)中的数据不会经常更改,这意味着代码不会更改运行时数组的值.如果数据变化非常频繁我无疑会使用DB.这就是我发这样一个帖子的原因.

有时很难存储一些非常复杂的关系,例如:

Task = {
  "1" : {
    "name" : "xx",
    "requirement" : {
          "level" : 5,
          "money" : 100,
     }
   ...
 }
Run Code Online (Sandbox Code Playgroud)

就像上面的代码示例(一个python dict或者你可以把它想象成一个数组)一样,需求字段很难存储在DB中(直接在DB中存储像pickle对象这样的结构?我觉得不太好).所以在这种情况下,我会更喜欢数组.

那么你的想法是什么?在这种情况下,我们应该更喜欢数组到DB,对吗?

问候.

database

7
推荐指数
2
解决办法
2898
查看次数

如何评估Web服务器的性能?

我正计划部署一个django供电网站.但我对Web服务器的选择感到困惑,其中包括apache,lighttpd,nginx等.

我已经阅读了一些关于每种选择的性能的文章.但似乎没有人同意.所以我想知道为什么不自己测试性能?

我找不到有关性能测试Web服务器的最佳方法的信息.所以我的问题是:

  1. 没有生产现场,有没有简单的方法来测试性能?
  2. 或者我可以使用一种方法来模拟繁忙的交通以进行公平的测试吗?
  3. 如何保持我的测试公平并接近生产情况?

测试结束后,我想弄明白:

  1. 为什么有人说nginx在提供静态文件时性能更好.
  2. 每个Web服务器的CPU和内存需求.
  3. 我最好的选择.

django performance webserver nginx

5
推荐指数
1
解决办法
2007
查看次数

文件应由熟练的程序员编写?

我一直认为文档对于项目和团队来说非常重要,应该定期和详细地编写.它可以使事情并行,而不必总是向熟练的程序员询问.但我确实发现许多开发人员(甚至是领导者)都没有过多地关注文档,只是把它们视为理所当然,这让我心疼.

那么我对文件的态度是对的吗?文件真的很重要吗?我应该如何说服团队领导更多地关注文件?

如果文件很重要,第二个问题就出现了.谁应该写文件?IMO,它们应该由熟练的程序员编写,比如框架创建者(如果我们使用自己的框架),项目的重要部分(如数据库模式,整个体系结构等)等等.

好处是显而易见的,比如帮助新人,帮助维持等等.

因此,从我的观点来看,熟练的程序员(这里的定义可能不同)应该更多地关注文档编写而不是基础结构完成后的代码编写.

我对这一点是对的吗?

感谢您分享这些问题.

document

5
推荐指数
0
解决办法
850
查看次数

加载不同的模块而不更改逻辑文件

假设我有两个不同的模块,它们具有统一(相同)的接口.文件列表如下:

root/
   logic.py
   sns_api/
      __init__.py
      facebook/
          pyfacebook.py
          __init__.py
      myspace/
          pymyspace.py
          __init__.py
Run Code Online (Sandbox Code Playgroud)

并且pyfacebook.py和pymyspace.py具有相同的接口,这意味着:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

# in pymyspace.py
class Myspace:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic
Run Code Online (Sandbox Code Playgroud)

现在我有一个问题.我想在logic.py中执行逻辑而不复制代码,所以我想知道如何设置一个标志来显示我使用的模块,python将自动加载正确的代码,这意味着:

# in logic.py

PLATFORM = "facebook"

# import the right modules in, complete the logic with the current platform
# create the right …
Run Code Online (Sandbox Code Playgroud)

python interface dynamic-import

2
推荐指数
1
解决办法
97
查看次数

为什么我们应该将序列化数据而不是原始代码存储到DB?

如果我们有一些应该存储在DB中的代码(数据结构),有人总是建议我们存储序列化数据而不是原始代码字符串.

所以我不太清楚为什么我们应该更喜欢序列化数据.

给一个简单的实例(在python中):

我们有一个字段可以存储python的字典,就像

{ "name" : "BMW", "category":"car", "cost" : "200000"}
Run Code Online (Sandbox Code Playgroud)

所以我们可以使用pickle(python模块)对其进行序列化,然后将pickle数据存储到db字段.

或者我们可以直接将dict字符串存储到DB而无需序列化.

由于我们需要将字符串转换为python数据,因此通过分别使用pickle.loads和exec,两种方法都很容易实现.

那应该是首选的?为什么?是因为exec比pickle慢得多吗?还是其他一些原因?

谢谢.

python database serialization

2
推荐指数
1
解决办法
3614
查看次数