node(一)

require.js AMD模块化规范

{
    // AMD规范,require.js是语法形式
    // ["a"] -> a.js 后缀名会自动添加,多个模块就在中括号添加内容
    // 会自动执行a.js文件
    require(["a"], function (res) {
        // function里面是接收导入内容
        console.log(res);
    });
}

node的require模块化的注意点

index.js )

let res = require("./a.js");
// 这个./是必须要加的,不然会报错
// 在node中执行 -> 终端 -> node index.js

// 什么时候不需要./呢?
    // node_modules

// 接收导入
console.log(res.name);// 注意:上面需要let定义一下
res.hobby();

a.js )

console.log("a....");

// 导出
{
    // 第一种方式
    // module.exports = {
    //     name: "张三"
    // }
}
{
    // 第二种方式
    exports.name = "李四";
    exports.age = 20;
    exports.hobby = function(){
        console.log("fn...")
    }

    // 注意点: 这样是错误;
    // exports = {
    //     name:"王五"
    // }
    // 因为exports是module.exports的引用,所以真正的导出是使用module.exports的;
}

关于package.json这是一个描述性和功能性文件,并不是可有可无文件的,它是和项目相关的文件;
如何创建呢?
  npm init -y -> 注:-y是表示下面东西默认值,就不需要一直确认了;

node_modules:
  1.我们在引入这里面的js的时候就不需要加 ./ 
    require("b");
  2.关于modules的向上查找功能
    若假如本项目中没有modules中的文件,也执行查找引入的时候,会自动向上级查找,依次找到为止;

ES6和commonjs的导入导出区别

  ES6 : export、export default 导出 import 导入
  common : modules.exports 导出 require 导入
  他们两个都是成双出现的

内置模块不需要安装,外置模块需要安装

npm包管理器使用

npm i -> npm install的简写
--save-dev (-D) 开发依赖
--save (S) 运行依赖
-g 全局安装
npm root查看全局路径
npm root -g

其他工具

npm i jquery这样一个过程是在哪里下载的呢?
  npm config list -> 可以查看npm下载的源
  https://www.npmjs.com/ 在源里面下载的东西,全部可以在这里查找
  但是呢这是一个国外的网站,所以当网络慢的时候,就可能下载比较久
    所以可以改到淘宝里面 -> cnpm
    npm config set registry https://registry.npm.taobao.org
    这样子就可以改为淘宝源,下载速度就比默认的国外快
  那这里面这么多npm是如何来的呢?
    是可以用户上传的~
      1.需要有package.json
        npm init -y
      2.源需要是官方源
        npm config set registry https://registry.npmjs.org/
      3.注册账号
        然后登录
          npm login
      4.上传
        npm publish
      5.删除
        npm unpublish

yarn
  和npm很相似,也就是比他快~

nvm
  可以切换node的版本
  前提需要安装

正式内容

一个小小的服务端与后端路由

index.js )

const http = require("http");
// req -> require的简写 -> 所有浏览器到服务端的东西 -> 也就是前端到后端的
// res -> 服务端输出到客户端的东西
let server = http.createServer((req,res)=>{
    // res.setHeader("Content-Type","text/html;charset=utf-8");//设置协议头
    //设置协议头的第二种方式 -> 原生
    res.writeHead(200,{//参数 : 请求成功(状态码)
        "Content-Type":"text/html;charset=utf-8"
    });
    // res.end("hello,世界");//end 输出内容

    console.log(req.url);//可以获取网页一些资源,在node中显示
        // 那我们拿到这些东西了之后,就可以做后端的路由区分了
        // 后端路由区分:后端路由区分和前端的路由区分是不一样的
            // vue 那些都是使用了spa 单页应用(无刷)
            // 后端路由: 需要重新请求一下(刷新);
    if(req.url === "/index"){
        res.end("主页面");
    }else if(req.url === "/product"){
        res.end("商品页面");
    }
});
server.listen(8989);//给端口

fs模块:设置路由,区分头部,加载页面(文件读取/流),处理第三方资源

const http = require("http");
const fs = require("fs");
const mime = require("./mime.json");
const path = require("path");//内置模块,可以拿到后缀
// console.log(mime);//这里的json自动转换为了对象
// req -> require的简写 -> 所有浏览器到服务端的东西 -> 也就是前端到后端的
// res -> 服务端输出到客户端的东西
let server = http.createServer((req,res)=>{
    // res.setHeader("Content-Type","text/html;charset=utf-8");//设置协议头
    //设置协议头的第二种方式 -> 原生
    // res.writeHead(200,{//参数 : 请求成功(状态码)
    //     "Content-Type":"text/html;charset=utf-8"
    // });
    // res.end("hello,世界");//end 输出内容

    console.log(req.url);//可以获取网页一些资源,在node中显示
        // 那我们拿到这些东西了之后,就可以做后端的路由区分了
        // 后端路由区分:后端路由区分和前端的路由区分是不一样的
            // vue 那些都是使用了spa 单页应用(无刷)
            // 后端路由: 需要重新请求一下(刷新);
    if(req.url === "/index"){
        res.writeHead(200,{//参数 : 请求成功(状态码)
            "Content-Type":"text/html;charset=utf-8"
        });
        // res.end("主页面");
        let indexData = fs.readFileSync("./index.html");//读取文件
        res.end(indexData);//输出
    }else if(req.url === "/product"){
        res.writeHead(200,{//参数 : 请求成功(状态码)
            "Content-Type":"text/html;charset=utf-8"
        });
        // res.end("商品页面");
        {
            // 文件方式读取
            // let productData = fs.readFileSync("./product.html");
            // res.end(productData);
        }
        {
            // 流读取
            let rs = fs.createReadStream("./product.html");
            rs.pipe(res);
        }
    }else{
        // 统一处理其他资源
        if(req.url!=="/favicon.ico"){
            // 问题1:协议头如何处理呢?
                // 引入Mime标准
            let extName = path.extname(req.url);//获取后缀名
            res.setHeader("Content-type",mime[extName]);//配置协议头
            
            let resData = fs.readFileSync("."+req.url);
            res.end(resData);
        }
    }
});
server.listen(8989);//给端口

新闻信息展示

const http = require("http");
const fs = require("fs");
const mime = require("./data/mime.json");
const path = require("path");
const cheoor = require("cheerio");//外置模块新模块 -> 处理HTML -> 需要init,然后安装cheerio -S
const url = require("url");//内置模块 -> 可以提取路由地址;
let newsData = require("./data/data.json");
let server = http.createServer((req,res)=>{
    let objPath = url.parse(req.url,true);//可以拿到真正的路由地址
    let pathName = objPath.pathname;
    // console.log(pathName);
    if(pathName==="/news" || req.url==="/"){
        res.setHeader("Content-type","text/html;charset=utf-8");
        // res.end("新闻页面");

        // 分页相关;
            // 已知: 当前是那页 页码 : 1,2,3
            // 已知: 每页有多少条? 
            // 得到数据
        // 接收当前页码
        // console.log(objPath.query.p);
        let p = objPath.query.p || 1;//页码
        let perPage = 5;//
            // 1,5 0-5 -> (p-1)*perPage,perPage
            // 2,5 5,10 -> (p-1)*perPage,perPage
            // ... splice
        let nData = JSON.parse( JSON.stringify(newsData)).splice((p-1)*perPage,perPage);

        // 生成页码
        let totalCount = newsData.length;
        let page = Math.ceil(totalCount/perPage);//页码总数

        // 按照数据组装HTML
        let newHTML = "";
        nData.forEach(itme=>{
            newHTML += `
                <li class="news">
                    <a href="javascript:;">
                        <img src="${itme.imgUrl}" alt="">
                    </a>
                    <div>
                        <h3>
                            <a href="${"http://localhost:8787/detail?d=" + itme.id}">${itme.title}</a>
                        </h3>
                        <div class="info">
                            <span class="tips"><span>${itme.from}</span></span>
                            <!-- <span class="line"></span> -->
                            <span class="time">| &nbsp;&nbsp;${itme.newTime}</span>
                        </div>
                    </div>
            </li>
            `;
        });

        // 组装分页
        let paginationHtml = `<a href="javascript:;" class="prev">⌜</a>`;
        for(let i = 1;i<=page;i++){
            paginationHtml += `<a href="/news?p=${i}">${i}</a>`;
        }
        paginationHtml += `<a href="javascript:;" class="next">⌝</a>`;

        let indexData = fs.readFileSync("./views/index.html");
        
        let $ = cheoor.load(indexData);//加载处理模板
        $(".news-list").html(newHTML);//替换内容
        $(".pagination").html(paginationHtml);

        // res.end(indexData);
        res.end($.html())
    }else if(pathName==="/detail"){
        res.setHeader("Content-type","text/html;charset=utf-8");
        // 获取后缀内容(?d=)
        let objPath = url.parse(req.url,true);//可以拿到真正的路由地址
        let pathName = objPath.pathname;
        let num = objPath.query.d;
        // 获取数据内容(标题);
        let title = newsData[num-1].title;
        
        // res.end("详细页面")
        let detailData = fs.readFileSync("./views/detail.html");
        let $ = cheoor.load(detailData);//加载处理模板
        $(".title").html(title);//替换内容
        res.end($.html());
    }else{
        if(pathName!=="/favicon.ico"){
            let extName = path.extname(req.url);//获取后缀名
            res.setHeader("Content-type",mime[extName]);//配置协议头
            
            let resData = fs.readFileSync("."+req.url);
            res.end(resData);
        }
    }
});
server.listen(8787);

 

posted @ 2020-03-09 19:21  JackAfan  阅读(159)  评论(0)    收藏  举报
setTimeout(function(){ let aImg = document.querySelectorAll("img"); aImg.forEach(img=>{ img.alt = "" }) console.log("去除img-alt成功") },1000)