时间: 2020-10-31|68次围观|0 条评论

// webpack  安装教程
// npm  init  -->一直回车就好  npm init -y 就可以不用回车 直接帮生成文件
// npm install webpack webpack-cli -g 全局安装webpack  不建议
// 项目中 npm install 安装依赖包
// npm install webpack webpack-cli
// npm run webapck  运行打包

//如果不想通过 webpack.config.js  想换个名字 换成 webpackconfig.js
// 命令如下   npm webpack --config webpackconfig.js  就可以了

// 三种运行webpack 的方式
// webpack index.js  
// npx webpack index.js 
// npm run bundle  ->wepack


// mode:"production",   打包模式  不会出现警告  WARNING in configuration
// mode:"development",   打包之后得bundle.js 代码不被压缩  

//打包其他文件配置规制 因为webpack默认可以配置js文件的其他文件得需要自己配置  比如图片打包
// module: {
//     rules: [{
//         test: /\.jpg$/,
//         use: {
//             loader: 'file-loader'  
//         }
//     }]
// },

//打包图片 不想让打包后的图名称发生改变
// 在moudle  中的use 里面添加配置项
// options: {

//     name: '[name].[ext]'    [ext] 表示的是原始文件的后缀    [hash] 表示 哈希值  name: '[name]_[hash].[ext]'  就是随机字符组合的名字
// }

// 打包后的图片想独单放到一个文件加可以配置
// rules: [{
//     test: /\.(jpg|png|gif)$/,
//     use: {
//         loader: 'file-loader',
//         options: {
//             name: '[name].[ext]',
//             outputPath: 'images/'   打包存放图片的路劲   output默认放在dist 所以images文件放打包之后放在dist文件夹中的下面
//         },

//     }
// }]




// 打包图片格式  file-loader  和url-loader 区别
// file-loader 图片地址不会转换base64地址
// url-loader 会把图片的原有地址转换成base64地址  然后放到你打包的js文件中  不会单独放到图片文件里面去  
// 图片小的话推荐用 url-loader 应该会占用到 bundle.js文件内存里面  图片大的话 可以选择采用file-loader选择
// 可以添加配置项limit:204800(200k) 限制文件大小   如果文件小于204800 就放到bundle.js里面 如果大于就单独放到一个文件当中(他会自动存放)  






//npm install url-loader -D
//npm install file-loader -D
//npm install sass-loader node-sass -D  
//npm i -D postcss-loader  css3各浏览器语法兼容  不用手动自己去加浏览器前缀 很方便
//安装完 postcss-loader 去项目最外层中创建postcss.config.js文件
//然后安装插件   npm install autoprefixer -D
// 在postcss.loader.js中使用autoprefixer插件
// module.exports = {
//     plugins: [
//         require('autoprefixer')
//     ]
// }



//局部模块样式引用。
// import './index.scss';    //这样引用打包之后会全局使用这个样式文件  所以我们应该使用局部样式引用
// import style from  './index.scss'; //这是局部引用样式文件  不会全局引用
// 这样就可以用 style.xxx可以独单复用于某个文件当中了  这样避免全局使用后会发生样式冲突
// 还有就是得在添加新配置项  modules:true 这个配置
// use: [
//     'style-loader',
//     // 'css-loader',
//     {
//         loader: 'css-loader',
//         options: {
//             importLoaders: 2 ,
//             modules:true  //这个意思是开启摸块话打包
//         }
//     },
//     'sass-loader',
//     'postcss-loader'
// ],





// 如何打包字体库文件
// 在rules下面添加选项
//安装file-loader  npm install file-loader -D
// {
//     test: /\.(eot|ttf|svg|woff)$/,
//     use: {
//         loader: 'file-loader'
//     }
// }


// 000        插件内容

// 使用webapck插件以后不用手动的在新建项目的时候,在dist目录下创建index.html了
// 1.安装插件   npm install html-webpack-plugin -D,
// 在webpack.config.js文件顶部定义  
// const HtmlWebpackPlugin = require('html-webpack-plugin');

// 2.在module中添加配置项
// plugins:[
//     new HtmlWebpackPlugin()   这个插件会在打包结束后,自动生成一个html文件,并把打包生成的js文件自动引入到这个html当中
// ],
// 运行打包 npm run bundle 即可自动生成index.html文件

//plugin 可以在webpack运行到某个时刻的时候,帮你做一些事情  像生命周期函数  



//如果 从新打包一个dist文件之前的不要我们可以安装插件  实现从新创建dist名字的文件
// npm install clean-webpack-plugin  //这是第三方插件 webpack文档中不存在
// 在webpack.config.js文件顶部定义  
// const CleanWebpackPlugin = require('clean-webpack-plugin');
// plugins: [
//     new HtmlWebpackPlugin({
//         template: 'src/index.html' //添加这个的作用是 可以把src/index.html里面的内容打包之后 生成到dst/index.html文件当中  很方便
//     }),
//     new CleanWebpackPlugin(['dist'])
// ],



// entry output 基础配置

// 如果想反复打包生成两次文件
// entry: {   
//     main: "./src/index.js",   
//     sub: "./src/index.js",   
// },    
// 如果想反复打包生成两次文件,入口文件必须得改filename    
// output: {
//     // filename: "[name].js",     name 是个变量 依次形成 main.js  sub.js 出口文件
//     path: path.resolve(__dirname, 'dist'),
//     publicPath:"http://www.baid8u.com/"  加上这个配置项 就可以在引用打包文件的前缀加上 这个地址 
//                                          比如 打包后html引用文件地址为http: //www.baid8u.com/bundle.js
// }


// sourceMap 配置
// 它是一个映射关系,他知道dist目录下main.js文件96实际上对应得是src目录下index.js文件中的第一行

// devtool:'source-map',  在webpack.config.js中配置
// 他的意义就是如果你的js文件打包出错,打开控制器查看错误会在入口文件的js查看,如果devtool:'none',设置为none之后呢只能在打包后的js文件中查看你的出错位置。这就是他的作用 他会在dist打包目录下生成一个main.js.map的文件  使用这个打包速度会放慢

// devtool:'inline-source-map', 不会生成main.js.map  //#endregion
// devtool:'inline-clean-source-map' clean加上之后 它会提示告诉你精确到哪一行哪一列出错信息
// devtool:'inline-cleap-source-map' clean加上之后 它会提示告诉你精确到哪一行出错信息  这样比上面的打包性能更加优化
// cheap-module-source-map不仅管业务代码的错误 还管第三方检插件 还有loader是否有误
// eval 在代码量多的情况下 提示错误不怎么全面 打包速度虽然快
// cheap-module-eval-source-map  建议使用这方式  这个打包速度快 提示错误全面

// 如果打包环境是development 
// mode: "development",  使用devtool:'cheap-module-eval-source-map' 比较好

// 如果打包环境是production
// mode: "production",  使用devtool:'cheap-module-source-map' 比较好





// 如果修改了src目录下的代码,dist目录下的的打包文件自动打包 不需要再重复的 npm run bundle
// 有三种做法
// 第一种  在package.json文件中的"script" 中 --watch  
// "scripts": {
//     "watch": "webpack --watch"
//   },
// 加了一个--watch之后
// 运行 npm run watch  之后 只要改动入口文件  就会自动打包了 不用修改一次就得打包一次


// 第二种  在package.json文件中的"script" 中 添加"start": "webpack-dev-server"  会自动的帮我们从打包和刷新页面内容
// "scripts": {
//     "bundle": "webpack --watch",
//     "start": "webpack-dev-server"
// },
// 在webpack.config.js中添加配置项 devServer
// devServer: {
//     contentBase: "./dist"  contentBase  访问文件路径
// },
//安装  npm install  webpack-dev-server -D
// 运行 npm run start  
// 用localhost:8080打开即可
// devServer: {
//     contentBase: "./dist",
//     open:true   添加open属性  可以自动的打开网页 localhost:8080,     
// },



// HotModuleReplacementPlugin 使用   可以利用devserver时候代码更新打包的时候页面不用从新加载就可以刷新页面 实现免刷新实现页面与代码同步效果 
// devServer: {
//     contentBase: "./dist",
//     open: true,
//     port: 8080,
//     hot: true,           hot hotOnly的开启设置为true
//     hotOnly: true,
// },
// 在webpack.config.js文件的顶部 定义
// const webpack = require('webpack');
// plugins: [
//     new HtmlWebpackPlugin({
//         template: 'src/index.html' //添加这个的作用是 可以把src/index.html里面的内容打包之后 生成到dst/index.html文件当中  很方便
//     }),
//     // new CleanWebpackPlugin(['dist'])
//     new webpack.HotModuleReplacementPlugin(),   new一下
// ],



// 使用 babel 转换语法
// 安装babel
// npm install --save-dev babel-loader @babel/core
// 配置babel
// module: {
//     rules: [
//       { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
//     ]
//   }
// npm install @babel/preset-env --save-dev  实现翻译模块
// {
//     test: /\.js$/,
//     use: {
//         loader: 'file-loader',
//         exclude: /node_modules/,
//         loader: "babel-loader"
//     },
//     options: {
//         "presets": ["@babel/preset-env"]   添加options 配置项
//     }
// }
//使用@babel/polyfill
// 安装   npm install --save @babel/polyfill

// 入口文件导入 import "@babel/polyfill";     浏览器兼容语法 比如es6语法
// options: {                       useBuiltIns:"useage"  加上这个之后只有低版本浏览器兼容的时候去帮兼容,如果浏览器兼容就不需要去主动兼容了
//     "presets": [["@babel/preset-env"],{                这样可以在低端浏览器运行 也可以在高端浏览器运行了
//         useBuiltIns:"useage"    //可以减小polyfill的大小,这样就可以按需转换
//     }]
// }
// npm install --save-dev @babel/plugin-transform-runtime
// npm install --save @babel/runtime
// "plugins": [
//     [
//       "@babel/plugin-transform-runtime",
//       {
//         "absoluteRuntime": false,
//         "corejs": 2,  默认填的是false 但是一般填2所以得安装  --》 npm install --save @babel/runtime-corejs2  改为2才能打包promise map es6语法 
//         "helpers": true,
//         "regenerator": true,
//         "useESModules": false
//       }
//     ]
//   ]




// webpack中的   Tree Shaking  只支持 ES Module
// 在使用 Tree Shaking  而且开发环境设置为mode: "development",情况下得在moudle下配置  
// optimization: {
//     usedExports: true     mode="production" 的环境下 可以省略 不用写
// }, 
// 还需要在 package.josn 文件下配置
// "sideEffects":false,

// 如果不希望  对  polly-fill 进行 Tree Shaking 那得这么设置
// "sideEffects":["@babel/polyfill","*.css"], 这样就对它不起作用了 还有css不起作用




// mode="develoment"  和mode="production" 模式的区分打包
// 如何区别分呢?
// 在项目最层创建两个环境打包的module配置
// 开发环境 webpack.dev.js
// 生产环境 webpack.prod.js
// 在package.json 中的script命令设置中
// "scripts": {
//     "dev": "webpack-dev-server --config webpack.dev.js" ,  开发环境打包
//     "bulid":"webpack --config webpack.prod.js"             生成环境打包
//   },
// 进行区分打包后 如何将webpack.dev.js 以及 webpack.prod.js 文件相同的给抽取放到webpack.common.js中 
// 抽取之后如何实现合并  
// 安装   npm install webapck-merge -D
// 然后再wepack.dev.js和wepack.prod.js文件中添加
// const merge = require('webpack-merge');
// const commonConfig = require('./webpack.common.js');
// const devConfig = { //开发环境配置配置
// }
// 接下来 引入模块合并
// module.exports = merge(commonConfig, devConfig);
// 运行 即可 npm run dev  运行这个命令打开开发环境  npm run bulid 生成环境




// 安装lodash   npm install lodash --save 
// 本来我们的打包文件有mian.js文件有2mb大小, 可是我们改了代码之后不希望又加载main.js( 2 mb)

// Code Splitting  项目代码性能优化作用  代码分割
// 安装语法解析
// npm install babel-plugin-dynamic-import-webpack -D
// 在.babelrc文件下的 plugins:["dynamic-import-webpack"] 添加配置
// 在webpack.common.js中配置 (同步代码)   异步代码不需要配置
// optimization: {   //代码分割配置
//     splitChunks: {
//         chunks: 'all'
//     }
// },
// 多生成一个0.js打包文件
// 怎么改名字呢?
// 去package.json文件中删除这一项
// "babel-plugin-dynamic-import-webpack": "^1.1.0",
// 删除掉.babelrc文件中的 plugins: ["dynamic-import-webpack"] -->  plugins:[]
// 安装动态引入插件
// npm install --save-dev @babel/plugin-syntax-dynamic-import
// 然后使用在.babelrc文件中配置  plugins: ["@babel/plugin-syntax-dynamic-import"]
// 在webpack.common.js中的splitChunks配置项添加
// splitChunks: {
//     // cacheGroups: {   //
//             vendors: false,   配置了 这两个默认值为false 打包分割的文件名不会有vendors前缀
//             default: false,
//              }
//  
// 在webpack.common.js中配置项添加
// optimization: { //代码分割配置
//     splitChunks: {
//         chunks: 'all', //同步代码  异步代码都能分割
//         minSize: 30000, //js文件大小 超过30000 不进行分割
//         minChunks: 1,
//         maxAsyncRequests: 5, //超过五个js文件就不会进行代码分割
//         maxInitialRequests: 3, //入口文件做代码分割也最多3个js文件  超过三个不做代码分割
//         automaticNameDelimiter: '~',
//         name: true,
//         vendors: {
//             test: /[\\/]node_modules[\\/]/,
//             priority: -10
//         },
//         default: {
//             minChunks: 2,
//             priority: -20,
//             reuseExistingChunk: true
//         } 
//     }
// },

// cacheGroups:{      在splitChunks可以修改.chunk.js文件名
//     vendors:{
//         test:/[\\/]node_modules[\\/]/,
//         priority:-10,
//         name:"vendors"
//     }
// }

// function getComponent() {
//     return import( /**webapckChunkName:'lodash' */ 'lodash').then(({
//         default: _
//     }) => {
//         var element = document.createElement('div');
//         element.innerHTML = _.join(['dell', 'lee'], '-');
//         return element;
//     })
// }
// document.addEventListener("click", () => {
//         getComponent().then(element => {
//             document.body.appendChild(element);
//         })
//     })

//     // 使用import语法可以实现懒加载,就是加载页面的时候没有用到 就不加载代码内容,当点击click(调用点击事件) 才调用方法实现加载,这就叫做懒加载

//     --preloader.josn


// document.addEventListener('click', () => {
//     import( /* webpackPrefetch :true */ './click.js').then(({
//         default: func
//     }))
//     func();
// })
/* webpackPrefetch :true */ //可以将点击交互的代码 等到你自己的页面空闲的时候加载到缓存中

//  "dev-build": "webpack --profile --json > starts.json --config ./build/webpack.dev.js"
// --profile --json > starts.json --config 添加这个可以把打包文件的打包信息放入这两个json文件中



// bundle 分析(bundle analysis)
// 如果我们以分离代码作为开始,那么就以检查模块作为结束,分析输出结果是很有用处的。官方分析工具 是一个好的初始选择。
// webpack-chart: webpack 数据交互饼图。
// webpack-visualizer: 可视化并分析你的 bundle,检查哪些模块占用空间,哪些可能是重复使用的。
// webpack-bundle-analyzer: 一款分析 bundle 内容的插件及 CLI 工具,以便捷的、交互式、可缩放的树状图形式展现给用户。



// npm install jquery --save  安装jq包
// 在webpack.common.js文件中得module项中配置performance:false;打包出现性能提示问题添加这个即可接触警告


// shimming 全局变量

// 解决引用js文件 $ 问题  就是不用引用 import $ from 'jquery'
// 在plugins:[]配置项下面添加
// new webpack.ProvidePlugin({
//     $: 'jquery'
// })


//如果改变模块中js文件的this指向,不用指向window
// 安装 npm install imports-loader --save-dev
// 在webpack.common.js module配置项中的js打包模块添加
// use:[
//     {  loader: "babel-loader"},
//     {  loader: "imports-loader?this=>window",}
// ],

// 环境变量的试用
// 通过全局变量传递来进行生产模式和开发模式的打包代码
// 将webpack.dev.js文件中 的   const merge = require('webpack-merge'); 放入到 webpack.common.js文件头部定义中
// 将webpack.dev.js文件中底部写 module.exports = devConfig  导出
// 将webpack.prod.js文件中底部写 module.exports = prodConfig  导出

// 在webpack.common.js文件中写下面
// module.exports ={} 改为 --> const commonConfig == {}
// module.exports = (env) => {
//     if(env && env.production) {
//         return merge(commonConfig,prodConfig)
//     } else{
//         return merge(commonConfig,devConfig)
//     }
// }
// 接下来在package.json文件的script配置项中修改 
// 原本:   
// "dev": "webpack-dev-server --config ./build/webpack.dev.js",
// "build": "webpack --config ./build/webpack.prod.js",
// "dev-build": "webpack --config ./build/webpack.dev.js"
// 修改为:
// "dev": "webpack-dev-server --config ./build/webpack.common.js",  
// "build": "webpack --env.production --config ./build/webpack.common.js", 添加--env.production这个全局变量 就可以接收到env参数的只所以为true 所以走下面的merge 打包线上环境
// "dev-build": "webpack --config ./build/webpack.common.js" 打包开发环境的话不给传全局变量 所以env参数接收不到 所以走else下面的merge



// 模拟一台服务器
// 安装  npm install http-server --save-dev
// 在package.json的script配置项中 添加
// "start": "http-server dist"

// PWA配置 Progressive Web Application
// PWA就是自己启动了localhost:8080端口,作为服务器网址,但是在自己断网的情况下服务器挂掉的情况下,还可以继续访问
// 安装 npm install workbox-webpack-plugin --save-dev
// const WorkboxPlugin = require('workbox-webpack-plugin')
// 在plugins:[
//     new WorkboxPlugin.GennerateSW({
//         clientsClaim:true,
//         skipWatiting:true
//     })
// ]


// webapck 关于TypeScript配置
// 配置好moudle项
// npm install ts-loader typescript --save-dev
// 项目最外层创建tsconfig.js配置文件
// npm install @types/lodash --save-dev



// webpack实现请求转发
// 接口开发处理
axios.get('http://www.dell-lee.com/react/api/header.json').then((res) => {
    console.log(res)
}) //因为练习自己是本地地址,这个是服务器地址,进行了跨域,这个服务器地址自己配置了可以让跨域请求

// 修改后  进行转发功能操作
axios.get('/react/api/header.json').then((res) => {
    console.log(res)
})
//在开发环境的devServer配置项中添加proxy配置项
// 重点:proxy配置项只能再devServer这个环境下配置  如果再生产环境不可以配置这个
// proxy: {
//     '/react/api': 'http://www.dell-lee.com'   //当你请求的地址是/react/api路劲下的 它就会帮默认请求的是http://www.dell-lee.com这个服务器接口,然后就会到http://www.dell-lee.com网址下拿到对应内容,然后再以localhost:8080/react/api/header.json这个接口返回来我,做了一层数据的转发
// }
// 下面更复杂的配置
// proxy:{
//     '/react/api':{
//         target:'http://www.dell-lee.com',   首先也一样去如果路劲是/react/api就去http://www.dell-lee.com接口服务器拿数据
//         pathRewrite:{
//             'header.json':'demo.json'  这个配置项就是可以转换请求的内容,本来是拿header.json的,可以改为拿demo.json,但是请求地址不用变
//         }
//     }       
// }
// bypass配置项
// proxy: {
//     '/react/api': {
//         target: 'http://www.dell-lee.com',
//         pathRewrite: {
//             'header.json': 'demo.json'
//         },
// 这个还可以 做一些拦截操作
//         bypass: function (req, res, proxyOptions) {就是说如果请求回来的是html 返回的就是html 不会返回数据给你,直接返回html放到页面中
//             if (req.headers.accept.indexOf('html') !== -1) {
//                 console.log('Skipping proxy for browser request.');
//                 return '/index.html';
//             }
//         }
//         changeOrigin:true   这个解决拿不到接口那边的内容 设置为true即可解决接口限制            
//     }
// },
// webapck 解决单页面应用问题
// 在devserver配置项下面添加 historyApiFallback: true 
// 也可以有多项
// historyApiFallback: {
// rewrites: [{    规则
//             from: /^\/$/, 定义输入路劲 
//             to: '/views/landing.html' 对应现实from访问路劲内容
//         },  
//     ]
// }
// 还有其他形式,看文档 不用写死的方式也有
// 这个只在本地有效。上线了的发服务器,必须得后端去apache 配置内容的devserver 添加historyApiFallback: true


// eslint 规范项目中的代码
// npm install eslint-loader --save-dev
// npm install eslint --save-dev
// npx eslint --init
// 选择第一项 Enter
// 选择第一项 Enter
// yes 
// 选javascript
// yes
//npm install babel-eslint --save-dev
// 在最外层生成文件中的.eslintr.js文件中
// "parser":"babel-eslint" 添加到module.exports={} 中
// 在vscode eslint 安装插件
// use: ['ts-loader','eslint-loader'],
// 在配置文件中 配置添加项   overlay:true 一旦代码规范出现问题,他就会在命令工具弹出一个层提示哪行代码需要规范
// options: {
//     fix:true   //设置为true 可以自动的把小部分的代码不规范自动修改
// }
// {
//     test: /\.tsx?$/,
//     use: ['ts-loader',{
//         loader:'eslint-loader',
//         options:{
//             fix:true
//         },
//         force:'pre'  //不管顺序如何 都先强制执行eslint-loader
//     }],
//     exclude: /node_modules/,
// }]
// },


// 提升webpack 打包速度


// 升级打包工具
// 在打包文件的时候可以用exclude include 约束
// exclude: /node_modules/,  这个是排出node_modules文件夹下的所有文件 不进行loader
// include: path.resolve(__dirname,'../src') 这个是指定src目录下才去使用某个loader
// 合理使用loader也可以提高loader模块的效率
// 尽量使用plugins官方的插件,尽可能的少使用

// resolve参数合理配置
// resolve:{
//     extensions:['.js','.jsx ']
// }
// 使用 DllPlugin 提高打包速度   插件打包的优化使用
// 在build文件夹下面创建webpack.dll.js文件
const path = require('path');
const webpack = require('webpack')
module.exports = {
    mode: 'production',
    entry: {
        vendors: ['loadsh'],
        react: ['react', 'react-dom', ]
    },
    output: {
        filename: '[name].dll.js',
        path: path.resolve(__dirname, '../dll'),
        library: '[name]' //暴露vendors library接收
    },
    plugins: [
        new webpack.DllPlugin({ //生成需要用到的插件
            name: '[name]', //名字
            path: path.resolve(__dirname, '../dll/[name].manifest.json')
        })
    ]
}
// 安装 npm install add-asset-htmk-webpack-plugin --save-dev
const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin'); //使用AddAssetHtmlWebpackPlugin
const fs = require('fs'); //引入js,拿到对应的文件,获取文件信息
const files = fs.readdirSync(path.resolve(__dirname, '../dll')); //读取到dll下面的文件
files.forEach(file => { //循环拿到生成的文件
    if (/.*\.dll.js/.test(file)) { //如果以.dll.js结尾的放到下面
        plugins.push(new AddAssetHtmlWebpackPlugin({
            filepath: path.resolve(__dirname, '../dll', file)
        }))
    }
    if (/.*\.manifest.json/.test(file)) { //如果以.manifest.json结尾的放到下面
        plugins.push(new webpack.DllReferencePlugin({
            filepath: path.resolve(__dirname, '../dll', file)
        }))
    }
    return plugins;
})
// 控制包文件大小

// 实现多页面打包
// new HtmlWebpackPlugin({
//         template: 'src/index.html', //生成页面 
//         filename: 'index.html' // 生成页面的名字
//         chunks: ['runtime', 'vendors', 'main'] // chunks 配置作用是,多个页面引入不同的js文件 比如说这个页面引入的是main.js文件
//     }),
//     new HtmlWebpackPlugin({
//         template: 'src/index.html', //生成页面 
//         filename: 'list.html' // 生成页面的名字
//         chunks: ['runtime', 'vendors', 'list'] // 这个是引入list.js文件
//     }),




// 入口文件
// entry:{
//     main:'./src/index.js',
//     list:'./src/list.js'
// }

//控制台打印信息 高亮显示  会有颜色标识
// npm install cli-highlight -g

原文链接:https://blog.csdn.net/weixin_42164539/article/details/93889982

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《webpack学习使用笔记
   

还没有人抢沙发呢~