Webpack 入口和上下文

入口对象是用于 webpack 查找开始构建 bundle 的地方。上下文是入口文件所处的目录的绝对路径的字符串。

context

string

基础目录,绝对路径,用于从配置中解析入口点(entry point)和 加载器(loader)。

const path = require(path);

module.exports = {
  //...
  context: path.resolve(__dirname, app),
};

默认使用 Node.js 进程的当前工作目录,但是推荐在配置中传入一个值。这使得你的配置独立于 CWD(current working directory, 当前工作目录)。


entry

string​ ​[string]​ ​object = { <key> string | [string] | object = { import string | [string], dependOn string | [string], filename string, layer string }} (function() => string | [string] | object = { <key> string | [string] } | object = { import string | [string], dependOn string | [string], filename string })

开始应用程序打包过程的一个或多个起点。如果传入数组,则会处理所有条目。

动态加载的模块 不是 入口起点。

一个需要考虑的规则:每个 HTML 页面都有一个入口起点。单页应用(SPA):一个入口起点,多页应用(MPA):多个入口起点。

module.exports = {
  //...
  entry: {
    home: ./home.js,
    about: ./about.js,
    contact: ./contact.js,
  },
};

Naming

如果传入一个字符串或字符串数组,chunk 会被命名为 ​main​。如果传入一个对象,则每个属性的键(key)会是 chunk 的名称,该属性的值描述了 chunk 的入口点。

Entry descriptor

如果传入一个对象,对象的属性的值可以是一个字符串、字符串数组或者一个描述符(descriptor):

module.exports = {
  //...
  entry: {
    home: ./home.js,
    shared: [react, react-dom, redux, react-redux],
    catalog: {
      import: ./catalog.js,
      filename: pages/catalog.js,
      dependOn: shared,
      chunkLoading: false, // Disable chunks that are loaded on demand and put everything in the main chunk.
    },
    personal: {
      import: ./personal.js,
      filename: pages/personal.js,
      dependOn: shared,
      chunkLoading: jsonp,
      asyncChunks: true, // Create async chunks that are loaded on demand.
      layer: name of layer, // set the layer for an entry point
    },
  },
};

描述符语法可以用来传入额外的选项给入口。

Output filename

默认情况下,入口 chunk 的输出文件名是从 ​output.filename​ 中提取出来的,但你可以为特定的入口指定一个自定义的输出文件名。

module.exports = {
  //...
  entry: {
    app: ./app.js,
    home: { import: ./contact.js, filename: pages/[name][ext] },
    about: { import: ./about.js, filename: pages/[name][ext] },
  },
};

描述符语法在这里被用来将 ​filename​—选项传递给指定的入口点。

Dependencies

默认情况下,每个入口 chunk 保存了全部其用的模块(modules)。使用 ​dependOn​ 选项你可以与另一个入口 chunk 共享模块:

module.exports = {
  //...
  entry: {
    app: { import: ./app.js, dependOn: react-vendors },
    react-vendors: [react, react-dom, prop-types],
  },
};

app​ 这个 chunk 就不会包含 ​react-vendors​ 拥有的模块了.

dependOn​ 选项的也可以为字符串数组:

module.exports = {
  //...
  entry: {
    moment: { import: moment-mini, runtime: runtime },
    reactvendors: { import: [react, react-dom], runtime: runtime },
    testapp: {
      import: ./wwwroot/component/TestApp.tsx,
      dependOn: [reactvendors, moment],
    },
  },
};

此外,你还可以使用数组为每个入口指定多个文件:

module.exports = {
  //...
  entry: {
    app: { import: [./app.js, ./app2.js], dependOn: react-vendors },
    react-vendors: [react, react-dom, prop-types],
  },
};

Dynamic entry

如果传入一个函数,那么它将会在每次 make 事件中被调用。

要注意的是,make 事件在 webpack 启动和每当 监听文件变化 时都会触发。

module.exports = {
  //...
  entry: () => ./demo,
};

或者

module.exports = {
  //...
  entry: () => new Promise((resolve) => resolve([./demo, ./demo2])),
};

例如,你可以使用动态入口来从外部来源(远程服务器,文件系统内容或者数据库)获取真正的入口:

webpack.config.js

module.exports = {
  entry() {
    return fetchPathsFromSomeExternalSource(); // 返回一个会被用像 [src/main-layout.js, src/admin-layout.js] 的东西 resolve 的 promise
  },
};

当和 ​output.library​ 选项结合:如果传入的是一个数组,只有数组的最后一个条目会被导出。

作者:唐伯虎点蚊香,如若转载,请注明出处:https://www.web176.com/webpack/22673.html

(0)
打赏 支付宝 支付宝 微信 微信
唐伯虎点蚊香的头像唐伯虎点蚊香
上一篇 2023年5月26日
下一篇 2023年5月26日

相关推荐

发表回复

登录后才能评论