掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
提綱

堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都展覽展示小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站制作營(yíng)銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁(yè)布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
- watch: true,
- watchOptions: {
- ignored: /node_modules/, // 忽略監(jiān)聽文件
- aggregateTimeout: 300, //文件變動(dòng)后多久發(fā)起構(gòu)建
- poll: 1000, //每秒詢問次數(shù),越小越好
- }
一、react-router4實(shí)現(xiàn)按需加載
1.將網(wǎng)站劃分成一個(gè)個(gè)小功能,在按照每個(gè)功能的相關(guān)度將他們分成幾個(gè)類;
2.將沒一個(gè)類合并成一個(gè)chunk,按需加載對(duì)應(yīng)的代碼;
3.不可將用戶***進(jìn)入網(wǎng)站時(shí)需要看到畫面的對(duì)應(yīng)功能Chunk按需加載;
1.使用插件:npm i react-loadable;
2.配合bable插件npm i @babel/plugin-syntax-dynamic-import;
- // .bablerc
- {
- "plugins": ["@babel/plugin-syntax-dynamic-import"]
- }
- // 示例代碼
- Loadable({
- loader: () => import('./component'), //按需加載組件
- loading: Loading, //處理組件加載的loading、error等
- delay: 300 //延遲加載避免loading的閃爍問題
- });
- // Loading組件自定義
- // 接受三個(gè)props,其中pastDelay:等待時(shí)觸發(fā);timedOut:超時(shí)時(shí)觸發(fā)超過delay;error:出錯(cuò)觸發(fā)默認(rèn)為200ms
- const Loading = ({ pastDelay, timedOut, error }) => {
- if (pastDelay) {
- return
- } else if (timedOut) {
- return
- } else if (error) {
- return
Error!;- }
- return null;
- };
二、提取公共代碼webpack.optimization
- optimization: {
- splitChunks: {
- chunks: "all",
- cacheGroups: {
- vendors: {
- test: /node_modules/,
- name: 'vendors',
- minSize: 0,
- minChunks: 1,
- chunks: 'initial',
- priority: 2 // 該配置項(xiàng)是設(shè)置處理的優(yōu)先級(jí),數(shù)值越大越優(yōu)先處理
- },
- commons: {
- name: "comomns",
- test: resolve("src/components"), // 可自定義拓展規(guī)則
- minChunks: 2, // 最小共用次數(shù)
- minSize:0, //代碼最小多大,進(jìn)行抽離
- priority: 1, //該配置項(xiàng)是設(shè)置處理的優(yōu)先級(jí),數(shù)值越大越優(yōu)先處理
- }
- }
- }
三、壓縮文件js\css
- optimization: {
- minimizer: [
- new ParallelUglifyPlugin({
- cacheDir: '.cache/', //緩存壓縮,默認(rèn)不緩存,設(shè)置存放位置開啟
- test: /.js$/, //匹配需要壓縮的文件,默認(rèn)為/.js$/和Loader配置一樣
- //include: [], 使用正則去選擇需要被壓縮的文件和Loader配置一樣
- //exclude: [], 使用正則去去除不需要被壓縮的文件和Loader配置一樣
- //workerCount: 2, 開啟幾個(gè)子進(jìn)程并發(fā)執(zhí)行壓縮
- // sourceMap: false, 是否輸出source Map,開啟會(huì)導(dǎo)致壓縮變慢
- // uglifyJS: {}, 用于壓縮ES6代碼不可和uglifyJS同時(shí)使用
- uglifyJS:{//壓縮ES5代碼
- output: {
- // 是否輸出可讀性較強(qiáng)的代碼,即會(huì)保留空格和制表符,默認(rèn)為輸出,為了達(dá)到更好的壓縮效果,可以設(shè)置為false
- beautify: false,
- //是否保留代碼中的注釋,默認(rèn)為保留,為了達(dá)到更好的壓縮效果,可以設(shè)置為false
- comments: false
- },
- compress: {
- //是否在UglifyJS刪除沒有用到的代碼時(shí)輸出警告信息,默認(rèn)為輸出
- warnings: false,
- //是否刪除代碼中所有的console語句,默認(rèn)為不刪除,開啟后,會(huì)刪除所有的console語句
- drop_console: true,
- //是否內(nèi)嵌雖然已經(jīng)定義了,但是只用到一次的變量,比如將 var x = 1; y = x, 轉(zhuǎn)換成 y = 1, 默認(rèn)為否
- collapse_vars: true,
- // 提取出現(xiàn)多次但是沒有定義成變量去引用的靜態(tài)值
- reduce_vars:true
- }
- },
- }),
- ]
- },
1.使用插件:optimize-css-assets-webpack-plugin、mini-css-extract-plugin
2.使用示例:
- // 提取css到單獨(dú)的文件
- const MiniCssExtractPlugin = require("mini-css-extract-plugin");
- // optimizeCssPlugin CSS文件壓縮插件
- const optimizeCssPlugin = require('optimize-css-assets-webpack-plugin');
- const extractSCSS = new MiniCssExtractPlugin({
- filename: 'css/[name].[contenthash:8].css',
- chunkFilename: 'css/[name]_[contenthash:8].css',
- fallback:'style-loader'
- });
- ...
- ...
- plugins: [
- new optimizeCssPlugin({
- assetNameRegExp: /\.css$/g,
- cssProcessor: require('cssnano'),
- cssProcessorOptions: { discardComments: { removeAll: true } },
- canPrint: true
- }),
- ]
webpack配置接入CDN
- // JavaScript
- output: {
- publicPath: '//js.cdn.com/js/',
- path: path.join(__dirname, '../docs/dist'), // 打包后的文件存放的地方
- // 為輸出的JavaScript文件名加上Hash值使用`chunkhash`(chunkhash:根據(jù)模塊內(nèi)容變化;hash: 根據(jù)每次構(gòu)建隨機(jī))
- filename: "js/[name].[chunkhash:8].js",
- chunkFilename: "js/[name]-[id].[chunkhash:8].js",
- },
開啟gzip壓縮
- const CompressionPlugin = require("compression-webpack-plugin");
- plugins: [
- new CompressionPlugin({
- filename: '[path].gz[query]', //目標(biāo)資源名稱。[file] 會(huì)被替換成原資源。[path] 會(huì)被替換成原資源路徑,[query] 替換成原查詢字符串
- algorithm: 'gzip',//算法
- test: /\.(js|css)$/, //壓縮 js 與 css
- threshold: 10240,//只處理比這個(gè)值大的資源。按字節(jié)計(jì)算
- minRatio: 0.8//只有壓縮率比這個(gè)值小的資源才會(huì)被處理
- })
- ]
- const staticCache = require('koa-static-cache');
- import config from './configs';
- const app = new Koa();
- app.use(staticCache(path.resolve(__dirname, "../dist"), {
- maxAge: 7 * 24 * 60 * 60,
- gzip: true, //開啟
- dynamic: true,
- }))
接入treeShaking,剔除無用代碼
- {
- "presets": [
- ["env", {
- "modules": false
- }]
- ],
- "plugins": ["syntax-dynamic-import"]
- }
開啟Scope Hoistion
1.代碼體積減少
2.代碼在運(yùn)行時(shí)因?yàn)閯?chuàng)建的函數(shù)作用域更少了,內(nèi)存開銷也隨之變小
- const ModuleConcatPlugin = require('webpack/lib/optimize/ModuleConcatenationPlugin');
- plugins: [
- new ModuleConcatPlugin(), //開啟scope Hoisting
- ],

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流