主頁 > 企業開發 > 如何用webpack搭建vue專案?本文案例詳解

如何用webpack搭建vue專案?本文案例詳解

2020-09-18 12:31:32 企業開發

 

前言:都2020年了,感覺是時候該學一波webpack了,趁著最近有時間,就學了一下,等把官網上的webpack結構和模塊大概看了一遍之后,就感覺可以開始搭個專案實戰一下了,從0開始,一步步記錄下來

使用版本: webpack4.x

1.包含插件和loader

* html:    
  html-webpack-plugin clean-webpack-plugin

* css:    
  style-loader css-loader sass-loader node-sass postcss-loader autoprefixer

* js:      
  babel-loader @babel/preset-env @babel/core @babel/polyfill core-js@2 @babel/plugin-transform-runtime
  @babel/runtime  @babel/runtime-corejs2

* vue:     
  vue-loader vue-template-compiler vue-style-loader vue vue-router axios vuex

* webpack: 

  file-loader url-loader webpack-dev-server webpack-merge copy-webpack-plugin happypack HardSourceWebpackPlugin 
  webpack-bundle-analyzer optimize-css-assets-webpack-plugin  portfinder  FriendlyErrorsPlugin
另外要注意 :光理論是不夠的,在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦

2.webpack功能

-- 生成hmtl模板
-- 洗掉上一次的dist檔案
-- 自動添加瀏覽器前綴
-- 使用sass預編譯器
-- 轉換ES6,7,8,9語法為ES5
-- 大于10k檔案打包到dist,小于10k轉換為base64
-- 兼容vue-- 拷貝靜態檔案
-- 熱更新
-- 區分當前環境
-- 多執行緒打包
-- 快取未改變模塊
-- g-zip壓縮
-- 獲取本機ip
-- 打包大小分析
-- 壓縮css
-- 檢查埠是否存在復制代碼

 

 

3.實作步驟

   1. 初體驗

 

 

 

1. 新建一個檔案 取名為webpack-vue

2. cd webpack-vue  npm init -y  npm i -D webpack webpack-cli

3. 新建 src/main.js ,里面隨便寫點 console.log('hello,webpack')

4. 修改 package.json - >scripts ,添加 "build":"webpack src/main.js"

5. 然后 npm run build 如果多了一個dist檔案,那么初次打包就成功了復制代碼

 

   2. 配置

  1.  新建一個 build 檔案夾,新建一個 webpack.config.js
  2.  寫入以下內容  

 

 

 

const path=require('path')

module.exports = {
    mode:'development',
    entry:path.resolve(__dirname,'../src/main.js'),  //入口檔案
    output:{
        filename:'[name].[hash:8].js',   //打包后的名字  生成8位數的hash
        path.resolve(__dirname,'../dist')   //打包的路徑
     }
 }

 然后修改 package.json ->scripts,修改為: "build":"webpack --config build/webpack.config.js"  

 然后npm run build復制代碼

 3. 我們生成了main.js之后,不可能每次都手動在index.html里面引入,所以我們需要這個插件來幫我們自動引入

先安裝插件: 

 

 

 

npm i -D html-webpack-plugin復制代碼

 

根目錄新建一個 public/index.html

修改webpack.config.js:

 

 

 

const path = require('path');
  const HtmlWebpackPlugin = require('html-webpack-plugin')   //這里引入插件
  module.exports = {
      mode:'development', // 開發模式
      entry: path.resolve(__dirname,'../src/main.js'),    // 入口檔案
      output: {
        filename: '[name].[hash].js',      // 打包后的檔案名稱
        path: path.resolve(__dirname,'../dist')  // 打包后的目錄
      },
      //插件注入
      plugins:[
        new HtmlWebpackPlugin({
          template:path.resolve(__dirname,'../public/index.html')
        })
      ]
  }復制代碼

 

然后npm run build 就會發現dist里面多了index.html,并且已經自動幫我們引入了main.js

4. 由于hash每次生成的不同,導致每次打包都會將新的main.js打包到dist檔案夾,所以我們需要一個插件來打包前洗掉dist檔案

先安裝插件: 

 

 

 

 

npm i -D clean-webpack-plugin復制代碼

 

 

 

webpack.config.js

const {CleanWebpackPlugin} = require('clean-webpack-plugin')   //引入

 plugins:[
    new HtmlWebpackPlugin({
        template:path.resolve(__dirname,'../public/index.html')
    }),
    new CleanWebpackPlugin()
 ]
復制代碼

 

5.我們一般把不需要打包的靜態檔案放在public里面,這個地方不會被打包到dist,所以我們需要使用插件來把這些檔案復制過去

先安裝插件:

npm i -D  copy-webpack-plugin復制代碼

 

 

 

webpack.config.js

const CopyWebpackPlugin = require('copy-webpack-plugin')      // 復制檔案

plugins: [
   new CopyWebpackPlugin({
      patterns: [
        {
          from: path.resolve(__dirname, '../public'),
          to: path.resolve(__dirname, '../dist')
        }
      ]
    })
]復制代碼

 

6. 為了讓webpack識別css,我們需要安裝loader,并將決議后的css插入到index.html里面的style

先安裝:

 

 

 

npm i -D style-loader css-loader復制代碼

 

 

 

 

 webpack.config.js

module.exports = {
    module:{
        rules:[{
          test:/\.css$/,
          use:['style-loader','css-loader'] // 從右向左決議原則
        }]
    }
}復制代碼

 

7.我們這里可以使用預編譯器更好的處理css,我這里使用的是sass

先安裝:

npm install -D sass-loader node-sass

 

 

 

 webpack.config.js

module:{
    rules: [{
        test: /\.scss$/,
        use: ['style-loader', 'css-loader', 'sass-loader'] // 從右向左決議原則
    }]
}復制代碼

 

8. 自動添加瀏覽器前綴

先安裝:

npm i -D postcss-loader autoprefixer

 

 

 

webpakc.config.js

  module: {
      rules: [
        {
          test: /\.scss$/,
          use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'] // 從右向左決議原則   sass-loader必須寫后面
      }]
  }

 在根目錄新建  .browserslistrc

 這個里面配置兼容的瀏覽器

 這里貼下我的默認配置,可以根據實際情況自己去配置

 > 1%
last 2 versions
not ie <= 8

再新建一個postcss.config.js

module.exports = {
  plugins: [require('autoprefixer')]  // 參考該插件即可了
}

這樣打包后就自動幫你添加瀏覽器前綴了復制代碼

 

9.之前的style-loader只是把css打包到index.html里面的style-loader里面,如果css特別多這種辦法肯定不行,所以我們需要單獨抽離提取css

先安裝:

npm i -D mini-css-extract-plugin

 

 

 

 webpack.config.js

const MiniCssExtractPlugin = require("mini-css-extract-plugin")   //提取css

module: {
    rules: [{
          test: /\.scss$/,
          use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader'] // 從右向左決議原則
    }]
}

plugins: [
    new MiniCssExtractPlugin({
        filename: "css/[name].[hash:8].css",
        chunkFilename: "[id].css",
    })
]

這樣打包后就將css打包到css檔案下里面了復制代碼

 

10. 我們為了減少圖片字體等打包的大小,我們可以使用url-loader將少于指定大小的檔案轉換為base64,使用file-loader將大于指定大小的檔案 移動到指定的位置

先安裝:

npm i -D file-loader url-loader

 

 

 

 webpack.config.js

 module:{
    rules:[
      {
        test:/\.(jpe?g|png|gif|svg)(\?.*)?$/            //圖片
        use:[{
          loader:'url-loader',
          options:{
            limit:10240,
            fallback:{
              loader:'file-loader',
              options:{
                name:'img/[name].[hash:8].[ext]',
                publicPath: '../'       //為了防止圖片路徑錯誤
              }
            }
          }
        }]
      },{
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        use: [{
          loader: 'url-loader',
          options: {
            limit: 10240,
            fallback: {
              loader: 'file-loader',
              options: {
                name: 'media/[name].[hash:8].[ext]',
                publicPath: '../'
              }
            }
          }
        }]
      },{
        test:/\.(woff2?|eot|ttf|otf)(\?.*)$/,
        loader:'url-loader',
        options:{
          limit:10240,
          fallback:{
           loader:'file-loader,
           options:{
             name:'fonts/[name].[hash:8].[ext]',
             publicPath: '../'
           }
        }
        }
      }
    ]
  }

webpack只會轉換和移動專案中使用了的圖片

打包后發現圖片字體等也打包進去了復制代碼

 

11.為了兼容瀏覽器,我們需要將ES6,7,8,9轉換為Es5

先安裝:

 

 

 

 

npm install -D babel-loader @babel/preset-env @babel/core復制代碼
 webpack.config.js

module: {
    rules: [{
        test: /\.js$/,
        use: ['babel-loader']
    }]
}

根目錄新建  .babelrc

{
  "presets": [
    "@babel/preset-env"
  ]
}


一些新的api如Promise,set,Maps等還不支持轉換,所以我們需要另一個插件babel/polyfill,但是這個插件會將所有的poly都打包到
mian.js里面,所以我們需要另一個插件 core-js@2  來按需加載

`npm i -s @babel/polyfill core-js@2`

修改.babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "modules": false,
        "useBuiltIns": "usage",
        "corejs": 2,
        "targets": {
          "browsers": [
            "last 2 versions",
            "ie >= 10"
          ]
        }
      }
    ]
  ]
}

還有一個問題,會影響全域依賴,所以我們需要另一個插件來解決這個問題

 npm i @babel/plugin-transform-runtime -D
 npm i --save @babel/runtime
 npm i --save @babel/runtime-corejs2

修改.babelrc

{
  "presets": [
    "@babel/preset-env"
  ],
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "helpers": true,
        "regenerator": true,
        "useESModules": false,
        "corejs": 2
      }
    ]
  ]
}

這樣就完美解決ES6新api的兼容問題了復制代碼

12.兼容vue

先安裝:

 

 

 

 npm i -D vue-loader vue-template-compiler vue-style-loader

 npm i -S vue 復制代碼

 

 

 

 

webpack.config.js

const vueLoaderPlugin=require('vue-loader/lib/plugin') 
function resolve(dir) {
  return path.join(__dirname, '..', dir)
}

 module:{
    rules:[{
        test:/\.vue$/,
        use:[vue-loader]
    }]
 },
resolve:{
    alias:{
        'vue$':'vue/dist/vue.runtime.esm.js',
        '@':path.resolve(__dirname,'../src')
    },
    extensions: ['.js', '.vue', '.json'],
},
plugins:[
   new vueLoaderPlugin()
]

這樣配置完成之后就可以webpack就識別了vue檔案復制代碼

 

13.熱更新

  先安裝:

 

 

 

 npm i -D webpack-dev-server復制代碼

 

 

 

 

 wepack.config.js

const webpack = require('webpack')

devServer: {
    compress: true,
    port: 8989,
    hot: true,
    inline: true,
    hotOnly: true,  //當編譯失敗時,不重繪頁面
    overlay: true,  //用來在編譯出錯的時候,在瀏覽器頁面上顯示錯誤
    publicPath: '/',  //一定要加
    open: true,
    watchOptions: {
      // 不監聽的檔案或檔案夾,支持正則匹配
      ignored: /node_modules/,
      // 監聽到變化后等1s再去執行動作
      aggregateTimeout: 1000,
      // 默認每秒詢問1000次
      poll: 1000
    }
  },
plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin(),
    new webpack.NoEmitOnErrorsPlugin()
]

在package.json里面配置: "dev":"webpack-dev-server --config build/webpack.config.js"

在main.js里面

import Vue from "vue"
import App from "./App"

new Vue({
    render:h=>h(App)
}).$mount('#app')

src檔案夾內新建一個APP.vue,內容自定義

然后npm run dev  頁面就運行起來了復制代碼

 

14.區分開發環境和生產環境

build檔案夾內新建 webpack.dev.js  webpack.prod.js復制代碼
開發環境:

1.不需要壓縮代碼
2.熱更新
3.完整的soureMap
...

生產環境:

1.壓縮代碼
2.提取css檔案
3.去除soureMap (根據個人需要)
...復制代碼

我們這里需要安裝 webpack-merge 來合并配置項

先安裝:

 

 

 

npm i -D webpack-merge   復制代碼

 

 

 

 

webpack.dev.js

const webpackConfig = require('./webpack.config')
const merge = require('webpack-merge')
const webpack = require('webpack')

module.exports = merge(webpackConfig, {
  mode: 'development',
  devtool: 'cheap-module-eval-source-map',
  devServer: {
    compress: true,
    port: 8989,
    hot: true,
    inline: true,
    hotOnly: true,  //當編譯失敗時,不重繪頁面
    overlay: true,  //用來在編譯出錯的時候,在瀏覽器頁面上顯示錯誤
    publicPath: '/',  //一定要加
    open: true,
    watchOptions: {
      // 不監聽的檔案或檔案夾,支持正則匹配
      ignored: /node_modules/,
      // 監聽到變化后等1s再去執行動作
      aggregateTimeout: 1000,
      // 默認每秒詢問1000次
      poll: 1000
    }
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: ['babel-loader']
      },
      {
        test: /\.css$/,
        use: ['vue-style-loader', 'css-loader', 'postcss-loader'],
      },
      {
        test: /\.scss$/,
        use: ['vue-style-loader', 'css-loader', 'postcss-loader', 'sass-loader'],
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin(),
    new webpack.NoEmitOnErrorsPlugin()
  ]
})復制代碼

 

 

 

 

 webpack.prod.js

const webpackConfig = require('./webpack.config')
const merge = require('webpack-merge')
const path = require('path')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')     //清除dist
const MiniCssExtractPlugin = require("mini-css-extract-plugin")   //提取css

function resolve(dir) {
  return path.join(__dirname, '..', dir)
}

module.exports = merge(webpackConfig, {
  mode: "production",
  devtool: 'none',
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendors: {
          name: 'vendors',
          test: /[\\\/]node_modules[\\\/]/,
          priority: -10,
          chunks: 'initial'
        },
        common: {
          name: 'chunk-common',
          minChunks: 2,
          priority: -20,
          chunks: 'initial',
          reuseExistingChunk: true
        }
      }
    }
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: ['babel-loader']
        exclude: /node_modules/,
        include: [resolve('src'), resolve('node_modules/webpack-dev-server/client')]
      },
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: '../',
            }
          }, 'css-loader', 'postcss-loader'],
      },
      {
        test: /\.scss$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: '../',
            }
          }, 'css-loader', 'postcss-loader', 'sass-loader'],
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(),
    new MiniCssExtractPlugin({
      filename: 'css/[name].[hash].css',
      chunkFilename: 'css/[name].[hash].css',
    })
  ]
})
復制代碼

 

  webpack.config.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')   //這里引入插件
const vueLoaderPlugin = require('vue-loader/lib/plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')      // 復制檔案

function resolve(dir) {
  return path.join(__dirname, '..', dir)
}

module.exports = {
  mode: 'development',
  entry: path.resolve(__dirname, '../src/main.js'),
  output: {
    filename: 'js/[name].[hash:8].js',
    path: path.resolve(__dirname, '../dist'),
    chunkFilename: 'js/[name].[hash:8].js',  //異步加載模塊
    publicPath: './'
  },
  externals: {},
  module: {
    noParse: /jquery/,
    rules: [
      {
        test: /\.vue$/,
        use: [{
          loader: 'vue-loader',
          options: {
            compilerOptions: {
              preserveWhitespace: false
            }
          }
        }]
      },
      {
        test: /\.(jpe?g|png|gif)$/i, //圖片檔案
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 10240,
              fallback: {
                loader: 'file-loader',
                options: {
                  name: 'img/[name].[hash:8].[ext]',
                  publicPath: '../'
                }
              }
            }
          }
        ]
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, //媒體檔案
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 10240,
              fallback: {
                loader: 'file-loader',
                options: {
                  name: 'media/[name].[hash:8].[ext]',
                  publicPath: '../'
                }
              }
            }
          }
        ]
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i, // 字體
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 10240,
              fallback: {
                loader: 'file-loader',
                options: {
                  name: 'font/[name].[hash:8].[ext]',
                  publicPath: '../'
                }
              }
            }
          }
        ]
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    },
    extensions: ['.js', '.vue', '.json'],
  },
  //插件注入
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, '../public/index.html')
    }),
    new vueLoaderPlugin(),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: path.resolve(__dirname, '../public'),
          to: path.resolve(__dirname, '../dist')
        }
      ]
    })
  ]
}復制代碼

3.webpack配置優化

1.設定mode

默認為production,webpack4.x默認會壓縮代碼和去除無用的代碼

可選引數:production, development

ps:之前我認為只需要設定mode為production,就不用使用壓縮css和js的插件,但結果發現我錯了,仔細比較了下,還是要安裝的

先安裝打包css的:

 

 

 

 

npm i -D optimize-css-assets-webpack-plugin復制代碼
webpack.prod.js

const optimizeCss = require('optimize-css-assets-webpack-plugin');

plugins:[
  new optimizeCss({
      cssProcessor: require('cssnano'), //引入cssnano配置壓縮選項
      cssProcessorOptions: {
        discardComments: { removeAll: true }
      },
      canPrint: true //是否將插件資訊列印到控制臺
  })
]
復制代碼

壓縮js和js打包多執行緒的暫時沒有添加,在網上搜有的說不用添加,有的說還是要安裝插件,等實際專案中我用完之后再來添加

2.縮小搜索范圍

 alias 可以告訴webpack去指定檔案夾去尋找,盡量多使用

 include exclude    包括和過濾

 noParse   當我們代碼中使用到import jq from 'jquery'時,webpack會去決議jq這個庫是否有依賴其他的包,這個可以告訴webpack不必決議

 extensions    使用頻率高的寫在前面  
復制代碼

3.單執行緒轉多執行緒

webpack處理文本,圖片,css的時候,由于js單執行緒的特性,只能一個一個檔案的處理,HappyPack可以將這個任務 分解到多個子執行緒里面,子執行緒完畢后會把結果發送到主執行緒,從而加快打包速度

先安裝:

npm i -D happypack

webpack.prod.js

const HappyPack = require('happypack')     //單行程轉多行程
const os = require('os')
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length })

module: {
    rules: [{
        test: /\.js$/,
        use: ['happypack/loader?id=happyBabel'],
        exclude: /node_modules/,
        include: [resolve('src'), resolve('node_modules/webpack-dev-server/client')]
    }]
}

plugins:[
   new HappyPack({
      id: 'happyBabel',
      loaders: ['babel-loader?cacheDirectory'],
      threadPool: happyThreadPool
    })
]
復制代碼

4.第三方模塊優化

將不怎么改變的第三方依賴,我們可以用DllPlugin DllReferencePlugin將它從依賴中抽離出來,這樣每一次打包就不用打包這些檔案,加快了打包的速度;

但是webpack4.x的性能已經很好了,參考vue-cli也沒有使用dll抽離,所以我們這里也不使用了,這里我們使用 另一個插件:hard-source-webpack-plugin ,這個插件會去對比修改了哪些配置,只去打包修改過了的配置 第一次打包速度正常,第二次打包速度能提升 50%+

npm i -D hard-source-webpack-plugin

webpack.prod.js

const HardSourceWebpackPlugin = require('hard-source-webpack-plugin')    //快取第三方模塊
plugins: [
   new HardSourceWebpackPlugin()
]

復制代碼

5.externals

通過cdn加載的依賴,可以在這里設定,就不會通過webpack編譯

6.g-zip壓縮

g-zip壓縮可以將已經壓縮過的js,css再次壓縮一遍,減少了打包大小,需要nginx配置

npm i -D compression-webpack-plugin

webpack.prod.js

const CompressionWebpackPlugin = require('compression-webpack-plugin')
const productionGzipExtensions = ["js", "css"];

plugins:[
   new CompressionWebpackPlugin({
      filename: '[path].gz[query]',
      algorithm: 'gzip',
      test: new RegExp("\\.(" + productionGzipExtensions.join("|") + ")$"),
      threshold: 10240, // 只有大小大于10k的資源會被處理
      minRatio: 0.6 // 壓縮比例,值為0 ~ 1
    })
]

復制代碼

7.自動獲取本地Ip,通過本地ip地址啟動專案

webpack.dev.js

const os = require('os')
devServer:{
  host:()=>{
      var netWork = os.networkInterfaces()
      var ip = ''
      for (var dev in netWork) {
          netWork[dev].forEach(function (details) {
              if (ip === '' && details.family === 'IPv4' && !details.internal) {
                 ip = details.address
                 return;
              }
          })
     }
        return ip || 'localhost'
   }
}

復制代碼

8.抽離一些公共配置

根目錄新建vue.config.js 里面配置一些公共的配置如:

const os = require('os')

module.exports = {
  dev: {
    host: getNetworkIp(),   //埠號
    port: 8999,
    autoOpen: true,  //自動打開
  },
  build: {
    productionGzipExtensions: ["js", "css"],  //需要開啟g-zip的檔案后綴
    productionGzip: false     //是否開啟g-zip壓縮
  }
}

//獲取本地ip地址
function getNetworkIp() {
  var netWork = os.networkInterfaces()
  var ip = ''
  for (var dev in netWork) {
    netWork[dev].forEach(function (details) {
      if (ip === '' && details.family === 'IPv4' && !details.internal) {
        ip = details.address
        return;
      }
    })
  }
  return ip || 'localhost'
}

然后webpack.dev.js  webpack.prod.js引入這個檔案,獲取其中的配置就好了

復制代碼

9.打包大小分析

先安裝:

npm i -D webpack-bundle-analyzer

webpack.prod.js

if (process.env.npm_config_report) {
  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
  prodConfig.plugins.push(
    new BundleAnalyzerPlugin()
  )
}

然后 npm run build --report就會彈出一個頁面,里面就是打包大小分析

復制代碼

10.完整的vue專案(vue-router axios vuex等)

先安裝:

npm i -S vue-router axios vuex

然后在src里面新建 -> router檔案夾 ->新建index.js

index.js

import Vue from "vue"
import Router from "vue-router"

Vue.use(Router)

export default new Router({
  mode: 'hash',
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import(/* webpackChunkName: "home" */ "@/views/home"),
    },
  ]
})

main.js

import router from "./router"
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

新建views -> Home.vue

隨便寫點東西,然后npm run dev  這樣就完成了一個路由了

復制代碼

到這里webpack搭建vue專案就搭建完成,還有沒懂的嗎?光理論是不夠的,在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/73787.html

標籤:JavaScript

上一篇:TypeScript考試題來了,60%的人不會(附答案)

下一篇:vue 3.x 如何高效學成?本文詳解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more