webpack基本配置


webpack基本配置

webpack依赖于npm环境,然而npm又依赖于node,所以需要在官网下载node,推荐下载安装版,会自动配置好环境并且绑定好了npm

下载完成后,由于npm默认镜像源是国外,因此下载会很慢,所以需要更改镜像地址

第一步:在cmd窗口输入以下命令

npm config set registry https://registry.npm.taobao.org/

第二步:输入 npm config get registry命令

npm config get registry

第三步:安装淘宝镜像源

npm install -g cnpm --registry=https://registry.npm.taobao.org

接下来便可以安装webpack以及各种架包了

webpack打包文件

所用到的所有loader开发版本:

"css-loader": "^2.0.2",
"file-loader": "^3.0.1",
"less": "^3.9.0",
"less-loader": "^4.1.0",
"style-loader": "^1.2.1",
"url-loader": "^1.1.2",
"webpack": "^3.6.0"

可以直接使用命令

webpack 打包的主文件 打包到的位置

例如:

webpack ./src/main.js dist/bundle.js

配置webpack.config.js文件

在该文件下可以设置好入口函数和出口函数,这样webpack打包时就不需要指定路径,可以直接使用以下命令:

webpack

webpack.config.js配置如下:

const path = require('path')
// path是node的一个模块

module.exports = {
    entry: './src/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js'
    }
}

因为配置文件要求path必须为绝对路径,所以需要用到node的path模块,因此需要将node初始化

npm init

此后便可以直接使用webpack命令进行打包文件了

npm run webpack

很多时候全局安装的webpack并不支持项目中的webpack,因此往往都在项目环境中安装一个局部webpack

npm install webpack@3.6.0 --save-dev

这样我们可以在package.json中的script模块设置我们的快捷命令

{
  "name": "meetwebpack",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC"
}

webpack打包css文件

首先,需要先安装 css-loader

npm install --save-dev css-loader

接着,安装 style-loader

npm install --save-dev style-loader

配置webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ["style-loader", "css-loader"],//注意:顺序很重要!
      },
    ],
  },
};

Options

配置config时,一定要注意,那就是use语句是从后到前,所以一定要将css-loader放在前面,不然会报错:

Module build failed: CssSyntaxError

接着在main.js文件中引入css文件

require('../css/normal.css');

打包less文件

与打包css文件相似,我们需要先安装相应的loader

从官网可以查看命令

需要先安装 lessless-loader

npm install less less-loader --save-dev

然后便和css打包过程一样

webpack.config.js配置:

const path = require('path')
// path是node的一个模块

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js'
    },
    module: {
        rules: [
            {
                test: /\.less$/i,
                loader: [
                    // compiles Less to CSS
                    'style-loader',
                    'css-loader',
                    'less-loader',
                ],
            },
        ],
    },

}

webpack打包图片

首先需要安装url-loader:

npm install url-loader --save-dev

url-loader是将图片转换为base64编码格式进行文件引入,但是其有一个limit属性,用于限制图片的大小(字节),如果超过这个限制的图片在进行打包时就会报错

此时需要引入另一个file-loader

npm install file-loader

在引入file-loader后,如果事先已经配置了url-loader,那么便不需要再额外配置file-loader

官方文档是这样解释的:

指定文件的最大体积(以字节为单位)。 如果文件体积等于大于限制,默认情况下将使用 file-loader 并将所有参数传递给它。

接着在webpack.config.js中进行配置

const path = require('path')
// path是node的一个模块

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js'
    },
    module: {
        rules: [
            {
                test: /\.(png|jpg|gif|jpeg)$/i,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8192,
                        },
                    },
                ],
            },
        ],
    },

}

当使用file-loader打包文件后,会将文件放入实现规定好的文件夹中,也就是dist文件夹。但是默认情况下webpack会将生成的路径直接返回给使用者,因此,我们需要在路径下添加一个dist/

添加方法是在webpack.config.js中添加publicPath属性

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js',
        publicPath: 'dist/'
    }
}

很多时候我们想让生成的图片更有规范,这个时候可以在file-loader的options添加name配置

  • img : 文件要打包到的文件夹
  • name : 获取图片原来的名字,放在该位置
  • hash:8 : 为了防止图片名称冲突,依然使用hash ,但是我们只保留8位
  • ext : 使用图片原来的扩展名
const path = require('path')
// path是node的一个模块

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js',
        publicPath: 'dist/'
    },
    module: {
        rules: [
            {
                test: /\.(png|jpg|gif|jpeg)$/i,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8192,
                            name: 'images/[name].[hash:8].[ext]'
                        },
                    },
                ],
            },
        ],
    },

}

webpack将ES6转为ES5

首先安装环境

npm install --save-dev babel-loader@7.1.5 babel-core@6.26.3 babel-preset-es2015@6.24.1

配置webpack.config.js文件

module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['es2015']
        }
      }
    }
  ]
}

Vue相关

npm引入Vue

因为在后续的工作中还需要用到Vue,所以并不是开发时依赖

安装环境:

npm install vue --save

默认安装时是runtime-only,即不可以有任何的template

我们需要的是runtime-compiler,可以有template因为有compiler可以用于编译template

所以需要切换默认使用的版本

在webpack.config.js里面加上下面的代码

const path = require('path')
// path是node的一个模块

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js',
        publicPath: 'dist/'
    },
    //注意与entry和output同级
    resolve: {
        alias: {
            'vue$': 'vue/dist/vue.esm.js' // 用 webpack 1 时需用 'vue/dist/vue.common.js'
        }
    }

}

.vue文件封装处理

安装vue编译环境

npm install vue-template-compiler vue-loader

plugin插件

添加版权的plugin

该插件是webpack自带的插件

第一步,定义webpack

const webpack = require('webpack');

第二步,配置

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js',
        publicPath: 'dist/'
    },
    plugins: [
        new webpack.BannerPlugin('最终版权归JSW79所有')
    ]
}

注意plugins是以数组的形式定义,并且和entry和output同一个等级

打包html的plugin

该插件可以打包html,将所有的文件放入指定文件夹,在文件夹中生成index.html,同时将生成的js文件自动插入到html中

第一步,npm引入

npm install html-webpack-plugin --save-dev

第二步,定义html-webpack-plugin

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

第三步,配置webpack.config.js

plugins: [
        new HtmlWebpackPlugin({
            template: 'index.html'
        })
    ]

第四步,因为配置html文件和资源文件在一个文件夹,故删去配置的相对地址

publicPath: 'dist/'

压缩js的plugin

webpack有自带的压缩js的插件,但是在脚手架2会报错,这里使用另外一个插件

第一步,npm引入

npm install uglifyjs-webpack-plugin@1.1.1 --save-dev

第二步,定义uglifyjs-webpack-plugin

const uglifyjswebpackplugin = require('uglifyjs-webpack-plugin');

第三步,配置webpack.config.js

plugins: [
        new uglifyjswebpackplugin()
    ]

搭建本地服务器

webpack提供了一个可选的本地服务器,可以自动编译开发文件,并将文件暂存于内存中

第一步,npm引入

npm install webpack-dev-server@2.9.1 --save-dev

第二步,配置webpack.config.js

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js',
    },
    devServer: {
        contentBase: './dist',
        inline: true
    }
}

devserver有4个属性

  • contentBase :为哪一个文件夹提供本地服务,默认是根文件夹,我们这里要填写./dist
  • port :端口号
  • inline :页面实时刷新
  • historyApiFallback :在SPA页面中,依赖HTML 5的history模式

第四步,配置package.json,添加命令

"dev": "webpack-dev-server --open"

--open为自动打开浏览器

开发与发布文件分离

很多时候开发插件会与正式发布文件会有冲突,比如压缩代码,在开发时就不需要,但在运行时需要,这时候就需要分离

第一步:npm引入

npm install webpack-merge@4.1.5 --save-dev

第二步:分离文件

将开发文件与正式文件进行分离

如正式文件:

prod.config.js

const uglifyjswebpackplugin = require('uglifyjs-webpack-plugin');
const webpackMerge = require('webpack-merge');
const baseConfig = require('./base.config')

module.exports = webpackMerge(baseConfig, {
    plugins: [
        new uglifyjswebpackplugin()
    ]
})

开发文件:

dev.config.js

const webpackMerge = require('webpack-merge');
const baseConfig = require('./base.config')

module.exports = webpackMerge(baseConfig, {
    devServer: {
        contentBase: './dist',
        inline: true
    }
})

共同需要的文件:

base.config.js

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const uglifyjswebpackplugin = require('uglifyjs-webpack-plugin');
// path是node的一个模块

module.exports = {
    entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js',
    },
    module: {
        rules: [
            {
                test: /\.css$/i,
                use: ["style-loader","css-loader"],
            },
            {
                test: /\.less$/i,
                loader: [
                    // compiles Less to CSS
                    'style-loader',
                    'css-loader',
                    'less-loader',
                ],
            },
            {
                test: /\.(png|jpg|gif|jpeg)$/i,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8192,
                            name: 'images/[name].[hash:8].[ext]'
                        },
                    },
                ],
            },
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015']
                    }
                }
            },
            {
                test: /\.vue$/,
                use: ['vue-loader']
            }
        ],
    },
    resolve: {
        extensions: ['.js', '.css', '.vue'],
        alias: {
            'vue$': 'vue/dist/vue.esm.js' // 用 webpack 1 时需用 'vue/dist/vue.common.js'
        }
    },
    plugins: [
        new webpack.BannerPlugin('最终版权归JSW79所有'),
        new HtmlWebpackPlugin({
            template: 'index.html'
        }),
    ],
}

第三步:配置package.json,修改默认打开的配置文件

"build": "webpack --config ./build/prod.config.js",
"dev": "webpack-dev-server --config ./build/dev.config.js"

第四步,修改默认输出位置

之前的输出是因为config.js和dist文件夹在同一级目录,所以设置为./dist

现在dist在上一级目录,所以需要../dist

entry: './src/js/main.js',
    output: {
        path: path.resolve(__dirname, '../dist'),//__dirname是当前目录的绝对路径
        filename: 'bundle.js',
    },