webpack配置打包
一、webpack基本安装
1、创建webpack项目目录如webpackDemo,并进入webpackDemo;
2、 在node已经安装的前提下,打开命令行控制器,输入如下命令:
- npm init -y
- npm install webpack webpack-cli --save-dev //安装webpack webpack-cli
(MacOS: sudo npm install webpack webpack-cli -g,sudo npm isntall webpack webpack-cli --save-dev)
命令执行结束后,会生成package.json、package_lock.json、node_modules文件。然后手动创建src目录与package.json平级,src目录下有index.html ,index.js 。
注:npm使用的是淘宝镜像,使用命令 npm install --registry=https://registry.npm.taobao.org express (临时使用);
(MacOS 如果上面命令不生效,可以使用此命令: npm config set registry https://registry.npm.taobao.org).
二、webpack概念
1、 webpack有四个核心概念:entry(入口) 、output(输出)、loader、plugin(插件)。
entry(入口)
告诉webpack构建内部依赖图开始的模块;可以指定单入口起点文件或多入口起点文件。
- module.exports = {
- entry:"./src/index.js"
- }
output(输出)
告诉webpack输出创建的bundles,以及如何命名文件。指定编译后的输出文件路径。
- const OUTPUT_FILE_NAME = "dist"
- module.exports = {
- entry:"./src/index.js",
- output: {
- filename: "[name].[contenthash:10].js", //输出文件名称, hash解决缓存问题
- path: path.resolve(__dirname,'dist') //输出文件路径
- }
- }
loader
loader可以让webpack可以处理非JavaScript文件,webpack本身只能处理JavaScript。
webpack配置loader有两个目标:
a). test属性,用于被对应的loader进行转换的某个和某些文件;
b). use属性,表示进行转换时,应该使用哪个loader;
- module.exports = {
- output: {
- filename: "[name].[contenthash:10].js", //输出文件名称, hash解决缓存问题
- path: path.resolve(__dirname, OUTPUT_FILE_NAME) //输出文件路径
- },
- module: {
- rules: [{
- //整理html的img资源,
- test: /\.html$/,
- use: ["html-loader"]
- },
- {
- //处理css资源
- test: /\.css$/,
- use: ["css-loader", "style-loader"]
- },
- {
- //处理JS资源
- test: /\.jsx?$/,
- use: ['file-loader']
- }]
- }
- }
插件plugins
loader用于转换某些类型,插件用于执行更广泛的任务。若使用一个插件,只需require(),然后添加到数组中。
- module.exports = {
- ...,
- plugins: [
- new HtmlWebpackPlugin({
- template: "./src/index.html",
- hash: true
- }),
- new MiniCssExtarctPlugin({
- filename: 'css/[name].[contenthash:10].css',
- path: path.resolve(__dirname,'dist')
- })
- ]
- }
附全部代码:
package.json
- {
- "name": "webpack_demo",
- "version": "1.0.0",
- "description": "",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "watch": "webpack --watch",
- "start": "webpack --config webpack.config.js",
- "build": "webpack --config webpack.config.pro.js"
- },
- "keywords": [],
- "author": "",
- "license": "ISC"
- }
webpack.config.js
- const path = require("path");
- const HtmlWebpackPlugin = require("html-webpack-plugin");
- const MiniCssExtarctPlugin = require("mini-css-extract-plugin"); //将css从js中提取出来
- const OUTPUT_FILE_NAME = "dist";
- module.exports = {
- entry: "./src/index.js",
- output: {
- filename: "[name].[contenthash:10].js", //输出文件名称,hash解决缓存问题,具体可见下面的解释
- path: path.resolve(__dirname, OUTPUT_FILE_NAME) //输出文件路径
- },
- mode: "development", //开发环境,生产环境使用"production"
- module: {
- rules: [{
- //整理html的img资源,
- test: /\.html$/,
- use: ["html-loader"]
- },
- {
- //处理css资源
- test: /\.css$/,
- use: [
- //将css文件整合到JS文件中
- "css-loader",
- //创建style标签,将样式放入
- "style-loader",
- // css兼容性处理:postcss-->postcss-loader postcss-preset-env
- ]
- },
- {
- //处理JS资源
- test: /\.js$/,
- exclude: /node_modules/, //处理除了nodde_modules里的js文件
- loader: 'babel-loader' //用babel-loader处理
- },
- {
- //处理图片资源
- test: /\.(png|svg|jpg|gif)$/,
- use: ['file-loader']
- },
- {
- // exclude: /\.(css|js|html)$/, //排除正则内的资源
- test: /\.(png|svg|jpg|gif)$/,
- // 这里是匹配条件,每个选项都接收一个正则表达式或字符串
- // test 和 include 具有相同的作用,都是必须匹配选项
- // exclude 是必不匹配选项(优先于 test 和 include)
- // 最佳实践:
- // - 只在 test 和 文件名匹配 中使用正则表达式
- // - 在 include 和 exclude 中使用绝对路径数组
- // - 尽量避免 exclude,更倾向于使用 include
- use: ['file-loader'],
- // options: {
- // name: "[hash:10].[ext]" //名字太长进行截取
- // }
- }
- ]
- },
- resolve: {
- extensions: ['.js', '.json']
- },
- /*
- source-map:外联
- inline-source-map :
- */
- devtool: "source-map", //告诉webpack提供源代码
- plugins: [
- // 将CSS文件从JS文件中提取出来
- new MiniCssExtarctPlugin({
- filename: 'css/[name].[contenthash:10].css',
- path: path.resolve(__dirname, OUTPUT_FILE_NAME)
- }),
- new HtmlWebpackPlugin({
- template: "./src/index.html"
- })
- ],
- devServer: {
- port: 5000, //端口号
- contentBase: OUTPUT_FILE_NAME, //可访问问文件
- hot: true, //开启HMR热更新
- https: true, //使用https
- compress: true, // 启用压缩
- // proxy: {
- // "/": "http://localhost:3000", //使用代理路径
- // }
- },
- /** code splitting 代码分割
- * 当单入口时,可以将 node_modules中代码单独打包成一个chunk;
- * 当多入口时,提取公共文件单独打包成一个chunk;
- */
- optimization: {
- splitChunks: {
- chunks: "all"
- }
- }
- /**
- * 缓存:
- * Babel缓存
- * cacheDirectory:true
- * -->让第二次打包更快
- * 文件资源缓存:
- * hash :每次webpack构建是会生成一个唯一的hash值;
- * 问题:js和css使用同一个hash值,会导致缓存失效,可能值改变一个文件;
- * chunkhash:根据chunk生成的hash值,如果打包来自同一个chunk,那么hash是一样的
- * 问题:chunkhash是一样的,因为css是在js中被引用的,属于同一个chunk;
- * contenthash:根据文件内容生成hash值,不同文件的hash值不一样;
- * -->让代码上线运行缓存更好使用
- *
- */
- /**
- * tree shaking:去除无用代码
- * 前提: 1.必须使用ES6模块化 2.开启production环境
- * 作用: 减少代码体积
- *
- * 在package.json中设置:
- * sideEffects:false 所有代码都没有副作用(都可以进行tree shaking)
- * 问题:可能会把css @babel/polyfill(副作用)文件干掉
- * sideEffects:["*.css",".less"] 不会进行tree shaking
- */
- /**
- * HMR :hot module replacement 热模块
- * 作用:一个模块发生变化指挥重新打包这个模块,并不重新打包所有。提高打包速度。
- * 样式文件:可以通过HMR实现,style-loader已实现
- * JS文件:默认不使用HMR功能-->修改JS文件代码,只能处理非入口文件。
- * if(module.hot){
- * module.hot.accept("index.js",()=>{
- * //监听文件变化,一旦发生变法,其他地方不会重新打包,直接执行回调
- * }))
- * }
- * Html文件:默认不使用HMR功能,同时会出问题(无需做HMR功能)
- * 解决方案:修改entry入口,引入html文件
- *
- *
- */
- }
wenpack.config.pro.js
- const path = require("path");
- const HtmlWebpackPlugin = require("html-webpack-plugin");
- const MiniCssExtarctPlugin = require("mini-css-extract-plugin"); //将css从js中提取出来
- const OptiminizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin"); //压缩CSS
- const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
- const OUTPUT_FILE_NAME = "dist";
- module.exports = {
- entry: "./src/index.js",
- output: {
- filename: "js/[name].[contenthash:10].js", //输出文件名称,hash解决缓存问题,具体可见下面的解释
- chunkFilename: 'js/[name].[contenthash:10].bundle.js', // 依赖文件名称
- path: path.resolve(__dirname, OUTPUT_FILE_NAME), //输出文件路径
- publicPath: '/' // 公共路径
- },
- mode: "production", //生产环境
- module: {
- rules: [{
- test: /\.html$/,
- use: ["html-loader"]
- },
- {
- test: /\.css$/,
- use: [MiniCssExtarctPlugin.loader, "css-loader"]
- },
- {
- test: /\.jsx?$/,
- exclude: /node_modules/, //处理除了nodde_modules里的js文件
- loader: 'babel-loader' //用babel-loader处理es6
- },
- {
- test: /\.(png|svg|jpg|gif)$/,
- use: ['file-loader'],
- }
- ]
- },
- devtool: "source-map", //告诉webpack提供源代码
- plugins: [
- new HtmlWebpackPlugin({
- template: "./src/index.html",
- hash: true
- }),
- new MiniCssExtarctPlugin({
- filename: 'css/[name].[contenthash:10].css',
- path: path.resolve(__dirname, OUTPUT_FILE_NAME)
- }),
- /**
- * optimize-css-assets-webpack-plugin 会使webpack中自带的JS压缩失效,需要重新配置UglifyJsPlugin
- */
- new OptiminizeCssAssetsPlugin(),
- ],
- /** code splitting 代码分割
- * 当单入口时,可以将 node_modules中代码单独打包成一个chunk;
- * 当多入口时,提取公共文件单独打包成一个chunk;
- */
- optimization: {
- splitChunks: {
- chunks: "all"
- }
- }
- }
webpack配置打包的更多相关文章
- webpack配置打包vue文件
1.首先全局安装node,和npm.检查是否安装成功 2.新建一个文件下,进入该文件夹. 前先执行 npm init -y 然后就会在文件夹下出现一个package.json文件 然后执行 npm i ...
- webpack配置:less/sass文件打包和分离、自动处理css前缀、消除未使用的css及完整的webpack.config.js文件
一.less文件打包和分离 1.要使用less,首先使用npm安装less服务:还需要安装Less-loader用来打包使用. npm install less --save-dev npm inst ...
- VUE 多页面打包webpack配置
思路:多配置一个main的文件,用于webpack入口使用, 然后路由的导向也应该默认指向新组件,最后通过webpack构建出一个新的独立的html文件. 缺点:生成多个html会new出多个vu ...
- webpack配置自动打包重新运行npm run dev出现报错
webpack配置自动打包重新运行npm run dev出现报错 运行npm run dev出现如下报错 Listening at http://localhost:8080(node:2328) U ...
- webpack项目打包配置
webpack.config.js 文件中,其中“plugins”最为重要 var path = require("path"); const webpack = require( ...
- [webpack] 配置react+es6开发环境
写在前面 每次开新项目都要重新安装需要的包,简单记录一下. 以下仅包含最简单的功能: 编译react 编译es6 打包src中入口文件index.js至dist webpack配置react+es6开 ...
- webpack入门和实战(一):webpack配置及技巧
一.全面理解webpack 1.什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都 ...
- Webpack配置示例和详细说明
/* * 请使用最新版本nodejs * 默认配置,是按生产环境的要求设置,也就是使用 webpack -p 命令就可以生成正式上线版本. * 也可以使用 webpack -d -w 命令,生成用于开 ...
- vue-cli#2.0 webpack 配置分析
目录结构: ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-s ...
- webpack独立打包与缓存处理
关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 先前写了一篇webpack入门的文章<webpack入门必知必会>,简单介绍了webpa ...
随机推荐
- 【Kubernetes】kubectl常用命令手册 -- 持续更新
元信息 api列表: kubectl api-resources kubectl api-resources -o wide 用法查询: kubectl explain <>.<&g ...
- 【EF Core】主从实体关系与常见实体关系的区别
上次老周扯了有关主.从实体的话题,本篇咱们再挖一下,主.从实体之间建立的关系,跟咱们常用的一对一.一对多这些关系之间有什么不同. 先看看咱们从学习数据库开始就特熟悉的常用关系--多对多.一对一.一对多 ...
- UE4构建基础和实践:一、概述
序言 构建这个概念是和应用程序包及资源等相关的,它的特点是使用脚本控制一系列的任务的处理,以减少人力操作带来的成本和操作失误风险. 在UE的概念里,构建往往是和打包相关的(如编译.cook.压缩打包等 ...
- jquery解决跨域问题
在Ajax请求的url不是本地或者同一个服务器下面的URI,最后虽然请求显示为200,但是不会返回任何数据,事实上简单来说请求同一个域名下的url或者说用不带http的绝对路径和相对路径请求是没有任何 ...
- DataGridView 控件分页
在使用Winform开发桌面应用时,工具箱预先提供了丰富的基础控件,利用这些基础控件可以开展各类项目的开发.但是或多或少都会出现既有控件无法满足功能需求的情况,或者在开发类似项目时,我们希望将具有相同 ...
- AMH安装Nextcloud出现Access denied
AMH部署了LAMP或者LNMP,然后常规安装Nextcloud,安装完成后跳转到首页就出现Access denied.Nextcloud的文件夹权限已经修改,可读写.http://127.0.0.1 ...
- 【Oracle】 instr函数与substr函数以及自制分割函数
Oracle instr函数与substr函数以及自制分割函数 instr通常被用来作为判断某个字符串中是否含有执行字符串和将返回结果作为一些数据分割的数据,即有模糊查询like的作用,当返回的查询结 ...
- DHorse v1.3.0 发布,基于k8s的发布平台
综述 DHorse是一个简单易用.以应用为中心的云原生DevOps系统,具有持续集成.持续部署.微服务治理等功能,无需安装依赖Docker.Maven.Node等环境即可发布Java.Vue.Reac ...
- 古早wp合集
0x00 首先非常感谢大家阅读我的第一篇.本文章不仅仅是题解,一些细枝末节的小问题也欢迎大家一起解答. 小问题的形式如Qx:xxxxxxx? 欢迎发现小问题并讨论~~ N1nE是本人另外一个名字,目前 ...
- 带你读论文丨S&P2019 HOLMES Real-time APT Detection
本文分享自华为云社区<[论文阅读] (09)S&P2019 HOLMES Real-time APT Detection(溯源图)>,作者: eastmount . 摘要 本文提出 ...