准备工作
目录结构如下:
-- Project
|-- lib // 打包之后的文件
|-- src
|-- index.js // js 入口
|-- .babelrc // babel 配置文件
|-- .gitignore
|-- webpack.config.js // webpack 配置文件
|-- package.json
|-- readme.md
webpack 配置
这里使用的是 webpack2
,与 webpack1
没有太多不一样的地方,注意 module.loaders
变成了 module.rules
。入口文件位于 /src/index.js
,最终打包出来的文件放置在 /lib
目录下。
几个注意点:
-
output.libraryTarget
设置发布出来的模块类型。参考文档, 如果设置成
umd
,打包出来的模块可以在各种类型的模块定义(CommonJS, AMD, 或者是没有模块的全局环境)下使用。例如:import MyLibrary from 'my-library'
var MyLibrary = require('my-library')
-
externals
默认情况下,webpack 会把入口文件用到的全部依赖项都打包进来,包括第三方的模块依赖。这一部分是可以省略掉的,因为这些第三方的依赖由用户自己管理,没有必要重复整合在一起。例如:
module.exports = { ... externals: { "lodash": { commonjs: "lodash", commonjs2: "lodash", amd: "lodash", root: "_" } } ... }
babel
配置
之前用 vue 的脚手架工具创建项目也并未过多的关注 babel
配置,没有深究哪些是有用的,分别是做什么的。实际上,babel
搭配 webpack
运行起来。以下是一些模块说明:
-
babel-core
这个模块是各种语法的管理集合。通过它可以把一段代码依照配置(preset)转换成编译后的版本。
-
babel-loader
在 webpack 里,相应的加载器是必不可少的。它告诉 webpack 当遇到特定文件时,要使用什么模块去处理文件内容。
-
babel-preset-env
这个模块相当于是
babel
语法配置的autoprefixer
, 它能根据条件输出需要的预设配置,自动设定编译时需要转换哪些语言特性。例如,如果环境已源生支持promise
了,代码中的promise
就可以免去转换了。这个模块也可以替换成别的一些预设模块或它们的组合,例如babel-preset-es2015
babel-preset-stage-0
等等。
- babel-plugin-transform-runtime
按照官方说明,babel
会在每个文件需要的时候都附加上一些通用的工具方法,这样一来会造成不必要的重复代码,尤其是文件过多的时候。
这个模块会把所有的通用工具方法集中到一个模块里,当需要调用工具方法的时候会从该模块去引入,减小体积。
- babel-preset-add-module-exports
这个模块通过在文件末尾添加一行 module.exports = exports['default']
, 使得打包出来的模块无论是通过 require
引入还是通过 import
引入,都是同样的一个对象。