webpack

webpack是基于nodejs实现的,简单的说 Node.js 就是运行在服务端的 JavaScript(注:gulp和grunt也是基于node实现的项目构建工具)

简单地说webpack是一个静态模块打包工具(版本4.x)

一、webpack安装步骤

打包以后的代码css、html、js变成一行,并且删除注释,去掉分号

1. 全局安装

npm install webpack -g
npm install webpack-cli -g
脚手架工具,4.x必须安装两个

2. 初始化项目,生成一个package.json

npm init

3. 局部安装生成一个node_modules

npm install webpack -S
npm install webpack-cli -S
-D 就是 npm install --save-dev 安装到开发环境
-S 就是 npm install --save 安装到生产环境
-D 这样安装的包的名称及版本号就会存在package.json的devDependencies这个里面,而-S会将包的名称及版本号放在dependencies里面。

局部和全局都要安装一遍,不然出错

4. 打包

webpack(只能打包了js文件)
默认入口entry: src/index.js
默认出口output: dist/main.js

3.x和4.x区别在于:3.x 的时候是webpack a.js b.js 把a.js打包成 b.js,而4.x是有默认的入口文件和出口文件,只需要命令webpack即可

webpack --mode production 生产环境(默认)-----压缩
webpack --mode development 开发环境 ----------------未压缩
可以在package.json里边的scripts里边配置运行命令

{
  "dependencies": {
    "webpack": "^4.30.0",
    "webpack-cli": "^3.3.0"
  },
  "name": "webpack",
  "version": "1.0.0",
  "main": "index.js",
  "devDependencies": {},
  "scripts": {
    "start": "webpack --mode development"  
  },
  /*可以配置,之后运行命令就是npm run start*/
  "author": "",
  "license": "ISC",
  "description": ""
}

二、webpack配置
1. webpack本身是打包js的,如果想打包css、html、图片必须要进行相关配置

四个核心概念:入口(entry)、输出(output)、loader、插件(plugins)

2.配置文件(配置入口和出口文件)

命名:webpack.config.js

const path = require('path');
module.exports = {
    entry: './src/index.js',  //入口文件
    output: {
        path: path.resolve(__dirname, 'public'),   //出口文件默认dist,可以修改
        filename: 'bundle.js'  //文件名
    }
};
//打包后的代码在public/bundle.js
3.loader

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript),例如css和js、html、图片等文件

4.插件(plugins)

有效的打包和压缩css和js、html、图片等文件,一般loader和插件配合使用

三、本地服务(dev-server)

安装:npm install webpack-dev-server -S
配置webpack.config.js

const path = require('path');
module.exports = {
    entry: './src/index.js',  //入口文件
    output: {
        path: path.resolve(__dirname, 'public'),   //出口文件默认dist,可以修改
        filename: 'bundle.js'  //文件名
    },
    devServer:{
        contentBase:"./public",  //本地服务的路径
        inline:true //实时刷新
    } 
};

配置package.json

 "scripts": {
    "start": "webpack --mode development" ,
    "dev":"webpack-dev-server --open --inline" //open自动打开 inline自动刷新
  },

运行命令:npm run dev
之后只需要修改src里边的文件,webpack打包就可以
public文件中的index.html是自己建的,引入bundle.js

四、loader:加载程序

loader一览表:https://blog.csdn.net/keliyxyz/article/details/51649429

1.css 需要style-loader css-loader

下载:npm install style-loader css-loader -S
配置:webpack.config.js

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

此时打包到了public/bundle.js里边

2.图片,还需要下载 file-loader

下载:npm install file-loader -S
配置:webpack.config.js

module:{
   rules:[
        {
            test:/\.css$/,
            use: ['style-loader','css-loader']
        },
        {
            test:/(\.jpg|png|jpeg)$/,
            use: ['file-loader']
        },
   ]
}
五、插件 html-webpack-plugin

src文件夹:开发阶段(写代码)文件与要与打包后的public一一对应
index.html
index.js
style.css
1.jpg
...
public文件夹:生产阶段(项目上线)
index.html
index.js
style.css
1.jpg
...

1.使用 需要配置webpack.config.js
第一步:安装
npm install html-webpack-plugin -S
第二步:配置webpack.config.js(1.引入 2.配置)

const path = require('path');
const HtmlWebpackPlugin = require("html-webpack-plugin")   //引入
module.exports = {
    entry: './src/index.js',  //入口文件
    output: {
        path: path.resolve(__dirname, 'public'),   //出口文件默认dist,可以修改
        filename: 'bundle-[hash].js'  //文件名
    },
    devServer: {
        contentBase: "./public",  //本地服务的路径
        inline: true //实时刷新
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader','css-loader']
            },
            {
                test: /\.(jpg|png|jpeg)$/,
                use: ['file-loader']
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin()  //new操作符创建一个实例
    ]  
};

此时webpack以后,在public里边会多一个index.html,在index.html里边已经引入了bundle.js

plugins:[
        new HtmlWebpackPlugin({
            template:"./src/index.html",  //显示index.html里边的内容
            //filename:"a.html",  //修改默认文件,默认是index.html
            minify:{ //压缩文件
                removeAttributeQuotes:true,  //去除引号
                removecomments:true, //去除注释
                removeEmptyAttributes:true, //去除空属性
                collapseWhitespace:true  //去除空格
            }
        }) //new操作符创建一个实例
    ]

可以百度 HtmlWebpackPlugin查看配置
https://www.npmjs.com/package/html-webpack-plugin

六、更多关于loader的配置
1.之前关于图片的配置是针对style.css文件的,但是想再index.html里边添加img
  1. 下载html-withimg-loader
    npm install html-withimg-loader
  2. 配置webpack.config.js
module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader','css-loader']
            },
            {
                test: /\.(jpg|png|jpeg)$/,
                use: ['file-loader']
            },
            {
                test: /\.html$/,
                use: ['html-withimg-loader']
            }
        ]
2.字体图标
  1. 下载图标文件,例如bootstrap
  2. 配置webpack.config.js
{
     test: /\.(woff|svg|ttf|eot|woff2)$/,
     use: ['file-loader']  //字体文件
}

3.在src--->index.html使用图标


但此时webpack打包以后,public下的目录是乱的,可以设置参数

{
    test: /\.(woff|svg|ttf|eot|woff2)$/,
    use: 'file-loader?limit=1024&name=./fonts/[name].[ext]' //字体文件,可以指定文件夹名
 }

放入fonts文件下,文件保持文件名,后缀也保持一直,limit设置大小

3.分离css

插件:1>下载:npm install extract-text-webpack-plugin@next -S
2>配置(第一步引入,第二部配置)
在webpack.config.js

引入:

const ExtractTextPlugin = require("extract-text-webpack-plugin")

配置:

 new ExtractTextPlugin('./css/[name].css'),

还需要配置:

{
     test: /\.css$/,
    // use: ['style-loader','css-loader']   //css图片样式
    use:ExtractTextPlugin.extract({
           fallback:'style-loader',
           use:[{
              loader:'css-loader',
      }],
      publicPath:"../"    //会出现找不到图片或者字体文件
  })
},
4.babel-loader(为了浏览器支持ES6语法) v1版本

核心:babel-core
功能:babel-loader
babel-preset-env (babel-preset-es2015)
babel-preset-react (react有.jsx的语法)
下载:cnpm install babel-core babel-loader babel-preset-env babel-preset-react -S
配置:webpack.config.js

{
   test: /\.(jsx|js)$/,
   loader: "babel-loader",
  options: {
      presets: ["env", "react"]
    },
   exclude: /node_modules/ . //不包含统计的node_modules文件夹
},

在public中的js打包以后的代码中let 转换成 var

5.babel-loader 配置 v2版本

新增.babelrc文件和webpack.config.js同级
.babelrc

{
    "presets":['env','react']
}

把webpack.config.js里边的options删除即可(推荐v2版本写法)

6.引入第三方库

在3.0时候需要配置,但4.0以后不需要配置
npm install jquery -S默认下载最新版本,也可以指定版本
npm install [email protected] -S

在js文件中需要引入,然后直接写jquery语法

import '../css/style.css';
import '../css/bootstrap.css';
import $ from 'jquery'

$("div").css("background-color","red")
let a = 10;
console.log(a)

模块化开发
https://www.jianshu.com/p/3832c00a44a7

你可能感兴趣的:(webpack)