我已在《HTML5对电子商务商家的意义》、《CSS对电子商务商家的意义》和《JavaScript对电子商务商家的意义》中解释了网站在浏览器中的显示方式——即前端技术。
在这篇文章中,我将讨论服务器和后端应用程序。
Web 应用的简史
虽然我的 HTML5 示例是有效的,但它们是手工创建的,这有几个缺点。对于电子商务网站来说,主要的问题是,如果要维护一个完整网站的 HTML(超过几十页),将会非常困难,甚至不可能。
事实上,自互联网早期以来,人们就使用程序来帮助生成网站代码。早期版本使用了一种称为 CGI——通用网关接口(Common Gateway Interfaces)的技术,其中程序会动态创建一个 HTML 文件并发送给浏览器。虽然速度通常较慢,但 CGI 使网站能够具备动态功能。
如今,后端 Web 应用已超越单一的 CGI 程序,包括数百种编程语言、框架和代码库,它们为你处理大部分编码工作。它们已经变得如此普遍,以至于大多数台式机和笔记本电脑的系统软件都内置了其中几种。
大多数 Web 应用的工作原理
今天的 Web 应用比 CGI 先进得多,但它们的工作方式仍然类似,大致步骤如下:
- 应用程序托管在服务器上。
- 访问者在她的浏览器中导航到一个页面。
- 应用程序启动。
- 应用程序检查请求的是哪个页面。
- 应用程序生成一个 HTML 文档,并将该文档发送回访问者。
- HTML 文档显示在访问者的浏览器中。
理想情况下,所有这些操作都在不到一秒的时间内完成。
消除手动编码
使用后端 Web 应用有诸多好处。但最主要的好处是:拥有后端应用意味着你不需要手工编写每个 HTML 页面。从核心来看,Web 应用所做的就是将来自浏览器的一组输入转换为一个 HTML 页面。
这些输入是如何转换的,这是有趣的部分。数据可以有多种多样且近乎无限多的转换方式。这里举几个实际的例子。
根据服务器环境创建具有动态内容的HTML页面。在此场景中,HTML页面是根据其运行环境创建的。例如,以下Ruby程序会在页脚中生成包含当年年份的HTML页面;三年后运行该程序将自动创建与今天所见不同的HTML版本。
请注意,Web 应用程序代码(Ruby)位于上方,HTML 模板位于下方。唯一的动态部分是模板中用于版权日期的那一行。
require 'sinatra'
get '/' do
erb :index
end
__END__
@@ index
<html>
<body>
<header>
<nav>
<a href="/">Home</a> |
<a href="/new">New Products</a> |
<a href="/all">All Products</a> |
<a href="/cart">Cart</a>
</nav>
</header>
<section>
<h1>World's Best Product</h1>
</section>
<footer>
<nav>
<a href="/">Home</a> |
<a href="/about">About us</a> |
<a href="/contact">Contact us</a>
</nav>
<p>Copyright <%= Date.today.year %></p>
</footer>
</body>
</html>
HTML 模板生成版权日期,它是动态的并会自动更改。
根据数据库创建具有动态内容的HTML页面。另一种流行技术是基于单独系统中的数据生成HTML。这通常是一个数据库,可以存储数百万组数据。
例如,电子商务商店并不会为每个产品准备 1,000 个不同的 HTML 模板。它们很可能拥有一个包含所有 1,000 个产品的数据库。Web 应用程序使用标准模板为每个产品生成一个产品页面。
下面的示例展示了这一点。这是一个连接到数据库并为每个产品生成唯一页面的 Web 应用程序。本例中有两个产品——“玩具车”和“拼图”,但即使有 100,000 个产品,其工作原理也是一样的。
require 'sinatra'
require 'active_record'
# Setup the database
ActiveRecord::Base.establish_connection(YAML::load(File.read("database.yml")))
ActiveRecord::Schema.define do
create_table :products do |table|
table.column :name, :string
table.column :price, :decimal
table.column :description, :text
end unless table_exists? :products
end
class Product < ActiveRecord::Base
end
# Create a product for the example
Product.create(name: 'Toy car', price: 9.99, description: "This little red toy car would be fun for any child to play with")
Product.create(name: 'Puzzle', price: 19.99, description: "You will love this 500 piece puzzle of random colors")
get '/:product_id' do
@product = Product.find(params[:product_id])
erb :index
end
__END__
@@ index
<html>
<body>
<header>
<nav>
<a href="/">Home</a> |
<a href="/new">New Products</a> |
<a href="/all">All Products</a> |
<a href="/cart">Cart</a>
</nav>
</header>
<section>
<h1><%= @product.name %></h1>
<p>$<%= @product.price %></p>
<p><%= @product.description %></p>
</section>
<footer>
<nav>
<a href="/">Home</a> |
<a href="/about">About us</a> |
<a href="/contact">Contact us</a>
</nav>
<p>Copyright <%= Date.today.year %></p>
</footer>
</body>
</html>
这个假设的玩具车产品页面是一个模板。页面的内容——产品名称、价格、描述——来自数据库。
这个拼图产品页面的布局与玩具车相同。不同之处在于内容——产品名称、价格、描述——同样来自数据库。
生成的页面可能更简单
在使用 Web 应用程序生成 HTML 页面时,有许多选项可供选择。
如前所述,你不必手动编写每个页面。相反,通常会有一个管理界面来管理数据——即添加和修改产品。
此外,你可以使用全站模板。你可以在每个页面上重用公共元素(页脚、页眉),并为某类页面(例如产品页面)设置统一的布局。当你更改产品页面的布局时,所有产品页面很可能会自动随之更改。
使用数据库并动态生成页面可以将各项技术分离开来。现在你拥有:
- HTML用于页面结构;
- CSS用于页面的展示和外观;
- JavaScript用于页面的交互性;
- 数据库用于实际内容;
- Web应用程序将所有内容粘合在一起。
自定义应用程序的缺点
自定义 Web 应用程序也存在缺点。由于它是一个程序,你可能需要开发人员来进行修改。有时修改很简单,有时则不然。
另一个缺点是,一旦你选择了一种语言或框架来构建自定义网站,通常就意味着你要长期依赖它。虽然可以更改,但这个过程往往耗时且昂贵。
自定义或部分自定义应用程序的优势
如果你有一个完全自定义的 Web 应用程序来支撑你的电子商务网站,那么混合搭配技术会容易得多。你可以对某些部分使用手工编码的 HTML 页面,而对其他部分使用由应用程序动态生成的页面。例如,我经常看到着陆页和图形密集型页面是手工编码的。通过自定义 Web 应用程序,你拥有完全的控制权,唯一的限制是你的想象力、预算和时间表。
如果你使用 Shopify 或 Magento 等电子商务平台,你可以使用其 API 为平台构建自己的自定义插件或扩展。对于希望使用特定平台但仍需定制其中约 10% 功能的公司来说,这是一个日益可行的选择。最终你将拥有两个 Web 应用程序:一个用于平台本身,另一个用于定制化部分。

