PageSourceSearch

https://rockhong.github.io/a-simple-node-js-web-app.html

html rockhong.github.io collected 2026-10-03 09:51:37 UTC 13,558 bytes, 263 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wb="http://open.weibo.com/wb" lang="zh-CN" xml:lang="zh-CN">
3<head>
4  
5  <title>Hong's Blog, 使用Node.js搭建一个简单的静态文件server。</title>
6  
7  <meta name="viewport" content="width=device-width, initial-scale=1"/>
8  <meta name="description" content="Hong的个人(技术)博客/Hong's personal (tech) blog" />
9  <meta name="keywords" content="personal blog, tech-blog" />
10  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
11  <meta property="wb:webmaster" content="6861c9cd3b457cad" />
12  
13  <link rel="icon" type="image/x-icon" href="/favicon.ico" />
14  
15  <link rel="stylesheet" href="../css/bootstrap.min.css" />
16  <link rel="stylesheet" href="../css/default.css" type="text/css" media="screen" />
17  <link rel="stylesheet" href="../css/index.css" type="text/css" media="screen" />
18  <link rel="stylesheet" href="../css/post.css" type="text/css" media="screen" />
19  <link rel="stylesheet" href="../css/tags.css" type="text/css" media="screen" />
20  <link rel="stylesheet" href="../css/prism.css" />
21  <link rel="stylesheet" href="../css/syntax.css" />
22
23  
23<script src="/script/jquery-1.11.3.min.js" type="text/javascript"></script>
23
24  
24<script src="/script/bootstrap.min.js" type="text/javascript"></script>
24
25  
25<script src="http://tjs.sjs.sinajs.cn/open/api/js/wb.js" type="text/javascript" charset="utf-8"></script>
25
26  
27  <!-- Google Analytics BEG-->
28  
28<script type="text/javascript">
29  var _gaq = _gaq || [];
30  _gaq.push(['_setAccount', 'UA-39298232-1']);
31  _gaq.push(['_trackPageview']);
32
33  (function() {
34    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
35    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
36    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
37  })();
38  </script>
38
39  <!-- Google Analytics END-->
40</head>
41
42<body>
43  <div class="banner banner-top"> </div>
44
45  <div class="body-wrap">
46    <div id="header">
47      <nav class="navbar navbar-default">
48        <div class="container-fluid">
49          <div class="site-titles">
50            <p id="site-title">Hong's Blog</p>
51            <p id="site-subtitle">Be Agile. Be Smart. Be Visionary. Be Dedicated.</p>
52          </div>
53          <!-- Brand and toggle get grouped for better mobile display -->
54          <div class="navbar-header">
55            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
56              <span class="sr-only">Toggle navigation</span>
57              <span class="icon-bar"></span>
58              <span class="icon-bar"></span>
59              <span class="icon-bar"></span>
60            </button>
61            <!-- <a class="navbar-brand" href="#">Brand</a> -->
62          </div> 
63
64          <!-- Collect the nav links, forms, and other content for toggling -->
65          <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
66            <ul class="nav navbar-nav">
67              <!-- <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> -->
68              <li><a href="/index.html">Blog</a></li>
69              <li><a href="/reading-list.html">Reading List</a></li>
70              <li><a href="/tags/post-tags.html">Archive</a></li>
71              <li><a href="/about.html">About</a></li>
72            </ul>
73          </div><!-- /.navbar-collapse -->
74        </div><!-- /.container-fluid -->
75      </nav>
76    </div> <!-- header -->
77
78    <div class="main-body">
79        <div id="css-namespace-post">
80
81  <div class="post-right-col">
82    <div class="google-adsense">
83      
83<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
83
84      <!-- blog-right-col-ad -->
85      <ins class="adsbygoogle"
86           style="display:block"
87           data-ad-client="ca-pub-8182266446134074"
88           data-ad-slot="2366507542"
89           data-ad-format="auto"></ins>
90      
90<script>
91      (adsbygoogle = window.adsbygoogle || []).push({});
92      </script>
92
93    </div>
94  </div>
95
96
97
98  <div class="post-comment">
99  <div id="post">
100    <div id="title">
101        <h1> 使用Node.js搭建一个简单的静态文件server。 </h1>
102        
103    </div>
104    <div id="content">
105      <p>介绍一下如何利用Node.js搭建一个简单的静态文件server。
106这里用到了<a href="http://expressjs.com/" title="Express">Express</a>,Express是Node.js世界的web framework。</p>
107
108<h3 id="新建工程">新建工程</h3>
109
110<p>创建工程目录,</p>
111
112<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>mkdir my-app
113<span class="nv">$ </span><span class="nb">cd </span>my-app</code></pre></figure>
114
115<p>为自己的工程建一个<code class="highlighter-rouge">package.json</code>文件,</p>
116
117<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>npm init
118This utility will walk you through creating a package.json file.
119It only covers the most common items, and tries to guess sensible defaults.
120
121See <span class="sb">`</span>npm <span class="nb">help </span>json<span class="sb">`</span> <span class="k">for </span>definitive documentation on these fields
122and exactly what they <span class="k">do</span><span class="nb">.</span>
123
124Use <span class="sb">`</span>npm install &lt;pkg&gt; <span class="nt">--save</span><span class="sb">`</span> afterwards to install a package and
125save it as a dependency <span class="k">in </span>the package.json file.
126
127Press ^C at any <span class="nb">time </span>to quit.
128name: <span class="o">(</span>my-app<span class="o">)</span>
129version: <span class="o">(</span>1.0.0<span class="o">)</span>
130description:
131entry point: <span class="o">(</span>index.js<span class="o">)</span>
132<span class="nb">test command</span>:
133git repository:
134keywords:
135author:
136license: <span class="o">(</span>ISC<span class="o">)</span>
137About to write to E:<span class="se">\t</span>mp<span class="se">\m</span>y-app<span class="se">\p</span>ackage.json:
138
139<span class="o">{</span>
140  <span class="s2">"name"</span>: <span class="s2">"my-app"</span>,
141  <span class="s2">"version"</span>: <span class="s2">"1.0.0"</span>,
142  <span class="s2">"description"</span>: <span class="s2">""</span>,
143  <span class="s2">"main"</span>: <span class="s2">"index.js"</span>,
144  <span class="s2">"scripts"</span>: <span class="o">{</span>
145    <span class="s2">"test"</span>: <span class="s2">"echo </span><span class="se">\"</span><span class="s2">Error: no test specified</span><span class="se">\"</span><span class="s2"> &amp;&amp; exit 1"</span>
146  <span class="o">}</span>,
147  <span class="s2">"author"</span>: <span class="s2">""</span>,
148  <span class="s2">"license"</span>: <span class="s2">"ISC"</span>
149<span class="o">}</span>
150
151
152Is this ok? <span class="o">(</span>yes<span class="o">)</span></code></pre></figure>
153
154<p><code class="highlighter-rouge">npm init</code>会问你一些问题,直接回车表示接受默认值。<code class="highlighter-rouge">package.json</code>的更多信息见<a href="https://docs.npmjs.com/files/package.json" title="Specifics of npm's package.json handling">此文档</a>。</p>
155
156<h3 id="安装依赖">安装依赖</h3>
157
158<p>安装Express,<code class="highlighter-rouge">--save</code>选项会在<code class="highlighter-rouge">package.json</code>文件里加上对<code class="highlighter-rouge">express</code>的依赖。</p>
159
160<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>npm install express <span class="nt">--save</span></code></pre></figure>
161
162<h3 id="编写代码">编写代码</h3>
163
164<p>如果在执行<code class="highlighter-rouge">npm init</code>时没有指定新的名字,那么程序的“main”文件就是<code class="highlighter-rouge">index.js</code>。编辑<code class="highlighter-rouge">index.js</code>文件如下,</p>
165
166<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'express'</span><span class="p">);</span>
167<span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
168
169<span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
170  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'i am alive on port 3000'</span><span class="p">);</span>
171<span class="p">});
171</span>
172
173<span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">'/public'</span><span class="p">));</span></code></pre></figure>
174
175<p>把静态文件放到<code class="highlighter-rouge">public</code>目录下面。
176假设<code class="highlighter-rouge">public</code>目录下面有个<code class="highlighter-rouge">index.html</code>文件,那么就可以通过<code class="highlighter-rouge">http://localhost:3000/index.html</code>来访问文件了。</p>
177
178<p>如果想给静态文件指定URL前缀,可以这样(详见<a href="http://expressjs.com/en/starter/static-files.html" title="Serving static files in Express">文档</a>),</p>
179
180<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="s1">'/static'</span><span class="p">,</span> <span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">'/public'</span><span class="p">));</span></code></pre></figure>
181
182<p>现在可以通过<code class="highlighter-rouge">http://localhost:3000/static/index.html</code>来访问文件。</p>
183
184
185    </div>
186    <div id="pub-date">
187      <span>2016-06-06</span>
188      <span>12:36</span>
189    </div>
190    <div class="wb-sharing">
191      <wb:share-button appkey="2926740460" addition="simple" type="button" pic="http%3A%2F%2Frockhong.github.io%2Ffavicon.ico">
192    </div>
193    <a class="db-sharing" href="javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:'',r='http://www.douban.com/recommend/?url='+e(d.location.href)+'&title='+e(d.title)+'&sel='+e(s)+'&v=1',w=450,h=330,x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width='+w+',height='+h+',left='+(screen.width-w)/2+',top='+(screen.height-h)/2))location.href=r+'&r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()">
194      <img id="db-sharing" src="http://img2.douban.com/pics/fw2douban1.png" alt="推荐到豆瓣" />
195    </a>
196    <div class="pay-weixin">
197      <p>如果你觉得这篇文章对你有用,可以微信扫一扫表示🙏 / If you find this post is useful to you, buy me 🍶 via Wechat</p>
198      <img src="/images/weixin.png"/>
199    </div>
200  </div>
201          
202
203    <div class="google-adsense-bottom">
204      
204<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
204
205      <ins class="adsbygoogle"
206           style="display:block"
207           data-ad-client="ca-pub-8182266446134074"
208           data-ad-slot="4098132749"
209           data-ad-format="auto"></ins>
210      
210<script>
211      (adsbygoogle = window.adsbygoogle || []).push({});
212      </script>
212    
213    </div>
214
215
216
217  
218  
219<div id="disqus_thread"></div>
220<script>
221
222/**
223 *  RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
224 *  LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables */
225
226var disqus_config = function () {
227    this.page.url = 'http://rockhong.github.io/a-simple-node-js-web-app.html';  // Replace PAGE_URL with your page's canonical URL variable
228    this.page.identifier = '20160606-a-simple-node-js-web-app'; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
229};
230
231(function() { // DON'T EDIT BELOW THIS LINE
232    var d = document, s = d.createElement('script');
233    s.src = '//hongsblog.disqus.com/embed.js';
234    s.setAttribute('data-timestamp', +new Date());
235    (d.head || d.body).appendChild(s);
236})();
237</script>
237
238<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
239                                    
240
241  
242</div>
243
244    </div>
245
246    <div class="clearfix"> </div>
247
248    <div id="footer">
249          <p> Powered by Jekyll</p>
250    </div> <!-- footer -->
251  </div> <!-- body wrap -->
252
253  <div class="banner banner-bottom"> </div>
254
255  <!-- For Comment Count BEG-->
256  
256<script id="dsq-count-scr" src="//hongsblog.disqus.com/count.js" async></script>
256
257  <!-- For Comment Count END-->  
258     
259  
259<script src="../script/prism.js"></script>
259
260  
260<script src="../script/index.js" type="text/javascript"></script>
260
261</body>
262
263</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.