webpack4搭建react腳手架

創(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
image.png

開始配置webpack

webpack.config.js

配置執(zhí)行文件

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


package.json

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.html

在index.js中書寫 console.log("lalalall")

使用npm run build打包

項(xiàng)目目錄增加了dist文件,文件下有index.html 和bundle.js


項(xiàng)目目錄

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


dist/index.html

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

webpack.config.js

引入css文件

先安裝css樣式的loader

npm i style-loader css-loader -D
npm i less less-loader -D
npm i node -sass sass-loader -D
package.json

隨后配置一下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ì)這些版本的支持

目錄結(jié)構(gòu)

{
    "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
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容