谷粒学院——第四章、项目前端知识

自学参考:http://es6.ruanyifeng.com/

一、ECMAScript 6

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

1、ECMAScript 和 JavaScript 的关系

一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?
要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)

2、ES6 与 ECMAScript 2015 的关系

ECMAScript 2015(简称 ES2015)这个词,也是经常可以看到的。它与 ES6 是什么关系呢?
2011 年,ECMAScript 5.1 版发布后,就开始制定 6.0 版了。因此,ES6 这个词的原意,就是指 JavaScript 语言的下一个版本。
ES6 的第一个版本,在 2015 年 6 月发布,正式名称是《ECMAScript 2015 标准》(简称 ES2015)。
2016 年 6 月,小幅修订的《ECMAScript 2016 标准》(简称 ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小,基本上是同一个标准。根据计划,2017 年 6 月发布 ES2017 标准。

因此,ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。本书中提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。

3、let声明变量

创建 let.html


// var 声明的变量没有局部作用域
// let 声明的变量  有局部作用域

{
var a = 0
let b = 1
}
console.log(a)  // 0
console.log(b)  // ReferenceError: b is not defined


// var 可以声明多次
// let 只能声明一次
var m = 1
var m = 2
let n = 3
let n = 4
console.log(m)  // 2
console.log(n)  // Identifier 'n' has already been declared

2、const声明常量(只读变量)

创建 const.html


// 1、声明之后不允许改变    
const PI = "3.1415926"

PI = 3  // TypeError: Assignment to constant variable.

// 2、一但声明必须初始化,否则会报错
const MY_AGE  // SyntaxError: Missing initializer in const declaration



4、解构赋值

创建 解构赋值.html

解构赋值是对赋值运算符的扩展。
他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。


//1、数组解构
// 传统
let a = 1, b = 2, c = 3
console.log(a, b, c)

// ES6
let [x, y, z] = [1, 2, 3]
console.log(x, y, z)

//2、对象解构

let user = {name: 'Helen', age: 18}

// 传统

let name1 = user.name

let age1 = user.age

console.log(name1, age1)

// ES6
let { name, age } =  user//注意:结构的变量必须是user中的属性
console.log(name, age)

5、模板字符串

创建 模板字符串.html

模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。


// 1、多行字符串
let string1 =  `Hey,
can you stop angry now?`

console.log(string1)

// Hey,
// can you stop angry now?


// 2、字符串插入变量和表达式。变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式。

let name = "Mike"

let age = 27

let info = `My Name is ${name},I am ${age+1} years old next year.`

console.log(info)
// My Name is Mike,I am 28 years old next year.


// 3、字符串中调用函数

function f(){
    return "have fun!"
}

let string2 = `Game start,${f()}`

console.log(string2);  // Game start,have fun!

6、声明对象简写

创建 声明对象简写.html


const age = 12

const name = "Amy"

// 传统
const person1 = {age: age, name: name}

console.log(person1)



// ES6
const person2 = {age, name}
console.log(person2) //{age: 12, name: "Amy"}

7、定义方法简写

创建 定义方法简写.html


// 传统
const person1 = {
    sayHi:function(){
        console.log("Hi")
    }
}

person1.sayHi();//"Hi"


// ES6
const person2 = {
    sayHi(){
        console.log("Hi")
    }
}
person2.sayHi()  //"Hi"

8、对象拓展运算符

创建 对象拓展运算符.html
拓展运算符(…)用于取出参数对象所有可遍历属性然后拷贝到当前对象。


// 1、拷贝对象
let person1 = {name: "Amy", age: 15}

let someone = { ...person1 }

console.log(someone)  //{name: "Amy", age: 15}


// 2、合并对象
let age = {age: 15}

let name = {name: "Amy"}

let person2 = {...age, ...name}

console.log(person2)  //{age: 15, name: "Amy"}

8、箭头函数

创建 箭头函数.html
箭头函数提供了一种更加简洁的函数书写方式。基本语法是:
参数 => 函数体


// 传统
var f1 = function(a){
    return a
}

console.log(f1(1))



// ES6
var f2 = a => a

console.log(f2(1))




// 当箭头函数没有参数或者有多个参数,要用 () 括起来。
// 当箭头函数函数体有多行语句,用 {} 包裹起来,表示代码块,
// 当只有一行语句,并且需要返回结果时,可以省略 {} , 结果会自动返回。

var f3 = (a,b) => {

    let result = a+b

    return result

}

console.log(f3(6,2))  // 8


// 前面代码相当于:

var f4 = (a,b) => a+b

// 箭头函数多用于匿名函数的定义




二、Vue入门

1、Vue.js 是什么

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。
Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

官方网站:https://cn.vuejs.org

2、初始Vue.js

创建 demo.html


<!-- id标识vue作用的范围 -->

<div id="app">
    <!-- {{}} 插值表达式,绑定vue中的data数据 -->
    {{ message }}
</div>

<script src="vue.min.js"></script>

<script>

    // 创建一个vue对象

    new Vue({

        el: '#app',//绑定vue作用的范围

        data: {//定义页面中显示的模型数据

            message: 'Hello Vue!'

        }

    })


</script>

这就是声明式渲染:Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统
这里的核心思想就是没有繁琐的DOM操作,例如jQuery中,我们需要先找到div节点,获取到DOM对象,然后进行一系列的节点操作

在vs code中创建代码片段:
文件 => 首选项 => 用户代码片段 => 新建全局代码片段/或文件夹代码片段:vue-html.code-snippets
注意:制作代码片段的时候,字符串中如果包含文件中复制过来的“Tab”键的空格,要换成“空格键”的空格

{
 "vue htm": {
     "scope": "html",
     "prefix": "vuehtml",
     "body": [
         "<!DOCTYPE html>",
         "<html lang=\"en\">",
         "",
         "<head>",
         "    <meta charset=\"UTF-8\">",
         "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
         "    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">",
         "    <title>Document</title>",
         "</head>",
         "",
         "<body>",
         "    <div id=\"app\">",
         "",
         "    </div>",
         "    <script src=\"vue.min.js\"></script>",
         "    <script>",
         "        new Vue({",
         "            el: '#app',",
         "            data: {",
         "                $1",
         "            }",
         "        })",
         "    </script>",
         "</body>",
         "",
         "</html>",
     ],
     "description": "my vue template in html"
 }
}

三、Vue基本语法

1、基本数据渲染和指令

创建 01-基本数据渲染和指令.html
你看到的 v-bind 特性被称为指令。指令带有前缀 v-
除了使用插值表达式{{}}进行数据渲染,也可以使用 v-bind指令,它的简写的形式就是一个冒号(:)


data: {
    content: '我是标题',
    message: '页面加载于 ' + new Date().toLocaleString()
}



<!-- 如果要将模型数据绑定在html属性中,则使用 v-bind 指令
     此时title中显示的是模型数据
-->
<h1 v-bind:title="message">
    {{content}}
</h1>

<!-- v-bind 指令的简写形式: 冒号(:) -->
<h1 :title="message">
    {{content}}
</h1>



2、双向数据绑定

创建 02-双向数据绑定.html
双向数据绑定和单向数据绑定:使用 v-model 进行双向数据绑定

data: {
  searchMap:{
      keyWord:'尚硅谷'
  }
}

 <!-- v-bind:value只能进行单向的数据渲染 -->
<input type="text" v-bind:value="searchMap.keyWord">

<!-- v-model 可以进行双向的数据绑定  -->
<input type="text" v-model="searchMap.keyWord">

<p>您要查询的是:{{searchMap.keyWord}}</p>

3、事件

创建 03-事件.html
**需求:**点击查询按钮,按照输入框中输入的内容查找公司相关信息
在前面的例子基础上,data节点中增加 result,增加 methods节点 并定义 search方法


data: {
     searchMap:{
         keyWord: '尚硅谷'
     },
     //查询结果
     result: {}
},
methods:{
    search(){
        console.log('search')
        //TODO
    }
}

html中增加 button 和 p

使用 v-on 进行数件处理,v-on:click 表示处理鼠标点击事件,事件调用的方法定义在 vue 对象声明的 methods 节点中


<!-- v-on 指令绑定事件,click指定绑定的事件类型,事件发生时调用vue中methods节点中定义的方法 -->
<button v-on:click="search()">查询</button>

<p>您要查询的是:{{searchMap.keyWord}}</p>
<p><a v-bind:href="result.site" target="_blank">{{result.title}}</a></p>

完善search方法


search(){
    console.log('search');
    this.result = {
        "title":"尚硅谷",
        "site":"http://www.atguigu.com"
    }
}

简写


<!-- v-on 指令的简写形式 @ -->
<button @click="search()">查询</button>

4、修饰符

创建 04-修饰符.html
修饰符 (Modifiers) 是以半角句号(.)指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。
例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
即阻止事件原本的默认行为


data: {
    user: {}
}


<!-- 修饰符用于指出一个指令应该以特殊方式绑定。
     这里的 .prevent 修饰符告诉 v-on 指令对于触发的事件调用js的 event.preventDefault():
     即阻止表单提交的默认行为 -->
<form action="save" v-on:submit.prevent="onSubmit">
    <label for="username">
        <input type="text" id="username" v-model="user.username">
        <button type="submit">保存</button>
    </label>
</form>

methods: {
  onSubmit() {
      if (this.user.username) {
          console.log('提交表单')
      } else {
          alert('请输入用户名')
      }
  }
}

5、条件渲染

创建 05-条件渲染.html
v-if:条件指令


data: {
    ok: false
}

注意:单个复选框绑定到布尔值


<input type="checkbox" v-model="ok">同意许可协议
<!-- v:if条件指令:还有v-else、v-else-if 切换开销大 -->
<h1 v-if="ok">if:Lorem ipsum dolor sit amet.</h1>
<h1 v-else>no</h1>

v-show:条件指令

使用v-show完成和上面相同的功能


<!-- v:show 条件指令 初始渲染开销大 -->
<h1 v-show="ok">show:Lorem ipsum dolor sit amet.</h1>
<h1 v-show="!ok">no</h1>
  • v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

  • v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

  • 相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

  • 一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

6、列表渲染

创建 06-列表渲染.html
v-for:列表循环指令
例1:简单的列表渲染

<!-- 1、简单的列表渲染 -->
<ul>
    <li v-for="n in 10">{{ n }} </li>
</ul>
<ul>
    <!-- 如果想获取索引,则使用index关键字,注意,圆括号中的index必须放在后面 -->
    <li v-for="(n, index) in 5">{{ n }} - {{ index }} </li>
</ul>

例2:遍历数据列表

data: {
  userList: [
      { id: 1, username: 'helen', age: 18 },
      { id: 2, username: 'peter', age: 28 },
      { id: 3, username: 'andy', age: 38 }
  ]
}


<!-- 2、遍历数据列表 -->
<table border="1">
 <!-- <tr v-for="item in userList"></tr> -->
 <tr v-for="(item, index) in userList">
     <td>{{index}}</td>
     <td>{{item.id}}</td>
     <td>{{item.username}}</td>
     <td>{{item.age}}</td>
 </tr>
</table>

四、Vue组件(重点)

组件(Component)是 Vue.js 最强大的功能之一。

组件可以扩展 HTML 元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树:

image.png

1、局部组件

创建 01-1-局部组件.html
定义组件


var app = new Vue({
 el: '#app',
 // 定义局部组件,这里可以定义多个局部组件
 components: {
     //组件的名字
     'Navbar': {
         //组件的内容
         template: '<ul><li>首页</li><li>学员管理</li></ul>'
     }
 }
})

使用组件

<div id="app">
    <Navbar></Navbar>
</div>

2、全局组件

创建 01-2-全局组件.html
定义全局组件:components/Navbar.js


// 定义全局组件
Vue.component('Navbar', {
    template: '<ul><li>首页</li><li>学员管理</li><li>讲师管理</li></ul>'
})

<div id="app">
    <Navbar></Navbar>
</div>
<script src="vue.min.js"></script>
<script src="components/Navbar.js"></script>
<script>
    var app = new Vue({
        el: '#app'
    })
</script>

五、Vue实例生命周期

image.png

创建 03-vue实例的生命周期.html


data: {
    message: '床前明月光'
},
methods: {
    show() {
        console.log('执行show方法')
    },
    update() {
        this.message = '玻璃好上霜'
    }
},

<button @click="update">update</button>
<h3 id="h3">{{ message }}</h3>

分析生命周期相关方法的执行时机


//===创建时的四个事件
beforeCreate() { // 第一个被执行的钩子方法:实例被创建出来之前执行
    console.log(this.message) //undefined
    this.show() //TypeError: this.show is not a function
    // beforeCreate执行时,data 和 methods 中的 数据都还没有没初始化
},
created() { // 第二个被执行的钩子方法
    console.log(this.message) //床前明月光
    this.show() //执行show方法
    // created执行时,data 和 methods 都已经被初始化好了!
    // 如果要调用 methods 中的方法,或者操作 data 中的数据,最早,只能在 created 中操作
},

beforeMount() { // 第三个被执行的钩子方法
    console.log(document.getElementById('h3').innerText) //{{ message }}
    // beforeMount执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中
},

mounted() { // 第四个被执行的钩子方法
    console.log(document.getElementById('h3').innerText) //床前明月光
    // 内存中的模板已经渲染到页面,用户已经可以看见内容
},
  
//===运行中的两个事件
beforeUpdate() { // 数据更新的前一刻
    console.log('界面显示的内容:' + document.getElementById('h3').innerText)
    console.log('data 中的 message 数据是:' + this.message)
    // beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染
},
updated() {
    console.log('界面显示的内容:' + document.getElementById('h3').innerText)
    console.log('data 中的 message 数据是:' + this.message)
    // updated执行时,内存中的数据已更新,并且页面已经被渲染
}

六、Vue路由

Vue.js 路由允许我们通过不同的 URL 访问不同的内容。
通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)。
Vue.js 路由需要载入 vue-router 库
创建 04-路由.html

1、引入js


<script src="vue.min.js"></script>
<script src="vue-router.min.js"></script>

2、编写html


<div id="app">
 <h1>Hello App!</h1>
 <p>
     <!-- 使用 router-link 组件来导航. -->
     <!-- 通过传入 `to` 属性指定链接. -->
     <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
     <router-link to="/">首页</router-link>
     <router-link to="/student">会员管理</router-link>
     <router-link to="/teacher">讲师管理</router-link>
 </p>
 <!-- 路由出口 -->
 <!-- 路由匹配到的组件将渲染在这里 -->
 <router-view></router-view>
</div>

3、编写js


<script>
 // 1. 定义(路由)组件。
 // 可以从其他文件 import 进来
 const Welcome = { template: '<div>欢迎</div>' }
 const Student = { template: '<div>student list</div>' }
 const Teacher = { template: '<div>teacher list</div>' }

 // 2. 定义路由
 // 每个路由应该映射一个组件。
 const routes = [
     { path: '/', redirect: '/welcome' }, //设置默认指向的路径
     { path: '/welcome', component: Welcome },
     { path: '/student', component: Student },
     { path: '/teacher', component: Teacher }
 ]

 // 3. 创建 router 实例,然后传 `routes` 配置
 const router = new VueRouter({
     routes // (缩写)相当于 routes: routes
 })

 // 4. 创建和挂载根实例。
 // 从而让整个应用都有路由功能
 const app = new Vue({
     el: '#app',
     router
 })

 // 现在,应用已经启动了!
</script>

七、axios

axios是独立于vue的一个项目,基于promise用于浏览器和node.js的http客户端

  • 在浏览器中可以帮助我们完成 ajax请求的发送

  • 在node.js中可以向远程接口发送请求

获取数据


<script src="vue.min.js"></script>
<script src="axios.min.js"></script>

注意:测试时需要开启后端服务器,并且后端开启跨域访问权限


var app = new Vue({
 el: '#app',
 data: {
     memberList: []//数组
 },
 created() {
     this.getList()
 },

 methods: {

     getList(id) {
         //vm = this
         axios.get('http://localhost:8081/admin/ucenter/member')
         .then(response => {
             console.log(response)
             this.memberList = response.data.data.items
         })
         .catch(error => {
             console.log(error)
         })
     }
 }
})

控制台查看输出

2、显示数据


<div id="app">
 <table border="1">
     <tr>
         <td>id</td>
         <td>姓名</td>
     </tr>
     <tr v-for="item in memberList">
         <td>{{item.memberId}}</td>
         <td>{{item.nickname}}</td>
     </td>
 </tr>
</table>
</div>

八、element-ui:

element-ui 是饿了么前端出品的基于 Vue.js的 后台组件库,方便程序员进行页面快速布局和构建
官网: http://element-cn.eleme.io/#/zh-CN
创建 06-element-ui.html
将element-ui引入到项目
image.png

1、引入css


<!-- import CSS -->
<link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">

2、引入js


<!-- import Vue before Element -->
<script src="vue.min.js"></script>
<!-- import JavaScript -->
<script src="element-ui/lib/index.js"></script>

3、编写html


<div id="app">
  <el-button @click="visible = true">Button</el-button>
  <el-dialog :visible.sync="visible" title="Hello world">
      <p>Try Element</p>
  </el-dialog>
</div>

关于.sync的扩展阅读
https://www.jianshu.com/p/d42c508ea9de

4、编写js


<script>
  new Vue({
    el: '#app',
    data: function () {//定义Vue中data的另一种方式
      return { visible: false }
    }
  })
</script>

九、Node.js

1、什么是Node.js

简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

2、Node.js有什么用

如果你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择。
Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js。
当然,如果你是后端程序员,想部署一些高性能的服务,那么学习Node.js也是一个非常好的选择。

3、下载

官网:https://nodejs.org/en/
中文网:http://nodejs.cn/
LTS:长期支持版本
Current:最新版

4、安装

5、查看版本

node -v

6、快速入门

1、创建文件夹nodejs

创建 01-控制台程序.js

console.log('Hello Node.js')

打开命令行终端:Ctrl + Shift + y
进入到程序所在的目录,输入

node 01-控制台程序.js

浏览器的内核包括两部分核心:

  • DOM渲染引擎;

  • js解析器(js引擎)

  • js运行在浏览器中的内核中的js引擎内部

Node.js是脱离浏览器环境运行的JavaScript程序,基于V8 引擎(Chrome 的 JavaScript的引擎)

3、服务器端应用开发(了解)

创建 02-server-app.js



const http = require('http');

http.createServer(function (request, response) {

    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 发送响应数据 "Hello World"
    response.end('Hello Server');
}).listen(8888);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

运行服务器程序

node 02-server-app.js

服务器启动成功后,在浏览器中输入:http://localhost:8888/ 查看webserver成功运行,并输出html页面
停止服务:ctrl + c

十、Npm

1、Npm介绍

NPM全称Node Package Manager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具,相当于前端的Maven 。

我们通过npm 可以很方便地下载js库,管理前端工程。
Node.js默认安装的npm包和工具的位置:Node.js目录\node_modules

  • 在这个目录下你可以看见 npm目录,npm本身就是被NPM包管理器管理的一个工具,说明 Node.js已经集成了npm工具

#在命令提示符输入 npm -v 可查看当前npm版本

npm -v

2、使用npm管理项目

1、创建文件夹npm

2、项目初始化


#建立一个空文件夹,在命令提示符进入该文件夹  执行命令初始化
npm init

#按照提示输入相关信息,如果是用默认值则直接回车即可。
#name: 项目名称
#version: 项目版本号
#description: 项目描述
#keywords: {Array}关键词,便于用户搜索到我们的项目
#最后会生成package.json文件,这个是包的配置文件,相当于maven的pom.xml
#我们之后也可以根据需要进行修改。


#如果想直接生成 package.json 文件,那么可以使用命令

npm init -y

3、修改npm镜像

NPM官方的管理的包都是从 http://npmjs.com下载的,但是这个网站在国内速度很慢。
这里推荐使用淘宝 NPM 镜像 http://npm.taobao.org/ ,淘宝 NPM 镜像是一个完整 npmjs.com 镜像,同步频率目前为 10分钟一次,以保证尽量与官方服务同步。
设置镜像地址:


#经过下面的配置,以后所有的 npm install 都会经过淘宝的镜像地址下载
npm config set registry https://registry.npm.taobao.org 

#查看npm配置信息
npm config list

4、npm install命令的使用


#使用 npm install 安装依赖包的最新版,
#模块安装的位置:项目目录\node_modules
#安装会自动在项目目录下添加 package-lock.json文件,这个文件帮助锁定安装包的版本
#同时package.json 文件中,依赖包会被添加到dependencies节点下,类似maven中的 <dependencies>
npm install jquery


#npm管理的项目在备份和传输的时候一般不携带node_modules文件夹
npm install #根据package.json中的配置下载依赖,初始化项目


#如果安装时想指定特定的版本
npm install jquery@2.1.x


#devDependencies节点:开发时的依赖包,项目打包到生产环境的时候不包含的依赖
#使用 -D参数将依赖添加到devDependencies节点
npm install --save-dev eslint
#或
npm install -D eslint


#全局安装
#Node.js全局安装的npm包和工具的位置:用户目录\AppData\Roaming\npm\node_modules
#一些命令行工具常使用全局安装的方式
npm install -g webpack

5、其它命令


#更新包(更新到最新版本)
npm update 包名
#全局更新
npm update -g 包名

#卸载包
npm uninstall 包名
#全局卸载
npm uninstall -g 包名

  

十一、Babel

Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行执行。
这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持。

1、安装命令行转码工具

Babel提供babel-cli工具,用于命令行转码。它的安装命令如下:


npm install --global babel-cli

#查看是否安装成功
babel --version

2、Babel的使用

1、初始化项目


npm init -y

2、创建文件

src/example.js

下面是一段ES6代码:


// 转码前
// 定义数据
let input = [1, 2, 3]
// 将数组的每个元素 +1
input = input.map(item => item + 1)
console.log(input)

3、配置.babelrc

Babel的配置文件是.babelrc,存放在项目的根目录下,该文件用来设置转码规则和插件,基本格式如下。


{
    "presets": [],
    "plugins": []
}

presets字段设定转码规则,将es2015规则加入 .babelrc:

{
    "presets": ["es2015"],
    "plugins": []
}

4、安装转码器

在项目中安装


npm install --save-dev babel-preset-es2015

5、转码


# 转码结果写入一个文件
mkdir dist1
# --out-file 或 -o 参数指定输出文件
babel src/example.js --out-file dist1/compiled.js
# 或者
babel src/example.js -o dist1/compiled.js

# 整个目录转码
mkdir dist2

# --out-dir 或 -d 参数指定输出目录

babel src --out-dir dist2

# 或者

babel src -d dist2



十二、模块化

1、什么是模块化开发

开发后端接口的时候,开发controller service mapper,controller注入service,service注入mapper,在后端中,类与类之间调用称为后端模块化操作。
前端模块化,在前端中,js与js之间调用成为前端模块化操作。

2、es5实现模块化操作

1、创建js文件
image.png
2、编写js代码
01.js代码

//1 创建js方法
const sum = function(a,b){
    return parseInt(a) + parseInt(b)
}
const subtract = function(a,b){
    return parseInt(a) - parseInt(b)
}

//2 设置哪些方法可以被其他js调用
module.exports = {
    sum,
    subtract,
}

02.js代码

//引入模块,注意:当前路径必须写 ./
const m = require('./01.js')
console.log(m)

//调用
const result1 = m.sum(1, 2)
const result2 = m.subtract(10, 3)
console.log(result1, result2)

3、测试
![image.png](https://img-blog.csdnimg.cn/img_convert/d6fa45dfb6822d83d94cc14ee4c0ef0a.png

3、es6实现模块化操作

注意:如果使用es6写法实现模块化操作,在nodejs环境中不能直接运行的,需要使用babel把es6转换es5代码,才可以在nodejs进行运行
第一种写法
1、创建js文件
image.png
2、编写js代码
01.js代码

export function getList() {
    console.log('getList....')
}

export function save() {
    console.log('save.....')
}

02.js代码

//调用01.js的方法,引入01.js文件,进行调用
import { getList, save } from "./01.js"

//调用方法
getList()
save()

image.png
执行:node 02.js
第二种写法
01.js代码

export default {
    getList() {
        console.log('getList....')
    },
    update() {
        console.log('update....')
    }
}

02.js代码

//调用01.js的方法,引入01.js文件,进行调用
import m from "./01.js"

//调用方法
m.getList()
m.save()

执行:node 02.js
image.png

十二、Webpack

1、什么是Webpack

Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。
从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求。
image.png

2、Webpack安装

1、全局安装

npm install -g webpack webpack-cli

2、安装后查看版本号

webpack -v

3、初始化项目

1、创建webpack文件夹

进入webpack目录,执行命令

npm init -y

//  如果不起作用,在vscode中段输入下面代码
set-ExecutionPolicy RemoteSigned

2、创建src文件夹

3、src下创建common.js

exports.info = function (str) {
    document.write(str);
}

4、src下创建utils.js

exports.add = function (a, b) {
    return a + b;
}

5、src下创建main.js

const common = require('./common');
const utils = require('./utils');

common.info('Hello world!' + utils.add(100, 200))

4、JS打包

1、webpack目录下创建配置文件webpack.config.js

以下配置的意思是:读取当前项目目录下src文件夹中的main.js(入口文件)内容,分析资源依赖,把相关的js文件打包,打包后的文件放入当前目录的dist文件夹下,打包后的js文件名为bundle.js

const path = require("path"); //Node.js内置模块
module.exports = {
  entry: './src/main.js', //配置入口文件
  output: {
      path: path.resolve(__dirname, './dist'), //输出路径,__dirname:当前文件所在路径
      filename: 'bundle.js' //输出文件
  }
}

2、命令行执行编译命令

webpack #有黄色警告
webpack --mode=development #没有警告
#执行后查看bundle.js 里面包含了上面两个js文件的内容并惊醒了代码压缩

也可以配置项目的npm运行命令,修改package.json文件

"scripts": {
  //...,
  "dev": "webpack --mode=development"
 }

运行npm命令执行打包

npm run dev

3、webpack目录下创建index.html

引用bundle.js

<body>
    <script src="dist/bundle.js"></script>
</body>

4、浏览器中查看index.html

5、CSS打包

1、安装style-loader和 css-loader

Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。
Loader 可以理解为是模块和资源的转换器。
首先我们需要安装相关Loader插件,css-loader 是将 css 装载到 javascript;style-loader 是让 javascript 认识css

npm install --save-dev style-loader css-loader 

2、修改webpack.config.js

const path = require("path"); //Node.js内置模块
module.exports = {
  //...,
  output:{},
  module: {
      rules: [  
          {  
              test: /\.css$/,    //打包规则应用到以css结尾的文件上
              use: ['style-loader', 'css-loader']
          }  
      ]  
  }
}

3、在src文件夹创建style.css

body{
    background:pink;
}

4、修改main.js

在第一行引入style.css

require('./style.css');

5、浏览器中查看index.html

看看背景是不是变成粉色啦?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉丝不切片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值