webpack之entry/output

679 阅读3分钟

生成package.json文件

npm init

安装并下载webpack

npm install --save-dev webapck

webpack配置

enry

entry: 入口文件

最简单的webpack.config.js文件:

module.exports = {
    entry: './app.js',
    output: {
        path: './dist',
        filename: 'app.bundle.js'
    }
}

webpack会在执行目录下创建dist目录,将app.js文件打包为app.bundle.js文件放在dist目录里

entry支持多种配置方式

单一条目(速记)语法

用法: entry: string|Array<string>

webpack.config.js

module.exports = {
  entry: './path/to/my/entry/file.js'
};

该entry属性的单一条目语法是以下的简写:

webpack.config.js

module.exports = {
  entry: {
    main: './path/to/my/entry/file.js'
  }
};

对象语法

用法: entry: {[entryChunkName: string]: string|Array<string>}

webpack.config.js

module.exports = {
  entry: {
    app: './src/app.js',
    adminApp: './src/adminApp.js'
  },
  output: {
      filename: '_[name].js'
  }
};

对象语法更详细。但是,这是在应用程序中定义条目/条目的最具扩展性的方法。

如果entry配置时使用对象的形式, output中[name]就相当于一个占位符,会读取对象中的key值,打包后输出的文件名为_app.js_adminApp.js。如果是以字符串配置,就只能以默认的名字命名_mian.js

多页面应用程序

webpack.config.js

module.exports = {
  entry: {
    pageOne: './src/pageOne/index.js',
    pageTwo: './src/pageTwo/index.js',
    pageThree: './src/pageThree/index.js'
  }
};

这是做什么的?我们告诉webpack我们想要3个独立的依赖图(如上例所示)。

output

output: 输出文件

webpack.config.js

module.exports = {
  entry:base,
  output: {
    //导出目录
  	path: path.resolve(__dirname, 'uuudist'),
    publicPath: "/output/uuudist/", // server-relative
  	//包规范格式
  	libraryTarget:'umd',
  	library: "MyLibrary", 
    //文件名
  	//chunkFilename:'[chunkhash]_[name].js',
    //hash位数
  	hashDigestLength:3,
    //导出文件 
    filename: '[name]_[chunkhash].js'
  }
};

打包后的文件目录

path 导出路径(最好是绝对路径)

如果不希望这里涉及到的路径和执行webpack命令时的具体路径相关,而是希望相对于配置文件的路径的话,就需要使用path模块:

webpack.config.js

var path = require('path')
module.exports = {
    entry: path.resolve(__dirname, './app.js'),
    output: {
        path: path.resolve(__dirname, './output'),
        filename: 'output-file.js'
    }
}

filename:文件导出名

[chunkhash]:

chunkhash和hash不一样,它根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值。我们在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响。

hash ==> webpack的编译过程

chunkhash ==> webpack对每个文件的hash

hashDigestLength:3
filename: '[chunkhash]_[name].js''

等同于:

filename: '[chunkhash:3]_[name].js'

得到的结果:

使用hash值标识文件有什么用呢? 相当于时间戳,做文件的缓存标识

chunkFilename

chunkFilename一般是用来做异步加载,可以和publicPath配合

//文件名
chunkFilename:'[chunkhash:3]_[name].js',
// [name] 关联下面require.ensure的第三个参数

index.js

//require.ensure(dependencies: String[], callback: function(require), chunkName: String)
// require.ensure三个参数:
依赖,function,name
//异步加载
require.ensure([],(require)=>{
	require('./index1.js')
},'dynamic')

异步操作打包后的文件名

异步加载需要手动指定publicPath,异步加载文件的前缀 publicPath参数和服务器强关联, 所以上线时会写成cdn形式

library

//定义包的名字
library: "MyLibrary",

如果定义包的名字是MyLibrary,会把模块的结果赋值给MyLibrary

如果只指定library,别人引用的时候只用引用MyLibrary就可以了

//包规范格式
libraryTarget:'umd',
//定义包的名字
library: "MyLibrary",

umd: Universal Module Definition,称之为 通用模块规范

浏览器和node端都兼容 如果把umd改为commonjs

兼容commonjs

把umd改为amd

兼容amd

所以一般情况下,使用umd