創(chuàng)建并初始化項(xiàng)目
先創(chuàng)建項(xiàng)目文件夾
在項(xiàng)目中npm init初始化項(xiàng)目
建議node版本8以上,因?yàn)閼?yīng)用webpack4
webpack4除了要安裝webpack外還要安裝webpack-cli
npm i webpack webpack-cli -D
配置webpack
在項(xiàng)目文件中創(chuàng)建一個(gè)webpack.config.js來(lái)配置webpack。
module.exports = {
entry:'',//入口文件
output:{},//出口文件
module:{},//處理對(duì)應(yīng)模塊
plugins:[],//對(duì)應(yīng)插件
devServer:{},//開發(fā)服務(wù)器配置
mode:'development'//模式配置
}
配置開發(fā)服務(wù)器
要安裝webpack-dev-server
npm i webpack-dev-server -D

開始配置webpack

配置執(zhí)行文件
打包編譯時(shí)的一些快捷命令,需要在package.json腳本去執(zhí)行一下命令

npm run build就是我們打包后的文件,這是生產(chǎn)環(huán)境下,上線需要的文件
npm run dev是我們開發(fā)環(huán)境下打包的文件,當(dāng)然由于devServer幫我們把文件放到內(nèi)存中了,所以并不會(huì)輸出打包后的dist文件夾
實(shí)現(xiàn)html打包
js文件打包好了,但是我們不會(huì)在打包后的文件中創(chuàng)建html文件,所以需要html打包功能,可以用插件html-webpack-plugin實(shí)現(xiàn)打包出引用路徑的html
npm i html-webpack-plugin -D
webpack.config.js:
const path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry:'./src/index.js',//入口文件
output:{
filename:'bundle.js',//打包文件名
path:path.resolve('dist')//打包后的目錄,絕對(duì)路徑
},//出口文件
module:{},//處理對(duì)應(yīng)模塊
plugins:[
//通過(guò)new類來(lái)使用插件
new HtmlWebpackPlugin({
template:'./src/index.html',//在src目錄下創(chuàng)建一個(gè)index.html來(lái)充當(dāng)模板
hash:true//打包后的bundle.js后面會(huì)加上hash串
})
],//對(duì)應(yīng)插件
devServer:{},//開發(fā)服務(wù)器配置
mode:'development'//模式配置
}
創(chuàng)建src/index.html src/index.js
源文件可以隨便書寫

在index.js中書寫
console.log("lalalall")
使用npm run build打包
項(xiàng)目目錄增加了dist文件,文件下有index.html 和bundle.js

html文件中增加了script標(biāo)簽,src中增加了bundle.js

多html頁(yè)面的配置方法

引入css文件
先安裝css樣式的loader
npm i style-loader css-loader -D
npm i less less-loader -D
npm i node -sass sass-loader -D

隨后配置一下webpack
const path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry:{
index:'./src/index.js',
login:'./src/login.js'
},//入口文件
output:{
filename:'bundle.js',//打包文件名
path:path.resolve('dist')//打包后的目錄,絕對(duì)路徑
},//出口文件
module:{
rules:[
{
test:/\.css$/,//解析css
use:['style-loader','css-loader']//從右向左解析
/*
也可以
use:[
{loader:'style-loader'},
{loader:'css-loader'}
]
*/
}
]
},//處理對(duì)應(yīng)模塊
plugins:[
//通過(guò)new類來(lái)使用插件
new HtmlWebpackPlugin({
template:'./src/index.html',//在src目錄下創(chuàng)建一個(gè)index.html來(lái)充當(dāng)模板
filename:'index.html',
hash:true//打包后的bundle.js后面會(huì)加上hash串
}),
new HtmlWebpackPlugin({
template:'./src/index2.html',
filename:'login.html',
chunks:['login']//對(duì)應(yīng)關(guān)系 login.js對(duì)應(yīng)login.html
})
],//對(duì)應(yīng)插件
devServer:{},//開發(fā)服務(wù)器配置
mode:'development'//模式配置
}
拆分css
打包后的css文件以行內(nèi)樣式style標(biāo)簽寫入html頁(yè)面中,一般希望link的方式引入,extract-text-webpack-plugin插件它的功效就在于會(huì)將打包到j(luò)s里的css文件進(jìn)行一個(gè)拆分,單獨(dú)提取css.
//@next可以支持webpack4的插件
npm i extract-text-webpack-plugin@next -D
let ExtractTextWebpackPlugin = require('extract-text-webpack-plugin');
module:{
rules:[
{
test:/\.less$/,
use:ExtractTextWebpackPlugin.extract({
// 將css用link的方式引入就不再需要style-loader了
fallback:'style-loader',
use:['css-loader','less-loader']
})
},
{
test: /\.scss$/, // 解析scss
use: ExtractTextWebpackPlugin.extract({
// 將css用link的方式引入就不再需要style-loader了
fallback: "style-loader",
use: ['css-loader', 'sass-loader'] // 從右向左解析
})
},
{
test: /\.css$/, // 解析css
use: ExtractTextWebpackPlugin.extract({
// 將css用link的方式引入就不再需要style-loader了
fallback: "style-loader",
use: ['css-loader']
})
}
]
},//處理對(duì)應(yīng)模塊
plugins:[
//通過(guò)new類來(lái)使用插件
new HtmlWebpackPlugin({
template:'./src/index.html',//在src目錄下創(chuàng)建一個(gè)index.html來(lái)充當(dāng)模板
filename:'index.html',
hash:true//打包后的bundle.js后面會(huì)加上hash串
}),
new HtmlWebpackPlugin({
template:'./src/index2.html',
filename:'login.html',
chunks:['login']//對(duì)應(yīng)關(guān)系 login.js對(duì)應(yīng)login.html
}),
new ExtractTextWebpackPlugin('css/style.css')
],//對(duì)應(yīng)插件
在文件開頭、module和plugins中添加ExtractTextWebpackPlugin
引入圖片
npm i file-loader url-loader -D
module.exports = {
module: {
rules: [
{
test: /\.(jpe?g|png|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192, // 小于8k的圖片自動(dòng)轉(zhuǎn)成base64格式,并且不會(huì)存在實(shí)體圖片
outputPath: 'images/' // 圖片打包后存放的目錄
}
}
]
}
]
}
}
轉(zhuǎn)義ES6和react
既然搭建react腳手架,肯定要引入es6和react,先要安裝babel,我們?cè)诖罅康氖褂弥鳨S6及之后的api去寫代碼,這樣會(huì)提高我們寫代碼的速度,不過(guò)由于低版本瀏覽器的存在,不得不需要轉(zhuǎn)換成兼容的代碼,于是就有了常用的babel了
npm i babel-core babel-loader babel-preset-env babel-preset-stage-3 babel-preset-react babel-polyfill babel-plugin-import babel-loader babel-register -D
npm i react -D
npm i react-dom -D
babel-preset-stage-3 使用這個(gè)插件來(lái)編譯為了后面使用...state擴(kuò)展運(yùn)算符可以使用
如果要求babel-loader@7,可以:
npm install -D babel-loader@7 babel-core babel-preset-env webpack
若運(yùn)行后報(bào)錯(cuò) Error: Couldn't find preset "es2015" relative to directory
npm install --save-dev babel-preset-es2015 npm install --save-dev babel-cli
當(dāng)把這些都安好后,我們就開始配置,由于要兼容的代碼不僅僅包含ES6還有之后的版本和那些僅僅是草案的內(nèi)容,所以我們可以通過(guò)一個(gè).babelrc文件來(lái)配置一下,對(duì)這些版本的支持

{
"presets":[
[
"env",
{
"loose":true,
"modules":false
}
],
"es2015",
"react",
"babel-preset-stage-3"
]
}
然后在webpack中配置babel-loader,module的ruler中
{
test:/\.js$/,
use:'babel-loader',
include:/src/, //只轉(zhuǎn)化src目錄下的js
exclude:/node_modules/ //排除node_modules里的js。優(yōu)化打包速度
}
加入babel-polyfill
babel-polyfill的使用原因babel只轉(zhuǎn)換js語(yǔ)法,而不轉(zhuǎn)換新的API,比如Iterator,Set,Generator,Maps,Proxy,Promise等全局對(duì)象,以及一些定義在全局對(duì)象上的方法Array.from都不轉(zhuǎn)碼,需要使用babel-polyfill。
npm install --save-dev babel-polyfill
// 修改入口文件index.js
import 'babel-polyfill';
所以應(yīng)該在每次打包之前將dist目錄下的文件都清空,然后再把打好包的文件放進(jìn)去,可以使用clean-webpack-plugin這個(gè)插件進(jìn)行清空。
npm i clean-webpack-plugin -D
配置webpack
let CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
plugins: [
// 打包前先清空
new CleanWebpackPlugin('dist')
]
}
配置resolve
webpack在啟動(dòng)后會(huì)從配置的入口模塊觸發(fā)找出所有依賴的模塊,通過(guò)別名來(lái)把原來(lái)導(dǎo)入路徑映射成一個(gè)新的導(dǎo)入路徑,在導(dǎo)入語(yǔ)句沒(méi)帶文件后綴時(shí),webpack會(huì)自動(dòng)帶上后綴去嘗試訪問(wèn)文件是否存在。resolve.extensions用于配置在嘗試過(guò)程中用到的后綴列表,
resolve: {
// 別名
alias: {
pages:path.join(__dirname,'src/pages'),
component:path.join(__dirname,'src/component'),
actions:path.join(__dirname,'src/redux/actions'),
reducers:path.join(__dirname,'src/redux/reducers'),
},
// 省略后綴
extensions: ['.js', '.jsx', '.json', '.css', '.scss', '.less']
}
webpack-dev-server
webpack-dev-server為webpack打包生成的資源文件提供web服務(wù)。
npm install webpack-dev-server --save-dev
npm install webpack-dev-server -g
設(shè)置devServer
devServer:{
port:3000, //端口
open:true, //自動(dòng)打開瀏覽器
hot:true, //開啟熱更新
overlay:true, //瀏覽器頁(yè)面上的顯示錯(cuò)誤
historyApiFallback:true
},//開發(fā)服務(wù)器配置
devtool調(diào)試
devtool: 'inline-source-map'
熱更新和自動(dòng)刷新
配置devServer時(shí),hot為true,代表開啟熱更新,此外還需要配置webpack自帶的插件new webpack.HotModuleReplacementPlugin()
// webpack.config.js
let webpack = require('webpack');
module.exports = {
plugins: [
// 熱更新,熱更新不是刷新
new webpack.HotModuleReplacementPlugin()
],
devServer: {
hot: true, // 加上這一行
}
}
// 在入口文件index.js
// 還需要在主要的js文件里寫入下面這段代碼
if (module.hot) {
// 實(shí)現(xiàn)熱更新
module.hot.accept();
}
react-router
npm install --save-dev react-router-dom
新建router文件夾和組件
cd src
mkdir router && touch router/router.js
按照文檔編輯一個(gè)最基本的router.js,包含兩個(gè)頁(yè)面home page
src/pages/Home/index.js
import React, {Component} from 'react';
export default class Home extends Component {
render() {
return (
<div>
this is home ~hi xht
</div>
)
}
}
src/pages/Page/index.js
import React, {Component} from 'react';
export default class Page1 extends Component {
render() {
return (
<div>
this is Page1~hi xht
</div>
)
}
}
再修改src/index.js
import React from 'react';
import ReactDom from 'react-dom';
import getRouter from './router/router';
ReactDom.render(
getRouter(), document.getElementById('root'));
可以執(zhí)行打包命令npm run dev。查看效果啦,頁(yè)面會(huì)自動(dòng)打開。
react-redux
先安裝redux,關(guān)于redux學(xué)習(xí)可以看中文文檔
eslint
eslint目標(biāo)是以可擴(kuò)展,每條規(guī)則獨(dú)立,不內(nèi)置編碼風(fēng)格為理念的lint工具,用戶可以定制自己的規(guī)則做成公共包
先安裝
npm install -D eslint eslint-config-airbnb eslint-loader eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react
配置.eslinrc文件
// 直接繼承airbnb的配置規(guī)則,同時(shí)也可以寫入自己的特定規(guī)則
{
//extends是指定的規(guī)范
"extends": ["airbnb"],
//指定宿主環(huán)境,可以使用宿主的全局變量和屬性
"env": {
"browser": true,
"node": true,
"es6": true,
"mocha": true,
"jest": true,
"jasmine": true
}
// JavaScript 語(yǔ)言選項(xiàng)
"parserOptions": {
// ECMAScript 版本
"ecmaVersion": 6,
"sourceType": "module", //設(shè)置為 "script" (默認(rèn)) 或 "module"(如果你的代碼是 ECMAScript 模塊)。
//想使用的額外的語(yǔ)言特性:
"ecmaFeatures": {
// 允許在全局作用域下使用 return 語(yǔ)句
"globalReturn": true,
// impliedStric
"impliedStrict": true,
// 啟用 JSX
"jsx": true,
"modules": true
}
},
//rules 啟用額外的規(guī)則或覆蓋默認(rèn)的規(guī)則
"rules": {
// 禁止使用一元操作符 ++ 和 --
"no-plusplus": [0],
// 使用 === 替代 == allow-null允許null和undefined==
//"eqeqeq": [2, "allow-null"],
"eqeqeq": [0],
// 禁止空語(yǔ)句塊
"no-empty": [0],
//不允許對(duì) function 的參數(shù)進(jìn)行重新賦值
"no-param-reassign": [0],
//生成器函數(shù)*的前后空格
"generator-star-spacing": [0],
// 要求 return 語(yǔ)句要么總是指定返回的值,要么不指定
"consistent-return": [0],
// 禁止 var 聲明 與外層作用域的變量同名
"no-shadow": [0],
//禁止某些propTypes
"react/forbid-prop-types": [0],
"react/jsx-filename-extension": [
1,
{
"extensions": [".js"]
}
],
"react/button-has-type": [
"<enabled>",
{
"button": false,
"submit": false,
"reset": false
}
],
"global-require": [1],
"import/prefer-default-export": [0],
"react/jsx-boolean-value": [0],
"react/jsx-no-bind": [0],
"react/prop-types": [0],
"react/prefer-stateless-function": [0],
"react/jsx-one-expression-per-line": [0],
"react/jsx-wrap-multilines": [
"error",
{
"no-empty": [0],
"no-param-reassign": [0],
"declaration": "parens-new-line",
"assignment": "parens-new-line",
"return": "parens-new-line",
"arrow": "parens-new-line",
"condition": "parens-new-line",
"logical": "parens-new-line",
"prop": "ignore"
}
],
"no-else-return": [0],
"no-restricted-syntax": [0],
"import/no-extraneous-dependencies": [0],
"no-use-before-define": [0],
"jsx-a11y/no-static-element-interactions": [0],
"jsx-a11y/no-noninteractive-element-interactions": [0],
"jsx-a11y/click-events-have-key-events": [0],
"jsx-a11y/anchor-is-valid": [0],
"no-nested-ternary": [0],
"arrow-body-style": [0],
"import/extensions": [0],
"no-bitwise": [0],
"no-cond-assign": [0],
"import/no-unresolved": [0],
"comma-dangle": [
"error",
{
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "ignore"
}
],
"object-curly-newline": [0],
"function-paren-newline": [0],
"no-restricted-globals": [0],
"require-yield": [1]
},
"globals": {
"document": true,
"localStorage": true,
"window": true
}
}
除此之外還要在webpack.config.js文件增加module的loader
module: {
rules: [
{
enforce: "pre", // 代表在解析loader之前就先解析eslint-loader
test: /\.js$/,
exclude: /node_modules/,
include:/src/,
loader: "eslint-loader",
},
]
}
在pagekage.json文件里面script增加
"lint": "npm run format && npm run fix && eslint --ext .js src", // 檢測(cè)你寫的代碼是否符合eslint的規(guī)則
"fix": "npm run format && eslint --fix --ext .js src", // npm run fix 這個(gè)是可以修復(fù)你沒(méi)有按照l(shuí)int規(guī)則的寫法
自動(dòng)格式化
npm install prettier -D
在package.json的script里面添加如下配置
{
"scripts": {
"format": "prettier --single-quote --trailing-comma es5 --write \"src/**/*.js\""
}
}
可以通過(guò) npm run format試一下是否可以自動(dòng)格式化你的代碼,
然后添加git鉤子
Git 倉(cāng)庫(kù)中特定事件(certain points)觸發(fā)后被調(diào)用的腳本。 每次提交代碼,執(zhí)行 git commit之后進(jìn)行自動(dòng)格式化,免去每次人為手動(dòng)格式化,使遠(yuǎn)程倉(cāng)庫(kù)代碼保持風(fēng)格統(tǒng)一。
npm install -D lint-staged husky
在package.json的scripts里添加如下
"precommit": "npm run lint",
eslint的rule
// 禁止條件表達(dá)式中出現(xiàn)賦值操作符
"no-cond-assign": 2,
// 禁用 console
"no-console": 0,
// 禁止在條件中使用常量表達(dá)式
// if (false) {
// doSomethingUnfinished();
// } //cuowu
"no-constant-condition": 2,
// 禁止在正則表達(dá)式中使用控制字符 :new RegExp("\x1f")
"no-control-regex": 2,
// 數(shù)組和對(duì)象鍵值對(duì)最后一個(gè)逗號(hào), never參數(shù):不能帶末尾的逗號(hào), always參數(shù):必須帶末尾的逗號(hào),
// always-multiline:多行模式必須帶逗號(hào),單行模式不能帶逗號(hào)
"comma-dangle": [1, "never"],
// 禁用 debugger
"no-debugger": 2,
// 禁止 function 定義中出現(xiàn)重名參數(shù)
"no-dupe-args": 2,
// 禁止對(duì)象字面量中出現(xiàn)重復(fù)的 key
"no-dupe-keys": 2,
// 禁止重復(fù)的 case 標(biāo)簽
"no-duplicate-case": 2,
// 禁止空語(yǔ)句塊
"no-empty": 2,
// 禁止在正則表達(dá)式中使用空字符集 (/^abc[]/)
"no-empty-character-class": 2,
// 禁止對(duì) catch 子句的參數(shù)重新賦值
"no-ex-assign": 2,
// 禁止不必要的布爾轉(zhuǎn)換
"no-extra-boolean-cast": 2,
// 禁止不必要的括號(hào) //(a * b) + c;//報(bào)錯(cuò)
"no-extra-parens": 0,
// 禁止不必要的分號(hào)
"no-extra-semi": 2,
// 禁止對(duì) function 聲明重新賦值
"no-func-assign": 2,
// 禁止在嵌套的塊中出現(xiàn) function 或 var 聲明
"no-inner-declarations": [2, "functions"],
// 禁止 RegExp 構(gòu)造函數(shù)中無(wú)效的正則表達(dá)式字符串
"no-invalid-regexp": 2,
// 禁止在字符串和注釋之外不規(guī)則的空白
"no-irregular-whitespace": 2,
// 禁止在 in 表達(dá)式中出現(xiàn)否定的左操作數(shù)
"no-negated-in-lhs": 2,
// 禁止把全局對(duì)象 (Math 和 JSON) 作為函數(shù)調(diào)用 錯(cuò)誤:var math = Math();
"no-obj-calls": 2,
// 禁止直接使用 Object.prototypes 的內(nèi)置屬性
"no-prototype-builtins": 0,
// 禁止正則表達(dá)式字面量中出現(xiàn)多個(gè)空格
"no-regex-spaces": 2,
// 禁用稀疏數(shù)組
"no-sparse-arrays": 2,
// 禁止出現(xiàn)令人困惑的多行表達(dá)式
"no-unexpected-multiline": 2,
// 禁止在return、throw、continue 和 break語(yǔ)句之后出現(xiàn)不可達(dá)代碼
"no-unreachable": 2,
// 要求使用 isNaN() 檢查 NaN
"use-isnan": 2,
// 強(qiáng)制使用有效的 JSDoc 注釋
"valid-jsdoc": 1,
// 強(qiáng)制 typeof 表達(dá)式與有效的字符串進(jìn)行比較
// typeof foo === "undefimed" 錯(cuò)誤
"valid-typeof": 2,
//////////////
// 最佳實(shí)踐 //
//////////////
// 定義對(duì)象的set存取器屬性時(shí),強(qiáng)制定義get
"accessor-pairs": 2,
// 強(qiáng)制數(shù)組方法的回調(diào)函數(shù)中有 return 語(yǔ)句
"array-callback-return": 0,
// 強(qiáng)制把變量的使用限制在其定義的作用域范圍內(nèi)
"block-scoped-var": 0,
// 限制圈復(fù)雜度,也就是類似if else能連續(xù)接多少個(gè)
"complexity": [2, 9],
// 要求 return 語(yǔ)句要么總是指定返回的值,要么不指定
"consistent-return": 0,
// 強(qiáng)制所有控制語(yǔ)句使用一致的括號(hào)風(fēng)格
"curly": [2, "all"],
// switch 語(yǔ)句強(qiáng)制 default 分支,也可添加 // no default 注釋取消此次警告
"default-case": 2,
// 強(qiáng)制object.key 中 . 的位置,參數(shù):
// property,'.'號(hào)應(yīng)與屬性在同一行
// object, '.' 號(hào)應(yīng)與對(duì)象名在同一行
"dot-location": [2, "property"],
// 強(qiáng)制使用.號(hào)取屬性
// 參數(shù): allowKeywords:true 使用保留字做屬性名時(shí),只能使用.方式取屬性
// false 使用保留字做屬性名時(shí), 只能使用[]方式取屬性 e.g [2, {"allowKeywords": false}]
// allowPattern: 當(dāng)屬性名匹配提供的正則表達(dá)式時(shí),允許使用[]方式取值,否則只能用.號(hào)取值 e.g [2, {"allowPattern": "^[a-z]+(_[a-z]+)+$"}]
"dot-notation": [2, {
"allowKeywords": false
}],
// 使用 === 替代 == allow-null允許null和undefined==
"eqeqeq": [2, "allow-null"],
// 要求 for-in 循環(huán)中有一個(gè) if 語(yǔ)句
"guard-for-in": 2,
// 禁用 alert、confirm 和 prompt
"no-alert": 0,
// 禁用 arguments.caller 或 arguments.callee
"no-caller": 2,
// 不允許在 case 子句中使用詞法聲明
"no-case-declarations": 2,
// 禁止除法操作符顯式的出現(xiàn)在正則表達(dá)式開始的位置
"no-div-regex": 2,
// 禁止 if 語(yǔ)句中有 return 之后有 else
"no-else-return": 0,
// 禁止出現(xiàn)空函數(shù).如果一個(gè)函數(shù)包含了一條注釋,它將不會(huì)被認(rèn)為有問(wèn)題。
"no-empty-function": 2,
// 禁止使用空解構(gòu)模式no-empty-pattern
"no-empty-pattern": 2,
// 禁止在沒(méi)有類型檢查操作符的情況下與 null 進(jìn)行比較
"no-eq-null": 1,
// 禁用 eval()
"no-eval": 2,
// 禁止擴(kuò)展原生類型
"no-extend-native": 2,
// 禁止不必要的 .bind() 調(diào)用
"no-extra-bind": 2,
// 禁用不必要的標(biāo)簽
"no-extra-label:": 0,
// 禁止 case 語(yǔ)句落空
"no-fallthrough": 2,
// 禁止數(shù)字字面量中使用前導(dǎo)和末尾小數(shù)點(diǎn)
"no-floating-decimal": 2,
// 禁止使用短符號(hào)進(jìn)行類型轉(zhuǎn)換(!!fOO)
"no-implicit-coercion": 0,
// 禁止在全局范圍內(nèi)使用 var 和命名的 function 聲明
"no-implicit-globals": 1,
// 禁止使用類似 eval() 的方法
"no-implied-eval": 2,
// 禁止 this 關(guān)鍵字出現(xiàn)在類和類對(duì)象之外
"no-invalid-this": 0,
// 禁用 __iterator__ 屬性
"no-iterator": 2,
// 禁用標(biāo)簽語(yǔ)句
"no-labels": 2,
// 禁用不必要的嵌套塊
"no-lone-blocks": 2,
// 禁止在循環(huán)中出現(xiàn) function 聲明和表達(dá)式
"no-loop-func": 1,
// 禁用魔術(shù)數(shù)字(3.14什么的用常量代替)
"no-magic-numbers": [1, {
"ignore": [0, -1, 1]
}],
// 禁止使用多個(gè)空格
"no-multi-spaces": 2,
// 禁止使用多行字符串,在 JavaScript 中,可以在新行之前使用斜線創(chuàng)建多行字符串
"no-multi-str": 2,
// 禁止對(duì)原生對(duì)象賦值
"no-native-reassign": 2,
// 禁止在非賦值或條件語(yǔ)句中使用 new 操作符
"no-new": 2,
// 禁止對(duì) Function 對(duì)象使用 new 操作符
"no-new-func": 0,
// 禁止對(duì) String,Number 和 Boolean 使用 new 操作符
"no-new-wrappers": 2,
// 禁用八進(jìn)制字面量
"no-octal": 2,
// 禁止在字符串中使用八進(jìn)制轉(zhuǎn)義序列
"no-octal-escape": 2,
// 不允許對(duì) function 的參數(shù)進(jìn)行重新賦值
"no-param-reassign": 0,
// 禁用 __proto__ 屬性
"no-proto": 2,
// 禁止使用 var 多次聲明同一變量
"no-redeclare": 2,
// 禁用指定的通過(guò) require 加載的模塊
"no-return-assign": 0,
// 禁止使用 javascript: url
"no-script-url": 0,
// 禁止自我賦值
"no-self-assign": 2,
// 禁止自身比較
"no-self-compare": 2,
// 禁用逗號(hào)操作符
"no-sequences": 2,
// 禁止拋出非異常字面量
"no-throw-literal": 2,
// 禁用一成不變的循環(huán)條件
"no-unmodified-loop-condition": 2,
// 禁止出現(xiàn)未使用過(guò)的表達(dá)式
"no-unused-expressions": 0,
// 禁用未使用過(guò)的標(biāo)簽
"no-unused-labels": 2,
// 禁止不必要的 .call() 和 .apply()
"no-useless-call": 2,
// 禁止不必要的字符串字面量或模板字面量的連接
"no-useless-concat": 2,
// 禁用不必要的轉(zhuǎn)義字符
"no-useless-escape": 0,
// 禁用 void 操作符
"no-void": 0,
// 禁止在注釋中使用特定的警告術(shù)語(yǔ)
"no-warning-comments": 0,
// 禁用 with 語(yǔ)句
"no-with": 2,
// 強(qiáng)制在parseInt()使用基數(shù)參數(shù)
"radix": 2,
// 要求所有的 var 聲明出現(xiàn)在它們所在的作用域頂部
"vars-on-top": 0,
// 要求 IIFE 使用括號(hào)括起來(lái)
"wrap-iife": [2, "any"],
// 要求或禁止 “Yoda” 條件
"yoda": [2, "never"],
// 要求或禁止使用嚴(yán)格模式指令
"strict": 0,
//////////////
// 變量聲明 //
//////////////
// 要求或禁止 var 聲明中的初始化(初值)
"init-declarations": 0,
// 不允許 catch 子句的參數(shù)與外層作用域中的變量同名
"no-catch-shadow": 0,
// 禁止刪除變量
"no-delete-var": 2,
// 不允許標(biāo)簽與變量同名
"no-label-var": 2,
// 禁用特定的全局變量
"no-restricted-globals": 0,
// 禁止 var 聲明 與外層作用域的變量同名
"no-shadow": 0,
// 禁止覆蓋受限制的標(biāo)識(shí)符
"no-shadow-restricted-names": 2,
// 禁用未聲明的變量,除非它們?cè)?/*global */ 注釋中被提到
"no-undef": 2,
// 禁止將變量初始化為 undefined
"no-undef-init": 2,
// 禁止將 undefined 作為標(biāo)識(shí)符
"no-undefined": 0,
// 禁止出現(xiàn)未使用過(guò)的變量
"no-unused-vars": [2, {
"vars": "all",
"args": "none"
}],
// 不允許在變量定義之前使用它們
"no-use-before-define": 0,
//////////////////////////
// Node.js and CommonJS //
//////////////////////////
// require return statements after callbacks
"callback-return": 0,
// 要求 require() 出現(xiàn)在頂層模塊作用域中
"global-require": 1,
// 要求回調(diào)函數(shù)中有容錯(cuò)處理
"handle-callback-err": [2, "^(err|error)$"],
// 禁止混合常規(guī) var 聲明和 require 調(diào)用
"no-mixed-requires": 0,
// 禁止調(diào)用 require 時(shí)使用 new 操作符
"no-new-require": 2,
// 禁止對(duì) __dirname 和 __filename進(jìn)行字符串連接
"no-path-concat": 0,
// 禁用 process.env
"no-process-env": 0,
// 禁用 process.exit()
"no-process-exit": 0,
// 禁用同步方法
"no-sync": 0,
//////////////
// 風(fēng)格指南 //
//////////////
// 指定數(shù)組的元素之間要以空格隔開(, 后面), never參數(shù):[ 之前和 ] 之后不能帶空格,always參數(shù):[ 之前和 ] 之后必須帶空格
"array-bracket-spacing": [2, "never"],
// 禁止或強(qiáng)制在單行代碼塊中使用空格(禁用)
"block-spacing": [1, "never"],
//強(qiáng)制使用一致的縮進(jìn) 第二個(gè)參數(shù)為 "tab" 時(shí),會(huì)使用tab,
// if while function 后面的{必須與if在同一行,java風(fēng)格。
"brace-style": [2, "1tbs", {
"allowSingleLine": true
}],
// 雙峰駝命名格式
"camelcase": 2,
// 控制逗號(hào)前后的空格
"comma-spacing": [2, {
"before": false,
"after": true
}],
// 控制逗號(hào)在行尾出現(xiàn)還是在行首出現(xiàn) (默認(rèn)行尾)
// http://eslint.org/docs/rules/comma-style
"comma-style": [2, "last"],
//"SwitchCase" (默認(rèn):0) 強(qiáng)制 switch 語(yǔ)句中的 case 子句的縮進(jìn)水平
// 以方括號(hào)取對(duì)象屬性時(shí),[ 后面和 ] 前面是否需要空格, 可選參數(shù) never, always
"computed-property-spacing": [2, "never"],
// 用于指統(tǒng)一在回調(diào)函數(shù)中指向this的變量名,箭頭函數(shù)中的this已經(jīng)可以指向外層調(diào)用者,應(yīng)該沒(méi)卵用了
// e.g [0,"that"] 指定只能 var that = this. that不能指向其他任何值,this也不能賦值給that以外的其他值
"consistent-this": [1, "that"],
// 強(qiáng)制使用命名的 function 表達(dá)式
"func-names": 0,
// 文件末尾強(qiáng)制換行
"eol-last": 2,
"indent": [2, 4, {
"SwitchCase": 1
}],
// 強(qiáng)制在對(duì)象字面量的屬性中鍵和值之間使用一致的間距
"key-spacing": [2, {
"beforeColon": false,
"afterColon": true
}],
// 強(qiáng)制使用一致的換行風(fēng)格
"linebreak-style": [1, "unix"],
// 要求在注釋周圍有空行 ( 要求在塊級(jí)注釋之前有一空行)
"lines-around-comment": [1, {
"beforeBlockComment": true
}],
// 強(qiáng)制一致地使用函數(shù)聲明或函數(shù)表達(dá)式,方法定義風(fēng)格,參數(shù):
// declaration: 強(qiáng)制使用方法聲明的方式,function f(){} e.g [2, "declaration"]
// expression:強(qiáng)制使用方法表達(dá)式的方式,var f = function() {} e.g [2, "expression"]
// allowArrowFunctions: declaration風(fēng)格中允許箭頭函數(shù)。 e.g [2, "declaration", { "allowArrowFunctions": true }]
"func-style": 0,
// 強(qiáng)制回調(diào)函數(shù)最大嵌套深度 5層
"max-nested-callbacks": [1, 5],
// 禁止使用指定的標(biāo)識(shí)符
"id-blacklist": 0,
// 強(qiáng)制標(biāo)識(shí)符的最新和最大長(zhǎng)度
"id-length": 0,
// 要求標(biāo)識(shí)符匹配一個(gè)指定的正則表達(dá)式
"id-match": 0,
// 強(qiáng)制在 JSX 屬性中一致地使用雙引號(hào)或單引號(hào)
"jsx-quotes": 0,
// 強(qiáng)制在關(guān)鍵字前后使用一致的空格 (前后腰需要)
"keyword-spacing": 2,
// 強(qiáng)制一行的最大長(zhǎng)度
"max-len": [1, 200],
// 強(qiáng)制最大行數(shù)
"max-lines": 0,
// 強(qiáng)制 function 定義中最多允許的參數(shù)數(shù)量
"max-params": [1, 7],
// 強(qiáng)制 function 塊最多允許的的語(yǔ)句數(shù)量
"max-statements": [1, 200],
// 強(qiáng)制每一行中所允許的最大語(yǔ)句數(shù)量
"max-statements-per-line": 0,
// 要求構(gòu)造函數(shù)首字母大寫 (要求調(diào)用 new 操作符時(shí)有首字母大小的函數(shù),允許調(diào)用首字母大寫的函數(shù)時(shí)沒(méi)有 new 操作符。)
"new-cap": [2, {
"newIsCap": true,
"capIsNew": false
}],
// 要求調(diào)用無(wú)參構(gòu)造函數(shù)時(shí)有圓括號(hào)
"new-parens": 2,
// 要求或禁止 var 聲明語(yǔ)句后有一行空行
"newline-after-var": 0,
// 禁止使用 Array 構(gòu)造函數(shù)
"no-array-constructor": 2,
// 禁用按位運(yùn)算符
"no-bitwise": 0,
// 要求 return 語(yǔ)句之前有一空行
"newline-before-return": 0,
// 要求方法鏈中每個(gè)調(diào)用都有一個(gè)換行符
"newline-per-chained-call": 1,
// 禁用 continue 語(yǔ)句
"no-continue": 0,
// 禁止在代碼行后使用內(nèi)聯(lián)注釋
"no-inline-comments": 0,
// 禁止 if 作為唯一的語(yǔ)句出現(xiàn)在 else 語(yǔ)句中
"no-lonely-if": 0,
// 禁止混合使用不同的操作符
"no-mixed-operators": 0,
// 不允許空格和 tab 混合縮進(jìn)
"no-mixed-spaces-and-tabs": 2,
// 不允許多個(gè)空行
"no-multiple-empty-lines": [2, {
"max": 2
}],
// 不允許否定的表達(dá)式
"no-negated-condition": 0,
// 不允許使用嵌套的三元表達(dá)式
"no-nested-ternary": 0,
// 禁止使用 Object 的構(gòu)造函數(shù)
"no-new-object": 2,
// 禁止使用一元操作符 ++ 和 --
"no-plusplus": 0,
// 禁止使用特定的語(yǔ)法
"no-restricted-syntax": 0,
// 禁止 function 標(biāo)識(shí)符和括號(hào)之間出現(xiàn)空格
"no-spaced-func": 2,
// 不允許使用三元操作符
"no-ternary": 0,
// 禁用行尾空格
"no-trailing-spaces": 2,
// 禁止標(biāo)識(shí)符中有懸空下劃線_bar
"no-underscore-dangle": 0,
// 禁止可以在有更簡(jiǎn)單的可替代的表達(dá)式時(shí)使用三元操作符
"no-unneeded-ternary": 2,
// 禁止屬性前有空白
"no-whitespace-before-property": 0,
// 強(qiáng)制花括號(hào)內(nèi)換行符的一致性
"object-curly-newline": 0,
// 強(qiáng)制在花括號(hào)中使用一致的空格
"object-curly-spacing": 0,
// 強(qiáng)制將對(duì)象的屬性放在不同的行上
"object-property-newline": 0,
// 強(qiáng)制函數(shù)中的變量要么一起聲明要么分開聲明
"one-var": [2, {
"initialized": "never"
}],
// 要求或禁止在 var 聲明周圍換行
"one-var-declaration-per-line": 0,
// 要求或禁止在可能的情況下要求使用簡(jiǎn)化的賦值操作符
"operator-assignment": 0,
// 強(qiáng)制操作符使用一致的換行符
"operator-linebreak": [2, "after", {
"overrides": {
"?": "before",
":": "before"
}
}],
// 要求或禁止塊內(nèi)填充
"padded-blocks": 0,
// 要求對(duì)象字面量屬性名稱用引號(hào)括起來(lái)
"quote-props": 0,
// 強(qiáng)制使用一致的反勾號(hào)、雙引號(hào)或單引號(hào)
"quotes": [2, "double", "avoid-escape"],
// 要求使用 JSDoc 注釋
"require-jsdoc": 1,
// 要求或禁止使用分號(hào)而不是 ASI(這個(gè)才是控制行尾部分號(hào)的,)
"semi": [2, "always"],
// 強(qiáng)制分號(hào)之前和之后使用一致的空格
"semi-spacing": 0,
// 要求同一個(gè)聲明塊中的變量按順序排列
"sort-vars": 0,
// 強(qiáng)制在塊之前使用一致的空格
"space-before-blocks": [2, "always"],
// 強(qiáng)制在 function的左括號(hào)之前使用一致的空格
"space-before-function-paren": [0, "always"],
// 強(qiáng)制在圓括號(hào)內(nèi)使用一致的空格
"space-in-parens": [2, "never"],
// 要求操作符周圍有空格
"space-infix-ops": 2,
// 強(qiáng)制在一元操作符前后使用一致的空格
"space-unary-ops": [2, {
"words": true,
"nonwords": false
}],
// 強(qiáng)制在注釋中 // 或 /* 使用一致的空格
"spaced-comment": [2, "always", {
"markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!"]
}],
// 要求或禁止 Unicode BOM
"unicode-bom": 0,
// 要求正則表達(dá)式被括號(hào)括起來(lái)
"wrap-regex": 0,
//////////////
// ES6.相關(guān) //
//////////////
// 要求箭頭函數(shù)體使用大括號(hào)
"arrow-body-style": 2,
// 要求箭頭函數(shù)的參數(shù)使用圓括號(hào)
"arrow-parens": 2,
"arrow-spacing": [2, {
"before": true,
"after": true
}],
// 強(qiáng)制在子類構(gòu)造函數(shù)中用super()調(diào)用父類構(gòu)造函數(shù),TypeScrip的編譯器也會(huì)提示
"constructor-super": 0,
// 強(qiáng)制 generator 函數(shù)中 * 號(hào)周圍使用一致的空格
"generator-star-spacing": [2, {
"before": true,
"after": true
}],
// 禁止修改類聲明的變量
"no-class-assign": 2,
// 不允許箭頭功能,在那里他們可以混淆的比較
"no-confusing-arrow": 0,
// 禁止修改 const 聲明的變量
"no-const-assign": 2,
// 禁止類成員中出現(xiàn)重復(fù)的名稱
"no-dupe-class-members": 2,
// 不允許復(fù)制模塊的進(jìn)口
"no-duplicate-imports": 0,
// 禁止 Symbol 的構(gòu)造函數(shù)
"no-new-symbol": 2,
// 允許指定模塊加載時(shí)的進(jìn)口
"no-restricted-imports": 0,
// 禁止在構(gòu)造函數(shù)中,在調(diào)用 super() 之前使用 this 或 super
"no-this-before-super": 2,
// 禁止不必要的計(jì)算性能鍵對(duì)象的文字
"no-useless-computed-key": 0,
// 要求使用 let 或 const 而不是 var
"no-var": 0,
// 要求或禁止對(duì)象字面量中方法和屬性使用簡(jiǎn)寫語(yǔ)法
"object-shorthand": 0,
// 要求使用箭頭函數(shù)作為回調(diào)
"prefer-arrow-callback": 0,
// 要求使用 const 聲明那些聲明后不再被修改的變量
"prefer-const": 0,
// 要求在合適的地方使用 Reflect 方法
"prefer-reflect": 0,
// 要求使用擴(kuò)展運(yùn)算符而非 .apply()
"prefer-spread": 0,
// 要求使用模板字面量而非字符串連接
"prefer-template": 0,
// Suggest using the rest parameters instead of arguments
"prefer-rest-params": 0,
// 要求generator 函數(shù)內(nèi)有 yield
"require-yield": 0,
// enforce spacing between rest and spread operators and their expressions
"rest-spread-spacing": 0,
// 強(qiáng)制模塊內(nèi)的 import 排序
"sort-imports": 0,
// 要求或禁止模板字符串中的嵌入表達(dá)式周圍空格的使用
"template-curly-spacing": 1,
// 強(qiáng)制在 yield* 表達(dá)式中 * 周圍使用空格
"yield-star-spacing": 2
}
}