物联网服务NodeJs-5天学习第一天篇② —— 安装NodeJs环境以及VsCode开发工具

Posted 单片机菜鸟哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了物联网服务NodeJs-5天学习第一天篇② —— 安装NodeJs环境以及VsCode开发工具相关的知识,希望对你有一定的参考价值。

【NodeJs-5天学习】第一天篇② —— 安装环境以及开发工具

面向读者群体

  • ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
  • ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️
  • ❤️ 本篇创建记录 2023-03-12 ❤️
  • ❤️ 本篇更新记录 2023-03-12 ❤️

技术要求

  • HTMLCSSJavaScript基础更好,当然也没事,就直接运行实例代码学习

专栏介绍

  • 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的物联网web开发,而且能够部署到公网访问。

🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝

1、Node.js环境安装

在上一讲中我们知道

Node.js 是一个基于Chrome V8引擎的javascript运行环境

那么,我们首先把这个运行环境安装起来,步骤也非常简单。

1.1 下载安装文件

点击 下载链接

建议下载长期支持版本
msi是什么文件?它的意思就是MicroSoft installer(微软安装器)。大多数我们安装软件,是exe格式的可执行文件,那exe和msi有什么区别?

  • MSI更全面,更自动化,比如,自动注册到系统注册表,可以管理软件的安装,卸载,更新等。
  • EXE更灵活,配置性更强,不过这个是需要开发者做一些额外的工作。

这里window系统我们就下载msi版本。

1.2 安装步骤

找到我们下载的文件,直接双击它。

点击next 下一步

勾选,我接受许可协议(使用人家的东西,就得接受人家的许可声明)
点击next,下一步

安装路径,我的是默认在c盘的Program Files的nodejs目录下。平时我们安装软件,应该也看到过这Program Files,它表示的是,64位软件的默认安装目录。Program Files(x86)表示32位软件的安装默认路径。如果我们想换个目录,点击Change(改变),修改安装路径。这里我们不做多余的操作,默认安装路径。点击下一步

我们可以在这个步骤里,Nodejs安装哪些东西。

  • Node.js runtime 运行环境
  • npm package manager(非常重要,npm包管理

这是Nodejs默认的包管理工具,它有什么作用呢?
我们知道,windows操作系统,需要安装一个软件的话,要去百度查找,然后进入网站,下载,安装。
手机上我们要安装某一个app,也要到app应用商城查找,然后下载安装。
那这里引申出一个软件知识,所有的软件包,都放到一个地方,然后使用专门的工具,去这里下载。
所以,ndoejs安装一些软件包(第三方库),使用的就是npm

点击Next下一步

点击Next下一步

点击Install,稍微等待一下


安装完成。cmd串口看看版本是否正确。输入node -v

打印nodejs的版本 V16.15.1 ,表示安装成功。

同时,我们也打开安装目录看看有什么文件

npm表示我们的包管理,这是一个非常应用广泛的工具。
node_modules表示我们包下载缓存的地方(后面我们会根据项目需求来下载对应的包)

1.3 常规配置,主要是NPM

安装完NodeJs环境之后,我们可以做一些常规配置工作,特别是了解npm 工具。

1.3.1 查看配置

window cmd(win+R运行cmd进入命令提示符窗口)输入

npm config ls -ls

1.3.2 配置国内下载镜像

有时候,我们会发现,npm下载安装包的时候,速度异常缓慢!
直接看配置,找到:

  • 原始配置

    这个网址在国外,下载速度会受限。那么,怎么解决呢?
    直接使用国内大公司提供的镜像。
    使用淘宝的npm镜像地址
  • https://registry.npm.taobao.org

    但是,一般我们不会直接设置,需要能够支持切换两个仓库(官方仓库、国内仓库)。

NPM仓库:

一般情况下,我们会用npmcnpm命令来区分官方仓库和国内仓库。

  • 当我们用npm命令时,表示从官方仓库下载包
  • 当我们用cnpm命令时,表示从国内仓库下载包。(国内仓库每10分钟从官方仓库同步包过来,基本上可以理解为一样)
    这两者除了名字不一样,命令参数都是一样。主要是区分仓库。

npm命令是安装NodeJs环境的时候就已经自带了,那么我们只需要配置一下cnpm即可。

执行命令

  • npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以根据自己的需要来切换npm或者cnpm命令。

1.3.3 尝试下载安装包

后期我们会经常和express包打交道,这里下载一下:

cmd(win+R运行cmd进入命令提示符窗口)输入 npm install express -g

  • 这个包用于构造web服务器相关请求,非常有用

    那我们这个包会下载到什么地方?可以查看一下配置信息
    cmd(win+R运行cmd进入命令提示符窗口)输入 npm config ls -ls
  • 找到 globalconfig

1.4 NPM 使用介绍

在开发NodeJs服务中,我们经常性会和NPM工具打交道,并且会从NPM仓库去下载很多有用的第三方包(基于内置API基础上封装出来的代码),协助我们完成项目开发。那么我们就必须先了解一些基本命令。

建议大伙都输入一下命令查看一下效果

1.4.1 查看当前npm版本 —— npm -v、npm --version、npm -version

1.4.2 查看模块安装信息

1.4.2.1 查看所有全局安装的模块 —— npm list -g

npm list -g


注意:

  • 区分一下全局安装本地项目安装的区别
    全局安装指的是所有NodeJs项目都能复用,不需要每次调用安装命令;
    本地项目安装指的是特定NodeJs项目能用,其他项目要用只能再次安装。
    简而言之就是包的使用范围。
1.4.2.2 查看某个模块的版本号 —— npm list 模块名

npm list 模块名

比如:我们使用 npm 命令查看常用的 Node.js web框架模块 express:

npm list express

1.4.3 查看npm配置 —— npm config ls -ls

npm config ls -ls


一般我们更多的是关注npm仓库的配置信息。

1.4.4 使用 npm 命令安装模块 —— npm install / i

npm 安装 Node.js 模块语法格式如下:

npm install/i <Module Name>

比如:我们使用 npm 命令安装常用的 Node.js web框架模块 express:

npm install express 或者 npm i express

通过以上命令安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') (相当于我们c语言中的include)的方式引入就好,无需指定第三方包路径。

但是上面方式仅仅是某一个项目工程有效,如果其他工程要用,那么又得继续重新安装一遍。所以,npm为了解决这种问题,区分了本地项目安装全局安装

1.4.4.1 本地项目安装 —— npm install 模块名

npm install <module name>

比如:我们使用 npm 命令安装常用的 Node.js web框架模块 express:

npm install express


这里会提示我们没有 package.json,这个文件是我们创建NodeJs项目是自动生成的,后面会讲解。

对于本地安装,需要注意:

  • 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
  • 可以通过 require() 来引入本地安装的包。
1.4.4.2 全局安装 —— npm install 模块名 -g

npm install <module name> -g

  • g表示global

比如:我们使用 npm 命令安装常用的 Node.js web框架模块 express:

npm install express -g


对于本地安装,需要注意:

  • 将安装包放在你 node 的安装目录。
  • 可以通过 require() 来引入本地安装的包。
1.4.4.3 下载当前项目所依赖的包(******** 非常重要) —— npm install

假设我们是从网上下载别人的NodeJs项目,一般你会发现基本上是没有 node_modules 目录(一考虑项目大小,二考虑版本更新),这时候我们需要根据项目本身的 package.json 来安装整个项目的依赖包。

package.json 位于模块的目录下,用于定义包的属性,并且依赖于它最终生成一个 package-lock.json文件。这里博主以一个demo为例:

package.json文件:


  "name": "hellodemo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": 
    "test": "echo \\"Error: no test specified\\" && exit 1"
  ,
  "author": "",
  "license": "ISC",
  "dependencies": 
    "express": "^4.18.1"
  

package-lock.json文件(不需要查看,了解即可):


  "name": "hellodemo",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": 
    "accepts": 
      "version": "1.3.8",
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
      "requires": 
        "mime-types": "~2.1.34",
        "negotiator": "0.6.3"
      
    ,
    "array-flatten": 
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
    ,
    "body-parser": 
      "version": "1.20.0",
      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
      "requires": 
        "bytes": "3.1.2",
        "content-type": "~1.0.4",
        "debug": "2.6.9",
        "depd": "2.0.0",
        "destroy": "1.2.0",
        "http-errors": "2.0.0",
        "iconv-lite": "0.4.24",
        "on-finished": "2.4.1",
        "qs": "6.10.3",
        "raw-body": "2.5.1",
        "type-is": "~1.6.18",
        "unpipe": "1.0.0"
      
    ,
    "bytes": 
      "version": "3.1.2",
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
    ,
    "call-bind": 
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
      "requires": 
        "function-bind": "^1.1.1",
        "get-intrinsic": "^1.0.2"
      
    ,
    "content-disposition": 
      "version": "0.5.4",
      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
      "requires": 
        "safe-buffer": "5.2.1"
      
    ,
    "content-type": 
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
    ,
    "cookie": 
      "version": "0.5.0",
      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
    ,
    "cookie-signature": 
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
    ,
    "debug": 
      "version": "2.6.9",
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
      "requires": 
        "ms": "2.0.0"
      
    ,
    "depd": 
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
    ,
    "destroy": 
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
    ,
    "ee-first": 
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
    ,
    "encodeurl": 
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
    ,
    "escape-html": 
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
    ,
    "etag": 
      "version": "1.8.1",
      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
    ,
    "express": 
      "version": "4.18.1",
      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
      "requires": 
        "accepts": "~1.3.8",
        "array-flatten": "1.1.1",
        "body-parser": "1.20.0",
        "content-disposition": "0.5.4",
        "content-type": "~1.0.4",
        "cookie": "0.5.0",
        "cookie-signature": "1.0.6",
        "debug": "2.6.9",
        "depd": "2.0.0",
        "encodeurl": "~1.0.2",
        "escape-html": "~1.0.3",
        "etag": "~1.8.1",
        "finalhandler": "1.2.0",
        "fresh": "0.5.2",
        "http-errors": "2.0.0",
        "merge-descriptors": "1.0.1",
        "methods": "~1.1.2",
        "on-finished": "2.4.1",
        "parseurl": "~1.3.3",
        "path-to-regexp": "0.1.7",
        "proxy-addr": "~2.0.7",
        "qs": "6.10.3",
        "range-parser": "~1.2.1",
        "safe-buffer": "5.2.1",
        "send": "0.18.0",
        "serve-static": "1.15.0",
        "setprototypeof": "1.2.0",
        "statuses": "2.0.1",
        "type-is": "~1.6.18",
        "utils-merge": "1.0.1",
        "vary": "~1.1.2"
      
    ,
    "finalhandler": 
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
      "requires": 
        "debug": "2.6.9",
        "encodeurl": "~1.0.2",
        "escape-html": "~1.0.3",
        "on-finished": "2.4.1",
        "parseurl": "~1.3.3",
        "statuses": "2.0.1",
        "unpipe": "~1.0.0"
      
    ,
    "forwarded": 
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
    ,
    "fresh": 
      "version": "0.5.2",
      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
    ,
    "function-bind": 
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
    ,
    "get-intrinsic": 
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
      "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
      "requires": 
        "function-bind": "^1.1.1",
        "has": "^1.0.3",
        "has-symbols": "^1.0.3"
      
    ,
    "has": 
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
      "requires": 
        "function-bind": "^1.1.1"
      
    ,
    "has-symbols": 
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
    ,
    "http-errors": 
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
      "requires": 
        "depd": "2.0.0",
        "inherits": "2.0.4",
        "setprototypeof": "1.2.0",
        "statuses": "2.0.1",
        "toidentifier": "1.0.1"
      
    ,
    "iconv-lite": 
      "version": "0.4.24",
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
      "requires": 
        "safer-buffer": ">= 2.1.2 < 3"
      
    ,
    "inherits": 
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    ,
    "ipaddr.js": 
      "version": "1.9.1",
      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
    ,
    "media-typer": 
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
    ,
    "merge-descriptors": 
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
    ,
    "methods": 
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
    ,
    "mime": 
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
    ,
    "mime-db": 
      "version": "1.52.0",
      "resolved"物联网服务NodeJs-5天学习第一天篇① —— 第一次认识NodeJs

物联网服务NodeJs-5天学习第一天篇③ —— VsCode上运行第一个NodeJs 程序,配置自动重启插件 nodemon

物联网服务NodeJs-5天学习第三天实战篇② ——基于物联网的WiFi自动打卡考勤系统

物联网服务NodeJs-5天学习第四天存储篇② ——NodeJs连接操作mysql 8.0

物联网服务NodeJs-5天学习第二天篇② —— 网络编程(TCPHTTPWeb应用服务)

基于物联网的NodeJs-5天学习入门指引