驹驹 發表於 2019-12-9 20:44:00

Node.js 初心

<h1 id="官方文档">官方文档</h1>
<p>https://nodejs.org/dist/latest-v12.x/docs/api/</p>
<h1 id="非官方中文网">非官方中文网</h1>
<p>http://nodejs.cn/<br>
http://nodejs.cn/api/</p>
<h1 id="安装nodejs">安装Node.js</h1>
<p>使用snapd安装,非常方便。参考上一篇安装Vue-CLI教程。<br>
通过snapd安装Node.js最好执行一步额外的操作,这是snap特殊的启动脚本造成的:</p>
<pre><code>npm config set scripts-prepend-node-path true
</code></pre>
<p>正如上一篇教程所做的那样,如果不配置<code>scripts-prepend-node-path</code>为true,很多时候都要添加一个<code>--scripts-prepend-node-path</code>参数,非常麻烦。</p>
<h1 id="初始化项目">初始化项目</h1>
<pre><code>mkdir example-project
cd example-project
npm init -y
</code></pre>
<p>产生一个package.json,大致如下,其中scripts是<code>npm run $script</code>的自定义集合:</p>
<pre><code>{
"name": "hello",
"version": "1.0.0",
"description": "我的第一个Node.js程序",
"main": "app.js",
"scripts": {
    "test": "node app.js"
},
"author": "",
"license": "ISC"
}
</code></pre>
<p>现在编辑文件app.js,开始写入我们的第一个Node.js项目代码</p>
<pre><code class="language-JavaScript">const http = require("http")
const config = {
      host: "0.0.0.0",
      port: 80,
}

const server = http.createServer((req, res) =&gt; {
      let values = []
      for (key in req) {
                vars.push(key)
      }   
      console.log(values)
      res.write("&lt;h1&gt;Hello, Node.js&lt;/h1&gt;")
      res.end()
})

server.listen(config.port, config.host, error =&gt; {
      console.log(`HTTP Server starting on ${config.host}:${config.port}`)
})
</code></pre>
<p>执行<code>npm run test</code>,访问服务器!</p>
<pre><code>$ curl localhost -v
* Rebuilt URL to: localhost/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
&gt; GET / HTTP/1.1
&gt; Host: localhost
&gt; User-Agent: curl/7.58.0
&gt; Accept: */*
&gt;
&lt; HTTP/1.1 200 OK
&lt; Date: Mon, 09 Dec 2019 13:40:00 GMT
&lt; Connection: keep-alive
&lt; Transfer-Encoding: chunked
&lt;
* Connection #0 to host localhost left intact
</code></pre>
<p>在npm后台可以看到</p>
<pre><code>HTTP Server starting on 0.0.0.0:80
[
'_readableState',      'readable',         '_events',
'_eventsCount',      '_maxListeners',    'socket',
'httpVersionMajor',    'httpVersionMinor', 'httpVersion',
'complete',            'headers',          'rawHeaders',
'trailers',            'rawTrailers',      'aborted',
'upgrade',             'url',            'method',
'statusCode',          'statusMessage',    'client',
'_consuming',          '_dumped',          'setTimeout',
'_read',               'destroy',          '_addHeaderLines',
'_addHeaderLine',      '_dump',            '_undestroy',
'_destroy',            'push',             'unshift',
'isPaused',            'setEncoding',      'read',
'pipe',                'unpipe',         'on',
'addListener',         'removeListener',   'off',
'removeAllListeners','resume',         'pause',
'wrap',                'setMaxListeners','getMaxListeners',
'emit',                'prependListener','once',
'prependOnceListener', 'listeners',      'rawListeners',
'listenerCount',       'eventNames'
]
</code></pre>
<p>这些都是request(原型req.__proto__为IncomingMessage)的字段,是不是比在官网查方便多了?<br>
当然,我更想进一步了解这些字段是什么东西</p>
<pre><code class="language-JavaScript">      for (key in req) {
                let value = req
                if (typeof value === "function") {
                        console.log(`${key} =&gt; FUNCTION`)
                        break
                }
                try {
                        console.log(`${key} =&gt; ${value}`)
                } catch(e) {
                        console.log(`can't read the ${key} value`)
                }
      }
</code></pre>
<p>输出:</p>
<pre><code>_readableState =&gt;
readable =&gt; true
can't read the _events value
_eventsCount =&gt; 1
_maxListeners =&gt; undefined
socket =&gt;
httpVersionMajor =&gt; 1
httpVersionMinor =&gt; 1
httpVersion =&gt; 1.1
complete =&gt; false
headers =&gt;
rawHeaders =&gt; Host,a,User-Agent,Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0,Accept,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,Accept-Language,zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2,Accept-Encoding,gzip, deflate,Connection,keep-alive,Upgrade-Insecure-Requests,1,Cache-Control,max-age=0
trailers =&gt;
rawTrailers =&gt;
aborted =&gt; false
upgrade =&gt; false
url =&gt; /
method =&gt; GET
statusCode =&gt; null
statusMessage =&gt; null
client =&gt;
_consuming =&gt; false
_dumped =&gt; false
setTimeout =&gt; FUNCTION
</code></pre>
<h1 id="安装模块">安装模块</h1>
<pre><code>npm i --save express
</code></pre>
<p>现在,依赖模块已经被安装到node_modules文件夹下,package.json中的dependencies字段也被更新了</p>
<h1 id="nodejs作为脚本执行">node.js作为脚本执行</h1>
<p>新建index.js</p>
<pre><code>#!/usr/bin/env node

console.log("Hello, Node.js")

</code></pre>
<p>现在执行<code>./index.js</code>,系统就能自动调用node环境来解释运行index.js了</p>
<p>Node.js就是这么的强大又简单,Be enjoy IT !</p>
<h1 id="模块内置对象和函数">模块、内置对象和函数</h1>
<p>每个.js文件都可以看作一个小模块,它们都是一个render函数的实现,这个函数原型是</p>
<pre><code>function (exports, require, module, __filename, __dirname) {; /* module body */; });
</code></pre>
<p>其中exports是module.exports的引用。要导出函数和对象,直接重写module.exports对象即可。<br>
不过除了这些参数,我们还可以使用全局对象global,比如对象<code>global.process.env</code>可以访问环境变量。</p>
<ul>
<li>require()函数<br>
require()函数可以加载模块和json文件<br>
什么叫加载模块?事实上,require()函数返回的就是render()函数的回调参数module的exports字段。<br>
要从当前目录加载模块和json文件,路径必须以./开头,文件后缀.js或.json可以省略。</li>
</ul>
<pre><code>const log = require("./log")
const config = require("./config.json")
</code></pre>
<p>END</p><br><br>
来源:https://www.cnblogs.com/develon/p/12013334.html
頁: [1]
查看完整版本: Node.js 初心