webpack3入门学习

220 阅读4分钟

使用webpack前的准备

现在es2016越来越火了,前端模块化的构建思想已经深入人心。因此诞生webpack模块化打包工具,该工具不同于gulp,可以很好的以模块化的方式打包前端项目,Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件。

废话不多说,我们先开始webpack的准备工作,首先你需要安装node环境,然后切换到你的项目目录,执行以下命令

//全局安装
npm install -g webpack
//安装到你的项目目录
npm install --save-dev webpack

两种方式都可以。
网上很多博客都是webpack1或者2的,我最新也在学习webpack,所以我想分享下最新版的webpack的配置和打包。
项目目录结构如下

webpack-seed
│ index.template.html
│ package-lock.json
│ package.json
│ webpack.config.js

├─app
│ │ index.js
│ │
│ ├─font
│ ├─img
│ ├─js
│ │ module1.js
│ │ module2.js
│ │
│ ├─less
│ │ style.less
│ │
│ └─libs
│ plugin.js

└─dist

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};

这是最基础的配置,一个入口一个出口。

webpack基础配置

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
    devtool: 'inline-source-map', //开发调试用
    // entry: './src/index.js',
    entry: {
        app: './app/index.js',
        vendor: ['jquery', './app/libs/plugin']
    },
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    devServer: {
        contentBase: './dist',           //server指向地址
        port: 8080          //server端口默认为8080
    },
    module: {
        rules: [{
            test: /\.css$/,
            use: ['style-loader', 'css-loader']
        }, {
            test: /\.(png|svg|jpg|gif)$/,
            use: ['file-loader']
        }, {
            test: /\.(woff|woff2|eot|ttf|otf)$/,
            use: ['file-loader']
        }]
    },
    plugins: [
        new CleanWebpackPlugin('dist/*.*', {          //清空dist目录
            root: __dirname,
            verbose: true, //Write logs to console.
            dry: false // If true, remove files on recompile. // Default: false
        }),
        new webpack.BannerPlugin('vonnie 版权所有,翻版必究'),
        new HtmlWebpackPlugin({
            title: 'Getting start',
            // template: './index.template.html'       //创建模板html,支持ejs语法
        }),
        // new webpack.optimize.UglifyJsPlugin(), //压缩js代码
        new webpack.optimize.CommonsChunkPlugin({
            name: 'vendor' // 指定公共 bundle 的名称。
        })
    ]
}

这是我自己搭建的webpack脚手架配置,配置大多数和网上差不多。

webpack中的loaders配置

webpack3中的loaders的写法和1,2略有不同,常见的loader有css-loaders,style-loaders,还有预处理的less-loaders和sass-loaders。以及处理图片和字体资源的file-loaders。这些属于插件,使用前需要执行安装命令

npm install css-loader style-loader file-loader --save-dev

webpack-dev-server以及热更新

使用webpack打包后需要在server中运行web项目,所以我们需要启动一个server,webpack-dev-server插件。
执行webpack-der-server –open就能打开一个server,server的基本配置如下:

devServer: {
    contentBase: './dist',           //server指向地址
    port: 8080          //server端口默认为8080
},

webpack常用插件

webpack有很多的插件可以使用,这里我只介绍我所使用的插件,更多的插件请参考官方文档
html-webpack-plugin插件用来生成入口html页面,可以配置template指定模板路径,模板支持ejs的语法传递参数。
clean-webpack-plugin插件很简单就是清空木匾目录下的所有文件,每次打包使用新的打包文件。
另外着重介绍一下exports-loader这个插件,使用的时候我们这样引入

require("exports-loader?plugin!./libs/plugin.js");       //这一句代表往非模块化的js文件最后加入一句export["plugin"]

为什么会用到这个?当然是为了兼容一些老的库和插件,有的插件没有用到标准的模块化规范,那么在引入的时候我们直接import或者require就会报错,找不到模块,那么这么写就相当于在引入的文件的末尾加上一句export[“file”] = file;这样我们就能用require语句来引用这个模块了。或者你也可以在webpack.config.js中的loaders里面去引用。

webpack中碰到的错误和疑惑

常见的错误就是找不到模块和路径的问题,webpack查找路径是相对于入口文件来引入的,如果是npm的包,那么可以直接引入文件名例如jquery。
目前还有一个问题就是引入babel转译es6会报错,
ERROR in ./src/index.js
Module build failed: Error: Couldn’t find preset “@babel/preset-env” relative to directory
还需要多琢磨琢磨,后续会持续更新博客,本webpack的项目可以在clone到本地自己研究,github地址是: github.com/lspCoder/we…
欢迎star;

具体参考

Fork me on GitHub