美文网首页
入门Webpack4配置

入门Webpack4配置

作者: 指尖轻敲 | 来源:发表于2018-12-28 00:00 被阅读17次

    webpack是什么就不用多说,它的地位也显而易见,今天我从零开始学习配置一下,以及和之前的配置方法做下简单的比较。(虽然之前没有配置过,但是也看过相关内容)。

    准备工作

    先创建一个新的项目,安装基本的环境以及webpack。

    mkdir webpack-pro
    cd webpack-pro
    npm init -y
    npm i webpack --save-dev
    npm i webpack-cli --save-dev
    

    这是我们可以在package.json文件中配置我们执行的命令,

    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
      "build": "webpack"
    },
    

    入口与出口

    此时我们运行npm run build其实就是执行了对应的webpack命令。但是发现报错了,说找不到./src/index.js。之前版本的配置中需要指定webpack的入口和出口,现在可以不必配置了,会默认把项目中./src/index.js当做入口,./dist/main.js当做出口。这时只需要我们手动创建入口文件就可以了。

    console.log("test"); //随便写一行代码测试一下
    

    这时再执行npm run build发现项目中生成了./dist/main.js文件。但是如果我就是不想使用默认入口和出口呢,我应该怎么做呢?可以在配置执行命令的时候明确指定出入口。

    "build": "webpack ./src/app.js --output ./target/main.js"
    

    把之前生成的文件删掉,入口文件改为app.js再执行一次命令。发现生成的是我们指定的路径了。

    开发和生产环境

    我们在使用npm安装包的时候,有时候要加--save-dev有时候只加--save。这其实就是在package.json区分环境。如果不指定默认就是生产环境。

    "devDependencies": {
      "webpack": "^4.28.2",
      "webpack-cli": "^3.1.2"
    },
    "dependencies": {
      "axios": "^0.18.0"
    }
    

    webpack4也引入了生产和开发两个模式,我们可以这样重新配置一下scripts来指定模式,

    "scripts": {
      "build": "webpack --mode production",
      "dev": "webpack --mode development"
    }
    

    根据不同的环境执行不同的命令,会有不同的打包效果,我们分别测试一下,(我们就先改回使用默认的进出口文件)。

    npm run dev
    

    打包出来的文件代码是没有进行压缩的,适合我们开发过程中调试。而:

    npm run build
    

    打包出来的是进行压缩了的代码,体积更小,适合生产环境使用。

    babel的配置

    之前也写过一篇关于babel的文章(当然也是边学习边写,有错误的地方欢迎指出),这里babel的配置就不多说,主要看webpack的配置。
    但目前为止我们还没有使用webpack的配置文件,这里我们就使用一下,当然首先要安装babel必须的包和进行基本的配置。

    npm i @babel/core @babel/preset-env babel-loader --save-dev
    

    在根目录添加.babelrc配置文件

    {
      "presets": ["@babel/preset-env"]
    }
    
    1. 配置文件

    接下来我们就可以创建一个webpack的配置文件了webpack.config.js。这里指定对除了/node_modules目录下的js文件使用babel-loader进行编译。

    module.exports = {
      module: {
        rules: [
          {
            test: '/.js$/',
            exclude: /node_modules/,
            use: {
              loader: 'babel-loader'
            }
          }
        ]
      }
    };
    

    我们在入口文件中写个ES6的语法试一下:

    const arr = [1, 2, 3];
    

    执行npm run dev成功后查看目标文件中已经被转换成ES5的语法:

    eval("var arr = [1, 2, 3];\n\n//# sourceURL=webpack:///./src/index.js?");
    
    2. scripts配置

    其实指定使用特定的loader进行打包也可以在package.jsscripts中配置,但是这样命令就会越来越复杂,一些配置还是放在配置文件更好一些。

    "dev": "webpack --mode development --module-bind js=babel-loader"
    

    配置React项目

    我们只需要在之前配置的基础上添加一些配置就可以了,这里需要安装@babel/preset-react来进行react语法的转换,在.babelrc中进行配置:

    {
      "presets": ["@babel/preset-env", "@babel/preset-react"]
    }
    

    之前都还只是对js文件的编译,当然还需要一个对html文件编译的插件和loader,我们来下载一下:

    npm i html-webpack-plugin html-loader --save-dev
    

    这时重新对webpack配置文件进行配置,如果使用的jsx扩展,在配置loader的时候,多添加一个jsx匹配项就好了。然后我们配置html文件对应的插件和loader。

    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
      module: {
        rules: [
          {
            test: /\.(js|jsx)$/,
            exclude: /node_modules/,
            use: {
              loader: 'babel-loader'
            }
          },
          {
            test: /\.html$/,
            use: [
              {
                loader: 'html-loader',
                options: { minimize: true }
              }
            ]
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({
          template: './src/index.html',
          filename: './index.html'
        })
      ]
    };
    

    配置完成,我们来创建react的文件来测试一下:

    .src/index.html

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title>Document</title>
      </head>
      <body>
        <div id="app"></div>
      </body>
    </html>
    

    App.js

    import React from 'react';
    import ReactDOM from 'react-dom';
    const App = () => {
      return (
        <div>
          <p>React Test</p>
        </div>
      );
    };
    export default App;
    ReactDOM.render(<App />, document.getElementById('app'));
    

    ./src/index.js

    import App from './App';
    

    现在我们执行npm run dev看下效果,发现自动生成了./dist/index.html,而且此文件中自动引入了./dist/main.js脚本,根本不需要自己在html文件引用。我用浏览器查看生成的页面,react组件的内容显示出来了。搞定!

    CSS配置

    前面html和js都用到了,当然不能少了css文件的编译,同样的我们需要下载相关的插件和loader。

    npm i mini-css-extract-plugin css-loader --save-dev
    

    然后我们创建一个css文件,并且在在入口文件中引用它(记得给html标签加title类)。
    ./src/index.css

    .title {
      font-size: 30px;
    }
    

    ./src/index.js

    import App from './App';
    import style from './index.css';
    

    最后我们在配置文件中配置一下,和刚才html的配置基本类似:

    const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    ...
    {
      test: /\.css$/,
      use: [MiniCssExtractPlugin.loader, 'css-loader']
    }
    ....
    plugins: [
      new MiniCssExtractPlugin({
        filename: '[name].css',
        chunkFilename: '[id].css'
      })
    ]
    

    我们再次运行npm run dev,打包出来的html文件引入了对应的目标css文件,浏览器查看,样式生效。

    开发自动化

    经过前面的一些亲自测试,所有结果都没有什么问题了,But,每次修改文件之后都要重新打包,然后还得手动刷新浏览器,这些工作其实都可以实现自动化,这里用到webpack dev server。下载同之前一样,命令就不写了。
    下载完成之后,我们这时再次回到package.json文件进行配置:

    "dev": "webpack-dev-server --mode development --open"
    

    我们把之前的webpack命令换成了webpack-dev-server,此时就相当于给我们的项目创建了一个服务,并实现了代码热更新,我们在浏览器访问http://localhost:8080即可查看页面效果。我们修改一下页面代码(比如加一行字),保存之后浏览器自动刷新,效果呈现。
    --open参数就是在我们执行完npm run dev之后,自动帮我们打开浏览器访问http://localhost:8080。更多配置可以去查看具体的使用文档。

    相关文章

      网友评论

          本文标题:入门Webpack4配置

          本文链接:https://www.haomeiwen.com/subject/rjuukqtx.html