Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

ruanye/webpack

Open more actions menu

Repository files navigation

webpack 基础篇

webpack 安装

  • 安装本地的webpack
  • yarn add webpack webpack-cli -D
  • -D 表示development 开发环境

webpack 可以进行0配置

  • 目录结构

    • src
      • index.js
  • 直接运行 npx webpack

  • 打包工具 -> 输出后的结果(js模块)

  • 打包(直接js的模块化)

手动配置webpack

  • 默认配置文件的名字是webpack.config.js/webpackfile.js 通常使用webpack.config.js
  • webpack 是基于node编写的

* 配置脚本命令 package.json

  • -- config 指定默认文件是哪个
  • "build": "webpack --config webpack.config.js",
  • "dev": "webpack-dev-server"
  • "start":"npm run dev"
  • 这样就可以通过npm run dev/npm run build执行相关的命令

* 配置出口入口

  • entry 入口 可以是相对路径
  • output 出口 输出
    • path 输出路径 必须是绝对路径
    • filename: 输出的文件名字
module.exports={
  entry:'./src/index.js',
	output:{
	  path:path.resolve(__dirname,'dist'),
	  filename:'bundle[hash:6].js',
	  publicPath:'http://www.baidu.com'
	 }
}

�* 配置打包环境

  • mode �的值 2个值 development和 production
  1. development 开发环境
  2. production 生产环境
module.exports={
  mode:'development',
  ...
}

* 开发服务器配置

  • yarn add webpack-dev-server -D
devServer:{
  port:3000, #端口号
  contentBase:'./dist', #目录
  open:true, #是否自动打开浏览器
  progress:true, #显示进度条
  compress:true  #是否开启gzip压缩
  proxy:{
    //可以配置跨域
  }
 }

处理html

  • src

    • index.js
    • index.html
  • yarn add html-webpack-plugin -D

  • 当有插件的时候需要配置plugins 插件集合类型是数组

  • 每一个插件都是通过new来调用,例:new HtmlWebpackPlugin()

  • 可以运行npm run dev/npm run build 查看结果

{
  * template:'./src/index.html',//模板
  * filename:'index.html', //编译后的文件名 
  hash:true,//加hash值 
  minify:{ //压缩配置   
    removeAttributeQuotes:true, //去除双引号
    collapseWhitespace: true,  //折叠去除空格
  }
}

直接给文件加hash值

filename:'bundle[hash].js'
可以用:后面跟数字设置hash值的长度
filename:'bundle[hash:8].js'

处理样式

  • src

    • index.html
    • index.js
    • style.css
  • . index.js 通过require require('/style.css') 报错如下

You may need an appropriate loader to handle this file type
appropriate  合适的
�你可能需要一个合适的loader 
  • . 配置module,配置rules数组,表示很多规则,用正在匹配js、css等,rules里面配置不容的loader,每个loader的配置都是一个对象
module:{
  rules:[]
}

loader的配置方法 test 匹配规则 use 使用什么loader

  • use的用法
  1. 字符串 只能写一个loader use:'css-loader'
  2. 数组 可以写多个loader 数组里面可以放字符串和对象 css-loader 解析require/import 语法 style-loader 把css插入到header标签中

use:['style-loader','css-loader'] loader 的执行顺序是从右到左执行 从下到上

rules:[
 {
     test:'/\.css$/',//匹配以css结尾的文件
     use:[]
 }
]
  • .use 可以直接写loader,也可以写成对象,写对象的时候可以进行配置 yard add css-loader style-loader -D
 {
   loader:'style-loader',
    options:{
     insertAt:'top'  //css 放置位置可以决定css的优先级
  }
  • src

    • index.html
    • index.js
    • style.css
    • b.less
  • 配置less编译(less->css) 因为从右向左,从下到上执行 所以写在下边和右边 yarn add less less-loader -D

  • 编译sass node-sass sass-loader -D

  • 编译stylus stylus stylus-loader -D

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

抽离css

  • yarn add mini-css-extract-plugin -D
  • MiniCssExtractPlugin插件自带一个loader
  • MiniCssExtractPlugin.loader会自动把css抽离出来 作为引用的方式引入页面��
  new MiniCssExtractPlugin({
      filename: 'main.css' ##抽离出来的css的文件名
    })
  
  • 在loader里面的写法
  {
    test:/.css$/,
     MiniCssExtractPlugin.loader,
    'css-loader'
  }

使用postcss-loader,autoprefixer添加浏览器前缀

  • yarn add postcss-loader autoprefixer -D
{
  test:/\.less$/,
  use:[
     MiniCssExtractPlugin.loader,
    'css.loader',
    'less-loader',
    'postcss-loader'
  ]
}
  • 放到所有cssloader后面,执行顺序原因
 npm run dev 的时候会报错
 Error: No PostCSS Config found in: /Users/ruanye/Desktop/project/src
 没有找到postcss的默认文件 
  • 需要配置postcss默认文件 名字 在根目录下创建 postcss.config.js
  • postcss.config.js 文件里面的内容:
 module.exports={
    plugins:[require('autoprefixer')]
  }

* 配置优化项

  • yarn add optimize-css-assets-webpack-plugin uglifyjs-webpack-plugin -D optimize : 优化 assets :资源
optimization: { 优化
    minimizer: [
      new UglifyJsPlugin({
        cache: true, //缓存 
        parallel: true, //是否并发打包
        sourceMap: true // 源码映射
      }),
      new OptimizeCSSAssetsPlugin({})
    ]
  }
  • mode 改成 production
  • npm run build 打包之后 csss是压缩过的

处理js es6转化成es5

  • yarn add babel-loader @babel/core @babel/preset-env

@babel/core babel 核心模块 @babel-preset-env 标准语法转化成低级语法

  • presets 预设
  • 箭头函数 arrow-functions
  • class等(装饰器需要安装额外的插件) 并且添加plugins集合
  • yarn add @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators
{
  "plugins": [
    ["@babel/plugin-proposal-decorators", { "legacy": true }],
    ["@babel/plugin-proposal-class-properties", { "loose" : true }]
  ]
}
  • babel 插件中最常用的插件 promise genarater 需要 @babel/plugin-transform-runtime
  • yarn add @babel/plugin-transform-runtime 生产环境也需要runtime 不加-D yarn add @babel/runtime
  • es7的一些语法需要其他的 例如:inclueds 补丁包 yarn add @babel/polyfill require("@babel/polyfill")

配置需要解析和不需要解析loader的文件路径

  • include 包含 include:path.resolve(__dirname,'src'),
  • exclude 不包含 exclude:/node_modules/
{
       test:/\.js$/,
				use:{
					loader:'babel-loader',
					options:{
            ...
          },
				  include:path.resolve(__dirname,'src'),
			  	exclude:/node_modules/
        }

babel 也可以独立进行配置,文件名字.babelrc

  • 配置的时候loader 直接写成 use:'babel-loader',其他配置写在.babelrc里面
 {
   presets:['@babel/preset-env'],
   plugins:[
     ....
   ]
 }
  • 如果webpack options对babel-loader进行了配置 不需要.babelrc文件 如果有的就删除

js语法校验

  • yarn add eslint eslint-loader -D
  • eslint 官网 eslint.org
  • 添加enforce pre 强制先执行 previous 前置loader
  • 另一种配置方法 .eslint.js
  • .eslintignore elsint的忽略项
{
  test:'/\.js$/',
  loader:'eslint-loader',
  options:{
     enforce:'pre'
    }
}

第三方模块的使用 �

  • yarn add jquery
  • yarn add expose-loader -D
  • expose-loader 暴露全局的loader
  1. 内联loader的方式配置
  import $ from "expose-loader?$!jquery"
  1. 正常loader配置
{
  test:require.resolve('jquery'),
  loader:"expose-loader?$"
}
  • 在每个模块中注入$对象 不需要引入可以直接使用$这里window.$是undefined
  • 在plugins配置,ProvidePlugin webpack 自带插件
  • 自带插件都需要引入webpcak模块
let webpack = require('webpack')
...
 new webpack.ProvidePlugin({
      $:"jquery"
    })

配置忽略打包项

externals:{
    jquery:"jQuery"
}

在webpack中引入图片的几种方式

  • src
    • index.js
    • style.css
    • b.less
    • index.html
    • logo.png
  1. 在js中创建图片来引入 import logo from './logo.png'; let img = new image ; img.src = logo document.body.appengChild(img) 会在内存里面创建一个新的图片
You may need an appropriate loader to handle this file type
你需要一个合适的loader去处理这个文件类型
  1. 在css 引入 background(url)

  2. 需要把图片放到dist文件夹

图片处理

yarn add file-loader html-withimg-loader url-loader -D file-loader

{
  test:/\.(png,jpg,gif)$/,
  user:'file-loader'
}
  • 在html 引入图片打包会找不到文件 需要使用html-withimg-loader
{
  test:/\.html$/,
  user:'html-withimg-loader'
}
  • 在图片非常小的情况下不希望走http请求,一般情况下不会直接使用file-loader 通常我们使用url-loader
  • 在图片小于多少k的时候可以做一个限制,用base64来转化,base64大小会比原来文件大3分之1
  • limit 限制图片大小多大以内�转成base64 { test:/.(png,jpg,gif)$/, user:{ loder:'url-loader', options:{ limit:10000 表示多少字节 1024 字节是1kb } } }
  • url-loader 可以处理mp4|webm|ogg|mp3|wav|flac|aac
  • url-loder 可以处理各种字体格式 woff2?|eot|ttf|otf
{
     test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000
         
        }
      }

* 打包文件分类

  1. 图片loader的options 里面添加 options:{ limit:1000 outputPath:'/img/', }
  2. css 添加在css插件里面 new MiniCssExtractPlugin({ filename:'css/main.css' })
  3. js添加到filename 前面 filename:'js/main[hash].js',
  4. 添加域名 publicPath的用法
    output: { filename: 'bundle.js', path: path.resolve(__dirname, 'build'), publicPath:'http://www.baidu.cn' }
  • 如果只需要图片添加域名 options:{ limit:1, outputPath:'/img/', publicPath:'http://www.baidu.cn' }

webpack 配置篇

打包多页应用

  • 入口需要配置成对象
entry:{
		home:'./src/index.js'
		other:'./src/other.js'
	}
  • 出口需要多个出口,改变filename的写法 filename:'[name.js]'
  • 保证html页面引入自己对应的js 使用 chunks 代码块 来完成
    chunks:['home']
    如果home也许使用other chunks:['home','other']

配置soure-map源码映射

devtools:'source-map'

  • source-map 会单独生成一个sourcemap文件 可以帮我们调试源代码 会显示当前报错的列和行

  • eval-source-map 不会产生单独的文件 但是会显示报错的行和列

  • cheap-module-source-map 不会产生列 但是是一个单独的文件

  • cheap-module-eval-source-map 不会产生文件也不会产生列 会直接集成在文件里

实时编译

watch:true

  • 监控的选项
watchOptions:{ 
	poll:1000  //每秒问我多少次
	aggreatmentTimeout:500 //防抖 一直输入代码
	ignored:/node_modules/
}

webpcak 常用插件

  1. 清除缓存插件,可以写字符串 也可以写成数组 new CleanWebpackPlugin('./dist'),
  2. 拷贝插件 new CopyWebpackPlugin([ // {from:'img',to:'./'} ]),
  3. 版权插件 webpack自带插件 所有人需要写 let webpack = require('webpack') new webpack.BannerPlugin('make 2019 by ry')

webpack处理 跨域问题

  • webpack 自带express
  1. *代理的方式 重写的方式 把请求代理到express服务器上
  • target 访问http://localhost:3000 等于访问 当前服务器下面 '/api'
  • pathRewrite 重写路径 /api/user 等于访问 localhost:3000/user
 devServer:{
 ...
 proxy:{ // 
      '/api':{
         target:'http://localhost:3000',
         pathRewrite:{'/api':''}
       }// 配置了一个代理
   } 
}
  1. 直接使用webpack提供mock数据
  • webpack 提供一个方法 before
  • 参数是app app 就是 let app= express()
   before(app){  
       app.get('/user',(req,res)=>{
         res.json({name:'leilei'})
       })
    }
  1. 可以直接在node的服务端启动webpack 端口是服务端端口 不在需要npm run dev 来启动webpack
  • yarn add webpack-dev-middleware -D server.js修改如下
let webpack = require('webpack');

let middle = require('webpack-dev-middleware');

let config = require('./webpack.config.js');

let compiler = webpack(config);

app.use(middle(compiler));

resolve用法

extensions 拓展名 alias:别名 bootstrap:'bootstrap/dist/css/bootstrap.css' mainFields 可以配置先找哪个入口 mainFiles:入口文件的名字

resolve:{
 modules:[path.resolve('node_modules')],
    extensions:['.js','.css','.json','.vue'],
    mainFields:['style','main']
    mainFiles:[], // 入口文件的名字 index.js
    alias:{ 
       bootstrap:'bootstrap/dist/css/bootstrap.css'
    }
 }

区分环境

webpack.config.js改成 webpack.base.js 新建文件 webpack.prod.js 和 webpack.dev.js

  • 配置开发环境的写法
webpack.dev.js 
let {smart} = require('webpack-merge');
let base = require('./webpack.base.js');

module.exports = smart(base,{
   mode: 'development',
   devServer:{

   },
   devtool:'source-map'
})
  • 配置生产环境的写法
let {smart} = require('webpack-merge');
let base = require('./webpack.base.js');

module.exports = smart(base,{
   mode: 'production',
   optimization:{
     minimizer:[

     ]
   },
   plugins:[]
})

webpack 优化

  1. noparse module: { noParse: /jquery/, // 不去解析jquery中的依赖库 ... }

  2. dllplugin

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Morty Proxy This is a proxified and sanitized view of the page, visit original site.