为了方便维护和交流,文档统一迁移到语雀: https://yuque.com/easy-team. 该文档不再更新维护

1. 安装

$ npm i easywebpack --save-dev

2. API

easywebpack 暴露了 WebpackBaseBuilder, WebpackClientBuilder, WebpackServerBuilder 三个对象.

image

可以通过继承扩展的方式实现前端框架的构建:

  • 继承 WebpackClientBuilder 创建前端浏览器渲染模式 Webpack 构建配置
  • 继承 WebpackServerBuilder 创建 Node 渲染(Server Side Render)模式 Webpack 构建配置

2.1 Webpack Class Builder

const EasyWebpack = require('easywebpack');
const WebpackBaseBuilder = EasyWebpack.WebpackBaseBuilder;
const WebpackClientBuilder = EasyWebpack.WebpackClientBuilder;
const WebpackServerBuilder = EasyWebpack.WebpackServerBuilder;
const EasyWebpack = require('easywebpack-vue');
const WebpackClientBuilder = EasyWebpack.WebpackClientBuilder;
const WebpackServerBuilder = EasyWebpack.WebpackServerBuilder;
const EasyWebpack = require('easywebpack-react');
const WebpackClientBuilder = EasyWebpack.WebpackClientBuilder;
const WebpackServerBuilder = EasyWebpack.WebpackServerBuilder;
const EasyWebpack = require('easywebpack-weex');
const WebpackWeexBuilder = EasyWebpack.WebpackWeexBuilder;
const WebpackWebBuilder = EasyWebpack.WebpackWebBuilder;
const EasyWebpack = require('easywebpack-html');
const WebpackClientBuilder = EasyWebpack.WebpackClientBuilder ;

2.2 Webpack 辅助对象 webpack, merge, Utils

const webpack = EasyWebpack.webpack;
const merge = EasyWebpack.merge;
const Utils = EasyWebpack.Utils;

2.3 Webpack 辅助构建 WebpackTool对象, build 方法 和 server 方法


// see `webpack-tool` npm plugin
const WebpackTool = EasyWebpack.WebpackTool;

// webpack build file to dist
const build = EasyWebpack.build;
build([clientConfig, serverConfig], (),  () => {
  console.log('wepback vue build finished');
});

// webpack building memory and start build reuslt ui navigation
const server = EasyWebpack.server;
server([clientConfig, serverConfig], (),  () => {
  console.log('wepback vue build finished');
});

3. 扩展实现

  • config 参数可以根据解决方案需求内置部分配置, 用户配置最终会与默认配置进行 merge 操作.
  • 具体扩展请见 API 文档. 下面扩展部分相同的代码可以抽离成基类,这里仅作为演示.

3.1 继承 WebpackClientBuilder 创建前端浏览器渲染模式 Webpack 构建配置

// ${root}/build/client.js
const EasyWebpack = require('easywebpack');
class WebpackClientBuilder extends EasyWebpack.WebpackClientBuilder {
  constructor(config) {
    super(config);
    // call below api custom client builder, this use vue example
    // 添加.vue 文件 extendsion
    this.setExtensions('.vue'); 
    // 添加框架node_modules 到 Webpack node_modules 查找路径
    this.setResolveLoader({ modules: [path.join(__dirname, '../node_modules')] }); 
    // 添加框架内置的 vue-loader 配置
    this.mergeLoader(require('../config/loader'));
    // 为 vue 添加别名
    this.setAlias('vue', 'vue/dist/vue.common.js', false);
  }
}
module.exports = WebpackClientBuilder;

获取 Webpack 原生配置: new WebpackClientBuilder(config).create()

3.2 继承 WebpackServerBuilder 创建 Node 渲染(Server Side Render)模式 Webpack 构建配置

该步骤非必需, 除非你要实现 Node Server Side Render 渲染

// ${root}/build/server.js
const EasyWebpack = require('easywebpack');
class WebpackServerBuilder extends EasyWebpack.WebpackServerBuilder {
  constructor(config) {
    super(config);
    // call below api custom server builder
    // 添加.vue 文件 extendsion
    this.setExtensions('.vue'); 
    // 添加框架node_modules 到 Webpack node_modules 查找路径
    this.setResolveLoader({ modules: [path.join(__dirname, '../node_modules')] }); 
    // 添加框架内置的 vue-loader 配置
    this.mergeLoader(require('../config/loader'));
    // 为 vue 添加别名
    this.setAlias('vue', 'vue/dist/vue.runtime.common.js', false);
  }
}
module.exports = WebpackServerBuilder;

获取 Webpack 原生配置: new WebpackServerBuilder(config).create()

4. 使用构建扩展方案

4.1 定义 WebpackBuilder config 参数

module.exports = {
  env: process.env.BUILD_ENV, // 打包模式
  entry:{
    //  src/page 目录下的 js 文件将作为 Webpack entry 入口
    include: [src/page/**.js] 
  }
}

4.2 编写构建入口执行文件

// ${root}/build/index.js
const EasyWebpack = require('easywebpack');
const clientConfig = require('./build/client');
const serverConfig = require('./build/server');

// Webpack 开发模式, 启动 Webpack dev server构建,
EasyWebpack.server([clientConfig, serverConfig]);


// Webpack构建编译文件到磁盘
EasyWebpack.build([clientConfig, serverConfig], () => {
  console.log('wepback build finished');
});

4.3 运行构建

  • package.json:
{
  "scripts": {
    "build:dev": "BUILD_ENV=dev node build",
    "build:prod": "BUILD_ENV=prod node build"
  }
}
  • bash run
npm run build:dev
npm run build:prod

5. 现有解决方案

在实现一个全新的解决方案时, 建议先把 easywebpack 文档熟悉一遍, 同时阅读已有解决方案实现方式