webpack、git

144 阅读3分钟

git:

1、git 安装:

2、git config --global user.name "xxx"

3、git config --global user.email "邮箱"

4、生成密钥:ssh-keygen -t rsa -C "邮箱"

1:安装node.js

2:切换镜像仓库地址:npm install cnpm -g --registry=https://registry.npm.taobao.org

3:安装脚手架:cnpm install -g @vue/cli

运行本地webpack dist包:

1:全局安装serve这个服务,npm install -g serve

2:cmd 到dist目录下运行命令:serve

一、webpack基本配置:

查看 xxx的历史版本:npm info xxx versions

查看webpack的版本命令: npm info webpack versions

查看node-sass的版本命令npm info node-sass versions

1、初始化 npm

 npm init -y

2、本地安装webpack、webpack-cli(npm 命令行工具)

npm install webpack@version webpack-cli@version

npm install webpack@4.41.2 webpack-cli@3.3.10 -D

3、 打包index.js

npx webpack index.js

4、在index.html中引入:

 <body>
        <script src="./dist/main.js"></script>
  </body>

image.png

5、默认打包的文件夹:dist 、文件名main.js

6、修改用 npm 命令行工具打包:

 "build": "webpack"

image.png

二、修改打包的入口和出口

1、添加webpack.config.js文件:

webpack.config.js

image.png

2、在文件中添加内容:

const path = require('path')
module.exports = {
	entry: './src/index.js',
	output: {
		filename: 'bundle.js',
		path: path.resolve(__dirname, 'dist')
	}
      moduel: {
              rules:[]
             
        }
       plugins:[]

}

entry

1、单文件入口配置:

entry: './src/index.js',

2、多文件入口配置:

entry:{
 main:'./src/index.js',
 sub:'./src/index2.js'
}

output 1、单文件出口:

output: {
    //entry以对象的形式配置时,单文件入口,对象的key为打包文件的默认名字
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
	}

1、多文件出口:

output: {
    //对象的key为打包的文件名字 
    filename: '[name].js',
    //filename: '[name].[contenthash:8].js'
    path: path.resolve(__dirname, 'dist')
    //publicPath:'http://cdn.com' 配置包文本全路径
	}

[name]为占位符

moduel:模块配置项

rules:loader配置项

    test:匹配规则
    use:使用的loader,多个loader自低向上执行

plugins:插件配置

contenthash:8,文件的内容生成8位的hash值

三开发设置:

webpack-dev-server 本地开发运行:

1、安装:npm install webpack-dev-server@3.11.2

2、在package.json文件添加执行命令

"scripts": {
   //打包命令
  "build": "webpack",
  //本地执行
  "dev": "webpack-dev-server"
},

3、命令参数:

3-1:设置端口:--port 3000

3-2:在默认浏览器自动打开:--open

"dev": "webpack-dev-server --open --port 3000"

或者在webpack.config.js添加配置: `

module.exports = {
            devServer:{
                    open:true,
                    port: 8081
            }
         }

4、请求转发(跨域):proxy

proxy: {
	'/api': {
		target: 'http://localhost:3000',
		pathRewrite: { '^/api': '' },
		//开启https请求
                secure: false,
                //
		changeOrigin:true
	}
}

5、HMR热更新:解决状态丢失

1、配置:

devServer:{hot:true}

2、初始化插件:

plugins: [ new webpack.HotModuleReplacementPlugin()]

devtool 源代码调试工具配置项

//production
devtool:'cheap-module-source-map',
//development
devtool:'cheap-module-eval-source-map',

三、Loader

webpack默认处理模块文件后缀是js。

1、file-Loader:把文件移动到指定的文件夹中,

安装:

npm install file-loader -D 
module: {
		rules: [{
			test: /\.(png|jpg|gif)$/,
			use: [{
				loader: 'file-loader',
				options: {
                                    esModule: false,
                                    name: '[name].[ext]',
                                    outputPath:'src/assets/'
				}
			}]
		}]
	},

1-1、name:默认是文件内容的 MD5 哈希值:name: '[name].[ext]'保留文件原有的名字

1-2、outputPath: src/assets/表示在输出目录中的路径

1-3:esModule解决html中引用图片出现[module Object]

url-loader: 但如果文件小于字节限制,则可以返回 DataURL(Base64格式)否则把文件移动到指定的文件夹中:

解决的问题:减少小图片请求的次数。

安装:

npm install url-loader -D 

配置:

rules: [{
	test: /\.(png|jpg|gif)$/,
	use: [{
		loader: 'url-loader',
		options: {
                        esModule: false,
			name: '[name].[ext]',
			outputPath:'src/assets/',
			limit:24781
		}
	}]
	
}]

2、style-loader、css-loader 样式处理

安装:

npm install style-loader@1.0.1 css-loader@3.3.2 -D 

配置;

rules: [{
	 test: /\.css$/,
	use: ['style-loader', 'css-loader'],
}]
	

3、scss-loader 样式处理

安装:

npm install node-sass@4.13.0 sass-loader@8.0.2 -D

配置:

rules: [{
	 test: /\.scss$/,
	use: ['style-loader', 'css-loader', 'sass-loader'],
}]
	

4、postcss-loader:浏览器样式兼容CSS3,

autoprefixer:厂商前缀

安装:

npm install postcss-loader@4.2.0 autoprefixer@8.6.5  -D

配置:

rules: [{
	 test: /\.scss$/,
	use: ['style-loader', 'css-loader','postcss-loader', 'sass-loader'],
}]
	

添加postcss.config.js配置文件:

module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}

修改浏览器兼容版本:在package.json文添加配置:

使用分量大于1% 的2个版本 "browserslist":["> 1% ","last 2 versions"],

开启css模块化:

rules: [{
	 test: /\.scss$/,
	use: ['style-loader', 
        {
            loader:'css-loader'
            options:{
                moduel:true
            },
        'postcss-loader', 
        'sass-loader'],
}]
	

字体文件处理

rules: [{
    test:'/\.(eot|svg|woff)/',
    loader:'file-loader'
}]

5、babel: js代码编译器(ES6代码降级ES5)

1、安装:

npm install babel-loader @babel/core -D

2、配置:

rules:[{
	test: /\.js$/,
	exclude: /node_modules/,
	use: {
		loader: "babel-loader",
		options: {
			presets: ['@babel/preset-env']
		}
	}
}]

3、安装:

npm install @babel/preset-env --save-dev

4、babel处理ES6新特性:

在使用新特性的对应文件添加:

import '@babel/polyfill'

按需引入polyfill的配置:

rules:[{
	test: /\.js$/,
	exclude: /node_modules/,
	use: {
		loader: "babel-loader",
		options: {
			presets: [['@babel/preset-env',{
                        useBuiltIns:'usage',
                        corejs:3
                        }]]
		}
	}
}]

core.js:解决在每一个文件中都要导入: import '@babel/polyfill'

安装: npm install core-js@3.8.3 -D

polyfill的本质是在window实例上挂载对应的ES6方法

6、vue-loader(vue2.0)

1、安装:

npm install -D vue-loader@15.7.0 vue-template-compiler@2.6.14

2、配置:

{
	test:/\.vue$/,
	use:["vue-loader"]
},

3、样式处理:

// sasss
{
	test: /\.scss$/,
	use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'],
},
//css
{
	test: /\.css$/,
	use: ['style-loader', 'css-loader', 'postcss-loader'],
},

4、插件:

const VueLoaderPulgin=require('vue-loader/lib/plugin');

new VueLoaderPulgin(),

四、plugins

html-webpack-plugin:生成在根目录创建index.html,自动引入打包生成的index.js

1、安装:

npm install html-webpack-plugin@4.5.0

2、引入插件

 const HtmlWebpackPlugin = require('html-webpack-plugin');

3、配置插件

plugins: [
	new HtmlWebpackPlugin({
		template: path.resolve(__dirname, 'index.html')
	})
],

clean-webpack-plugin:打包之前清空根目录

1、安装:

 npm install clean-webpack-plugin

2、引入插件

 const {HtmlWebpackPlugin} = require('html-webpack-plugin');

3、配置:

plugins: [
        new HtmlWebpackPlugin()
]

ProgressPlugin:打包进度 1、引入插件:

const ProgressPlugin = require('webpack').ProgressPlugin;

2、配置:

plugins: [new ProgressPlugin()]

五:Tree Shaking 去除未引用代码

只支持ES Module模块化

ES Module 是静态引入、编译时引入

CommonJS 动态引入、运行时引入;

1、按需导入模块的方法

1、package.json添加:

"sideEffects":false

2、配置文件:

optimization: {
	usedExports: true
},

六:打包文配置:

1、配置文件:

正式环境配置文件:webpack.pro.js

开环境配置文件:webpack.dev.js

2、package.json:添加打包命令参数:

"scripts": {
	"build": "webpack --config webpack.pro.js",
	"dev": "webpack-dev-server --config webpack.dev.js"
},

七:js代码分割

optimization: {
	splitChunks: {
            chunks:"all"
        }
},

懒加载:

//异步加载
const Foo=()=>import('./foo.vue')
getFoo() {
	return import('lodash').then(res => {
		return res
	})
}
		
setTimeOut(()=>{
	getFoo().then((res)=>{
		console.log(res);
	})
},1000)

//同步加载
import Foo from './foo.vue'
import _ from 'lodash'

module(模块) chunk(代码块) bundle(代码包)

八:Css代码分割:mini-css-extract-plugin

正常情况下,style-loader会把css代码插到html的head中

mini-css-extract-plugin:是通过link的方式引入css文件

正式环境中使用css代码分割

1、安装: npm install --save-dev mini-css-extract-plugin

2、配置:

//1、引用插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
//2 添加匹配规则和处理的loader
{
    test: /\.css$/,
    use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'],
},
//3 实例化插件
plugins: [new MiniCssExtractPlugin()]

3、如果配置了Tree Shaking可能会导致 css文件没有加载: 修改package.json:让Tress Shaking忽略css文件 "sideEffects":[".*css"]

4、css代码压缩:

1、安装:

npm install --save-dev optimize-css-assets-webpack-plugin

配置:


const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");

optimization: {
    minimizer: [
      new OptimizeCSSAssetsPlugin({})
    ]
  },


九、浏览器缓存:

由于浏览器有缓存,同一个资源,就会从缓存里面取, 给打包文件添加hash值,hash值根据文件内容生成的,这样保证文件修改之后,名字每次都不一样。

output: {
    filename: '[name].[contenthash:8].js'
  }

十、 shim预置全局变量

解决不需要每一个页面都需要 import _ from 'ladash'

webpack 不推荐这样的方式

   plugins: [
    new webpack.ProvidePlugin({
      _: 'lodash'
     })