針對java程序員的前端開發(fā)學習說明

Nodejs

Nodejs是什么

Nodejs是javascript的執(zhí)行引擎,提供的js文件作為運行入口。作為生產使用,盡量選擇LTS版本寺鸥。前端開發(fā)過程中大量使用到了html瘫筐、css和javascript的代碼拐纱,為了方便開發(fā)過程中對這些資源两踏、文件的處理连舍,需要定義一些處理過程授段,而前端開發(fā)人員使用最多的是js蹲蒲,而nodejs是一個js引擎,nodejs的作用和java中的jvm的作用是一致的侵贵。

在java開發(fā)中届搁,需要對業(yè)務的工具進行類的設計,實現(xiàn)對文件的歸類窍育,前端組件的設計卡睦,資源的維護等。因此有很多前端的工具和框架漱抓。全棧工程師則是加上js來編寫后端的業(yè)務處理過程表锻,就是一套技術就把前后端統(tǒng)一了,因此叫全棧工程師乞娄。

Javascript開發(fā)常用工具和框架

NPM是什么

在javascript項目的開發(fā)中瞬逊,有大量需要引用的模塊,為了管理模塊之間的依賴關系仪或,引入了npm确镊。npm安裝后就可以使用,第三方模塊通過npm命令安裝溶其。常用命令如下:

  • npm init:初始化項目信息骚腥。
  • npm install -g -save xxxx: 安裝指定模塊,-g是全局安裝瓶逃,安裝完成后可以直接使用模塊提供的命令束铭,-save是將此模塊添加到當前項目的依賴中。install可以使用i代替厢绝。
  • npm list / npm ls:列出項目依賴的所有模塊契沫。
  • npm uninstall xxx:卸載模塊
  • npm update xxx:更新模塊

NPM僅僅是對模塊依賴的管理(當然也集成了其他測試運行等功能)。項目是具體用來做什么的npm不負責管理昔汉,對于常見的webserver懈万,資源管理等,npm有常用的模塊處理,下面是常見模塊的說明会通。

Webpack

一個web項目常見的內容包括html文件口予,css文件,js文件以及其他圖片等等涕侈,利用webpack沪停,可以將這些文件合并,輸出為一個更優(yōu)化的web應用文件裳涛。

首先是安裝webpack的命令行工具:

npm i -g webpack-cli

然后是在package.json中添加webpack處理的script木张,下面是樣例

{
  "name": "empty-project-",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "keywords": [],
  "author": "",
  "license": "ISC",
  "scripts": {
    "clean": "rm dist/bundle.js",
    "build-dev": "webpack -d --mode development",
    "build-prod": "webpack -p --mode production"
  },
  "dependencies": {},
  "devDependencies": {
    "webpack": "^4.26.0",
    "webpack-cli": "^3.1.2"
  }
}

執(zhí)行以下命令即可打包并運行項目

npm install
npm run build-prod
npm run build-dev
node dist/bundle.js

處理的流程是npm調用script,script調用webpack-cli端三,webpack-cli調用js舷礼,利用webpack.config.js中的配置,自動生成最終的成品郊闯。

有一些UI工具幫助生成配置文件:https://webpack.jakoblind.no/https://generatewebpackconfig.netlify.com/

webpack配置說明

下面是使用一個樣例說明配置文件的使用

const webpack = require('webpack');
const path = require('path');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const LodashModuleReplacementPlugin = require('lodash-webpack-plugin');

const config = {
  // 程序的入口
  entry: './src/index.js',
  // 程序的輸出
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.vue$/, //文件匹配規(guī)則妻献,如果匹配,則使用loader中指定的loader
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader'
      },
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ]
      },
      {
        test: /\.png$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              mimetype: 'image/png'
            }
          }
        ]
      }
    ]
  },
  resolve: {
    extensions: [
      '.js',
      '.vue'
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new LodashModuleReplacementPlugin
  ]
}

module.exports = config;

從上面可以看出webpack嚴重依賴于loader虚婿,而且loader處理的規(guī)則需要參考具體loader的設計旋奢。

在webpack中使用css模塊

Css模塊在使用npm安裝后,可以直接使用import命令導入然痊。如安裝了weui的包至朗,在使用css類的地方可以直接使用js命令導入:

import from "weui"

Vue

Vue是表現(xiàn)層的框架,使用的方法是引入vue剧浸,定義Vue實例锹引,剩下的就是在實例中定義data數(shù)據(jù),而在html中使用標簽顯示要展示的數(shù)據(jù)唆香。顯示層的變量格式是{{ variableName }}嫌变。

Vue的生命周期

Vue Lifecycle

Vue的模板語法

Vue的模板信息是添加到html的元素中的(單純的值是Mustache語法),下面是匯總:

  • {{ varName }} : 單純獲取值躬它,varName可以使用單個js語句腾啥。
  • v-html:當成原始HTML輸出。<span v-html="rawHtml"></span>
  • <span v-if="seen">現(xiàn)在你看到我了</span>
  • <a v-bind:href="url">...</a>可以使用<a :href="url">..</a>代替(:是v-bind的縮寫)
  • <a v-on:click="doSomething">...</a>可以使用<a @click="doSomething">...</a>代替(@是v-on的縮寫)
  • v-model用于定義表單的輸入對應的變量冯吓。

Vue的值除了靜態(tài)的以外倘待,可以通過計算和方法獲取,計算屬性在Vue實例的computed屬性中定義组贺,里面定義的是function

var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 計算屬性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 實例
      return this.message.split('').reverse().join('')
    }
  }
})

Vue組件

Vue的組件與Vue的主實例類似凸舵,接收的選項也相同,下面是一個示例:

Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  props: ['title'],
  template: '<h3>{{ title }}</h3><button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

可以通過下面的html進行使用

<div id="components-demo">
  <button-counter title="Button1"></button-counter>
</div>  

注意:組件中的data是一個function失尖,而不是普通的屬性啊奄,是為了保證每個組件實例的變量獨立渐苏。

組件通過props屬性傳遞參數(shù),建議在props中傳遞Object菇夸,而非單個屬性琼富。對于大量數(shù)據(jù)的傳遞,推薦使用slot進行峻仇。組件的元素必須是單根的公黑,如下面的組件定義就是非法的:

<h3>{{ post.title }}</h3>
<div v-html="post.content"></div>
<div>{{ hugeContent }}</div>

需要通過單根元素包含:

<div class="blog-post">
  <h3>{{ post.title }}</h3>
  <div v-html="post.content"></div>
  <div><slot></slot></div>
</div>

組件可以通過$emit向父級組件觸發(fā)事件。

Vue可以動態(tài)切換組件摄咆,類似于java中reflection中的方式,內容比較多人断,參照https://cn.vuejs.org/v2/guide/components.html#動態(tài)組件

定義組件時吭从,名稱務必保證字母全小寫且必須包含一個連字符,這會幫助你避免和當前以及未來的 HTML 元素相沖突恶迈。

Vue.component注冊的組件是全局的涩金,可以局部注冊組件,但有較多限制暇仲。全局注冊的行為必須在根 Vue 實例 (通過 new Vue) 創(chuàng)建之前發(fā)生

props屬性傳遞參數(shù)可以設定參數(shù)的具體類型步做。

props: {
  title: String,
  likes: Number,
  isPublished: Boolean,
  commentIds: Array,
  author: Object
}

在一個JS文件中編寫不同的組件是很難維護的,因此提出了單文件組件的概念奈附,此文件包含html全度、JS和樣式內容,如下所示:

Vue文件組件

Vue文件組件和普通的js組件類似斥滤,包含template将鸵,script,style的內容佑颇。Vue文件組件在使用其他組件時有2中方式顶掉,一種是在全局(main.js)導入后使用,另外一種是在文件內部導入后使用挑胸,這是一種局部的導入方式痒筒。全局導入的方式適合在最終的項目中使用,局部導入的方式適合在組件開發(fā)時使用茬贵。

Vue工具

為了管理多文件組件簿透,以及和其他構建工具集成,Vue提供了cli闷沥,方便大家創(chuàng)建vue項目萎战。最新版的cli版本是3。Vue的cli工具有自己獨立的設計舆逃,自身使用插件的方式處理資源蚂维,原來webpack的處理邏輯被cli工具中的vue-cli-service包裝戳粒,可以認為vue的cli產生的項目使用常規(guī)方式比較難配置。新項目添加步驟如下

  1. 使用vue create創(chuàng)建基礎項目
  2. cd到項目目錄虫啥,執(zhí)行npm run serve可以發(fā)布項目做測試

后綴為vue的文件是vue的組件文件蔚约,在執(zhí)行vue-cli-service serve或vue-cli-service build時,cli插件自動將vue文件編譯成js代碼涂籽。

Vue-router

Vue-router是路由管理插件苹祟,目的是可以在一個頁面中可以自由的切換系統(tǒng)當前的組件。一個未使用router的項目中评雌,web請求的處理流程如下:


image.png

在這個處理過程中可以認為是Vue實例的獨立渲染树枫,為了方便管理多個視圖,vue-router有自己獨立的管理方式景东。


image.png

為了在vue中使用router砂轻,需要定義router,設定
import Router from 'vue-router'
import Dashboard from './views/Dashboard.vue'

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'Dashboard',
      component: Dashboard
    }
  ]
})

router中定義的路由需要使用<router-link to="xxx">的方式使用斤吐,<router-view></router-view>是路由渲染的位置搔涝。

JS語法(針對Java程序員)

基礎語法

變量:var xxx,未定義的變量值是undefined和措,變量可以刪除delete xxx

當您聲明新變量時庄呈,可以使用關鍵詞 "new" 來聲明其類型:如var carname=new String;

一條語句,多個變量使用逗號,分開

內置類型:Number,String,Array,Object(Key+Value),function派阱。使用typeof來獲取變量類型

分號用于分隔 JavaScript 語句诬留,行最后的分號可以不加分號。JavaScript 對大小寫是敏感的颁褂。反斜杠對代碼行進行換行

使用算術運算符計算值故响,使用=賦值。+-*

注釋使用//或/* */格式

對象屬性訪問:person.lastName; person["lastName"];

函數(shù)樣例:function functionname(arg1,arg2) { code; return 0; }

函數(shù)可以被賦予為變量颁独,可以調用變量

可以通過(){xxxx; return function(){}}()的方式閉包彩届。xxx中定義的變量只能在此方法內使用

JavaScript 函數(shù)有個內置的對象 arguments 對象,包含了函數(shù)調用的參數(shù)數(shù)組。

支持的語句:

  • if(condition){}else{}
  • switch
  • for, for in的語法中誓酒,變量的值是屬性或數(shù)組的索引
  • while, do {} while()
  • break & continue
  • throw樟蠕、try 和 catch。throw "xxxx"可以拋出異常靠柑。

"use strict"; 啟用嚴格模式下你不能使用未聲明的變量寨辩。

Javascript中沒有類的概念,如果需要定義新的類型歼冰,直接指定或者使用funtion定義靡狞。

保留字:

abstract else instanceof super
boolean enum int switch
break export interface synchronized
byte extends let this
case false long throw
catch final native throws
char finally new transient
class float null true
const for package try
continue function private typeof
debugger goto protected var
default if public void
delete implements return volatile
do import short while
double in static with

ES6

ES6中定義了class,盡量使用class定義

Module 語法是 JavaScript 模塊的標準寫法

import { func1, func2 } from 'moduleA';

使用const和let定義變量

ES6 新增了箭頭函數(shù)隔嫡。(參數(shù)1, 參數(shù)2, …, 參數(shù)N) => { 函數(shù)聲明 }甸怕。箭頭函數(shù)都沒有自己的 this

ES6 函數(shù)可以自帶參數(shù)甘穿,參數(shù)可以設定為指定值

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梢杭,隨后出現(xiàn)的幾起案子温兼,更是在濱河造成了極大的恐慌,老刑警劉巖武契,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件募判,死亡現(xiàn)場離奇詭異,居然都是意外死亡咒唆,警方通過查閱死者的電腦和手機届垫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钧排,“玉大人敦腔,你說我怎么就攤上這事『蘖铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵找前,是天一觀的道長糟袁。 經常有香客問我,道長躺盛,這世上最難降的妖魔是什么项戴? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮槽惫,結果婚禮上周叮,老公的妹妹穿的比我還像新娘。我一直安慰自己界斜,他們只是感情好仿耽,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著各薇,像睡著了一般项贺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峭判,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天开缎,我揣著相機與錄音,去河邊找鬼林螃。 笑死奕删,一個胖子當著我的面吹牛,可吹牛的內容都是我干的疗认。 我是一名探鬼主播完残,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伏钠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坏怪?” 一聲冷哼從身側響起贝润,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铝宵,沒想到半個月后打掘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡鹏秋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年尊蚁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣夷。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡横朋,死狀恐怖,靈堂內的尸體忽然破棺而出百拓,到底是詐尸還是另有隱情琴锭,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布衙传,位于F島的核電站决帖,受9級特大地震影響,放射性物質發(fā)生泄漏蓖捶。R本人自食惡果不足惜地回,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俊鱼。 院中可真熱鬧刻像,春花似錦、人聲如沸并闲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焙蚓。三九已至纹冤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間购公,已是汗流浹背萌京。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宏浩,地道東北人知残。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像比庄,于是被迫代替她去往敵國和親求妹。 傳聞我的和親對象是個殘疾皇子乏盐,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容

  • 1 Webpack 1.1 概念簡介 1.1.1 WebPack是什么 1、一個打包工具 2制恍、一個模塊加載工具 3...
    Kevin_Junbaozi閱讀 6,659評論 0 16
  • 薛明倫 焦點中級九期 焦作 堅持原創(chuàng)分享第148天 20180722 這次約練約到了F老師和Z老師父能,F(xiàn)老師做咨詢師...
    和顏悅色2018閱讀 212評論 0 1
  • 兒子緊皺眉頭,憤怒的走進房間喊道:“父親净神,飯快涼了何吝,你叫我去吃,現(xiàn)在飯已經涼了鹃唯,你怎么還不來爱榕?叫我,不應該你先出來...
    詸冰閱讀 145評論 0 1
  • 降低信任成本坡慌,是人與人交往溝通中最主要的追求黔酥。在商業(yè)世界,自身影響力的積累擴大洪橘,主要靠自身的職業(yè)化來獲得跪者。 君子不...
    大夢張吉玲閱讀 220評論 0 0
  • 1、感恩媽媽為全家人做安心早餐熄求,每個人都營養(yǎng)健康坑夯! 2、感恩先生教兒子跳繩抡四! 3、感恩兒子在外婆家不受干擾認真做好...
    普祥0502閱讀 140評論 0 0