分类 前端 下的文章

webpack的版本为4

npm init -y

在安装之前我们需要安装node和npm,因为webpack是基于node创造的。
我们可以2种方式安装,一个是全局安装,一个是局部在项目安装。

我们如果选择了全局安装那么,我们就只能运行同一个版本的项目,但是如果是在项目中安装,我们就可以在电脑上运行多个不同版本的webpack

所以推荐第二种方式。

npm install webpack webpack-cli -D

安装成功之后,如果是全局安装是直接webpack index.js

webpack在最早是一个js编译器,但是随着发展,webpack不仅仅能够编译js,png,css等等都可以做到非常棒的打包;

所以webpack应该说是一个模块打包工具;

我们进入packge.json配置private为true,将script清空;

然后我们在根目录上建立index.js,再建立一个header,通过es导入模块的方式引入;

然后可以使用

npx webpack index.js

npx是node提供的一个命令,我们是局部安装,无法使用webpack index.js命令,所以用npx命令可以在本项目中webpack编译index.js

编译成功可以生成出来了一个dist文件夹,下面有一个main.js,这边就是我们打包之后,能够被浏览器阅读的js文件。

webpack团队为了丰富我们使用webpack的赶脚,所以提供了一系默认配置,包括我们在执行编译的时候,会自动生成dist和mainjs,这些都是提供的默认配置;

我们可以自己定义打包文件名称以及编译后的文件名和文件夹名字,需要我们重写webpack.config.js 这个文件名称我们不能改变

const path = require('path') // 引入nodejs函数


    module.exports = {
   entry: "./index.js",
   output:{
    filename: "bundle.js",
    path: path.resolve(__dirname,'bundle') // 获取文件夹路径
    }
  }

我们用commonjs模块导出了一个对象,里面有编译的文件,和编译后的目录地址以及设置文件名称;

我们在这里之所以引入path函数,是因为不能写相对路径

我们配置好webpack之后,我们要去package中修改我们的script:




"scripts": {
"boundle":"webpack"

},

我们这边写这个代码的意思就是:我们可以用boundle关键字来取去找webpack在项目中,然后我们又定义了webpack配置:就可以轻松的使用如下命令来打包了:

npm run boundle

补充知识点:

QQ截图20190327172906.png

winter老师说,在他面试和认识的前端开发者中百分之70的人对浏览器是一知半解的状态,对于一个每天每时每刻都会接触的开发工具,我们需要对其浏览器运行过程和HTTP进行一些必要研究,因为这些都是面试中非常常见的考点。
这最近几篇文章,都是前端必知的浏览器知识,而不是浏览器开发者必知浏览器知识。
首先浏览器是如何工作的?其实无非就是把url一请求,浏览器只提供view视图来显示而已,这是对于浏览器开发者来说的。
过程解析:请求使用HTTP或者HTTPS协议,向服务端请求页面 -> 请求回来的HTML被构建成DOM树 -> 计算DOM树上的CSS属性 ->
最后根据CSS的属性对其一个一个渲染 得到位图-> (可选步骤)对位图进行合成,可以加快后期的绘制速度 -> 合成之后绘制到界面上;
这是一个浏览器从请求到解析再到界面的全部过程;这也是面试可能被问到的,所以这边不用记忆这么死板的知识点;
请求->构建dom->计算css属性->渲染dom->合成->绘制到页面
ps:请求过来的HTML,浏览器经历这一切都是“流”式的工作方式,即不一定要等到上一步骤的完全结束,就开始输出内容,所以我们加载网页的时候,网络比较差会看到一块一块的出来,这就是流的特点。

--HTTP协议
1.HTTP1.1 https://tools.ietf.org/html/rfc2616
2.HTTP1.1 https://tools.ietf.org/html/rfc7234
上面两份是HTTP协议的靠谱文档

HTTP协议是基于TCP协议出现的,它规定了REQUEST 和 RESPONSE 两种模式,tcp是一种双向的通讯通道,而HTTP协议的出现可使浏览器必须首发起。

我们可以口述一个基于TCP手动实现一个HTTP请求:首先建立TCP连接与服务器 -> 然后写request-line,它分为三个部分,HTTP Method,也就是请求的“方法”,请求的路径和请求的协议和版本 -> 然后返回的第一行就是response-line,也分为三个部分,协议版本,状态和文本;

--HTTP方法
HTTP的方法和JAVA亦或者是和web编程的REST风格很相似,有get,post,delete,put,connect,head,options,trace;
get默认我们在地址栏输入url时候就是默认的get提交
post一般为表单提交
put 做一个增加的操作
delete 删除操作
connect 通常和webscoket连接
head 返回头部信息
options和trace 在企业中一般做测试,在线上环境一般没有这玩意

--HTTP状态码
1** 临时回应,表示让客户端继续
2** 表成功
3** 表目标发生资源变化 301&&302 永久或者临时跳转 304跟客户端缓存没更新
4** 客户端请求错误 403没权限 404资源丢失 418(愚人节彩蛋)ps:要不是winter说我还没见过这个菜单
5** 服务端请求错误 500 请求错误服务端 503 暂时错误,一会再试试

--HTTP的head (这边直接上图)规定了对应的属性和值
request head
2be3e2457f08bdf624837dfaee01e4a2.png

response head
efdeadf27313e08bf0789a3b5480f7c9.png

ps:这个请求头要知道看到它就要知道它什么意思

--HTTPS和HTTP2

https://tools.ietf.org/html/rfc2818
HTTPS顾名思义:super http 它是也是基于TCP的,他在连接的时候会首先和服务端建立TLP连接,相当于在HTTP外层包了一层加密的壳,它与HTTP传输的内容没有任何区别,TLS是基于TCP的;主要作用就是确确定服务端身份,以及不会存在1.1的从网络传输节点进行窃听和篡改的问题

HTTP2 是HTTP1.1的升级版本
优点:支持服务端推送,支持TCP复用

服务端推送能够在客户端发送第一个请求到服务端时,提前把一部分内容推送给客户端,放入缓存当中,这可以避免客户端请求顺序带来的并行度不高,从而导致的性能问题。

TCP 连接复用,则使用同一个 TCP 连接来传输多个 HTTP 请求,避免了 TCP 连接建立时的三次握手开销,和初建 TCP 连接时传输窗口小的问题。

--结束

这段时间写第二章,希望能对我和你们都有一定的帮助理解浏览器的工作原理,知识不易,大家消化一下,部分demo出自winter
《重学前端》,转载说明出处:因卓诶-老沈

QQ截图20181115232109.png
触了很久的vue,也做了几个项目,对于vue这款框架,我们对此非常认可,但是我们也要正确的看待它的缺点,它属于渐进式框架,非常轻量级,也非常适合做spa单页应用,但是在我们的新闻,论坛,商城等需要很多搜索引擎流量的一些站点,我们需要正确做好ssr渲染,能够把vue的短板弥补,为了解决这样的问题,nuxt是我们可以优先考虑的选择。

nuxt是一个基于vue的渲染框架,它学起来非常简单,上手快,在工作中也经常用到,我们可以用一篇文章来快速的入门并且掌握项目的一些技巧。

首先我们需要搭建nuxt的环境,node和vuecli是必不可少的.

node和vuecli的安装我就不多说了,我们直接安装nuxt

输入命令:vue init nuxt/starter

我们就可以下载模板,然后进入目录install一下就ok

然后我们的组件和页面都在page下,我们可以更改

pages/index.vue来输出hello world来实现热加载编译

然后启动服务,等待打包成html : npm run dev

然后我们会在页面上看到我们输入的

hello world


目录介绍

|-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build
|-- assets // 用于组织未编译的静态资源入LESS、SASS 或 JavaScript
|-- components // 用于自己编写的Vue组件,比如滚动组件,日历组件,分页组件
|-- layouts // 布局目录,用于组织应用的布局组件,不可更改。
|-- middleware // 用于存放中间件
|-- pages // 用于存放写的页面,我们主要的工作区域
|-- plugins // 用于存放JavaScript插件的地方
|-- static // 用于存放静态资源文件,比如图片
|-- store // 用于组织应用的Vuex 状态管理。
|-- .editorconfig // 开发工具格式配置
|-- .eslintrc.js // ESLint的配置文件,用于检查代码格式
|-- .gitignore // 配置git不上传的文件
|-- nuxt.config.json // 用于组织Nuxt.js应用的个性化配置,已覆盖默认配置
|-- package-lock.json // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操作
|-- package-lock.json // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操作
|-- package.json // npm包管理配置文件


常用配置选项

我们在开发中经常会遇到端口被占用的情况,这种情况我们可以通过packge.json对端口和ip进行更改。

"config":{
"nuxt":{
  "host":"127.0.0.1",
  "port":"1818"
}

}

在开发我们的多页应用的时候,经常会有一些公用样式来约束我们的标签,我们可以通过一个公共的css来控制样式,我们可以对/assets/css/normailze.css下进行配置

(以下说明来自技术胖博客:http://jspang.com)对webpack设置的说明

配置webpack的loader

在nuxt.config.js里是可以对webpack的基本配置进行覆盖的,比如现在我们要配置一个url-loader来进行小图片的64位打包。就可以在nuxt.config.js的build选项里进行配置。

build: {

loaders:[
  {
    test:/\.(png|jpe?g|gif|svg)$/,
    loader:"url-loader",
    query:{
      limit:10000,
      name:'img/[name].[hash].[ext]'
    }
  }
],
/*
** Run ESLint on save
*/
extend (config, { isDev, isClient }) {
  if (isDev && isClient) {
    config.module.rules.push({
      enforce: 'pre',
      test: /\.(js|vue)$/,
      loader: 'eslint-loader',
      exclude: /(node_modules)/
    })
  }
}

}


nuxt对我们操作路由提供了很大的帮助,它实现了自动装配路由的强大功能,我们只需要按照它的规则来写代码,就可以省配置路由的环节

简要说明以下,nuxt是以目录来做路由的基线的,什么意思呢,大白话来说就是我们在pages目录下建立一个目录为news,在news目录下

建立index.vue,在这个组件中我们就可以通过/news来访问这个组件,那么对于路由之间的参数传递我们该怎么操作呢?

路由配置

我们可以通过点击这里跳转到首页

nuxt是不太建议我们拿a标签进行链接跳转,他们提供这样的组件来让我们使用,想必是对nuxt更友好,所以我们经常用nuxt-link来做跳转

这个name就是文件夹名字,它会自动找这个文件夹下的index.vue来展示出来,路由的参数就是可以这样写:

params是一个对象,我们可以在里面同时传入多个参数,在目标组件通过$route.params.具体的键就可以取到对应的值。


nuxt的动态路由和参数校验

我们在nuxt中定义动态路由,通常是以下划线结尾的组件,我们在news文件夹下建立_id.vue的组件
然后在这个组件还是用相同的方法来接受参数。

然后我们更改一下news/index.vue

<template>

News Index page

NewsID:{{$route.params.newsId}}

然后可以看到可以正常接受参数,那我们可以进行对这个参数的校验,我们拥有一个方法

validate ({ params }) {

// Must be a number
return /^\d+$/.test(params.id)

}

我们利用这个正则可以对id这个参数进行校验,如果不是数字就会被驳回,页面会显示404页面。


路由动画效果

我们如何通过nuxt来实现路由之间切换并且带有动画呢?

全局动画

我们在assets/css下建立main.css

在这个css中我们写一些样式

.page-enter-active, .page-leave-active {
    transition: opacity 2s;
}
.page-enter, .page-leave-active {
    opacity: 0;
}

必须按照这样写,前缀务必是.page,然后我们让这个链接定义nuxt.config.js中即可

css:['assets/css/main.css']

然后刷新页面,我们会看到一个隐藏显示过渡的效果。
如果你没有看到效果,得要改成

这就是全局动画的使用

而我们的局部动画,是针对局部的组件切换的动画。

我们只需要更改刚刚写的css,page改成随意的名字,然后在组件中定义

transition:'你定义的名字'

然后就会让这个组件有效果。


我们做多页应用经常遇到一些公共的内容,比如大标题等,我们可以通过Nuxt的默认模版和默认布局来实现
它们的区别就是一个需要重启服务器,一个不需要,一个是公用的,一个是每个组件需要引入,复杂程度不一样

Nuxt的默认模版和默认布局

首先我们说默认模板,默认模板只需要在根目录定义一个app.html即可

   <!DOCTYPE html>
<html lang="en">
<head>
   {{ HEAD }}
</head>
<body>
    <p>因卓诶</p>
    {{ APP }}
</body>
</html>

这样每个页面都可以显示因卓诶,需要重启服务器,这就是默认模板,那我们的默认布局就比较麻烦了。

    <template>
  <div>
    <p>因卓诶2</p>
    <nuxt/>
  </div>
</template>

<nuxt/>中就是内容,这样这个组件就有默认的布局,我们可以根据不同的业务需求来更改我们的代码,但是个人不建议

总结:要区分默认模版和默认布局的区别,模版可以订制很多头部信息,包括IE版本的判断;模版只能定制