使用不同语言进行配置(configuration languages)

webpack 接受以多种编程和数据语言编写的配置文件。支持的文件扩展名列表,可以在 node-interpret 包中找到。使用 node-interpret,webpack 可以处理许多不同类型的配置文件。

TypeScript

为了用 TypeScript 书写 webpack 的配置文件,必须先安装相关依赖,i.e., TypeScript and the relevant type definitions from the DefinitelyTyped project::

  1. npm install --save-dev typescript ts-node @types/node @types/webpack
  2. # and, if using webpack-dev-server
  3. npm install --save-dev @types/webpack-dev-server

之后就可以使用 TypeScript 书写 webpack 的配置文件了:

webpack.config.ts

  1. import path from 'path';
  2. import webpack from 'webpack';
  3. const config: webpack.Configuration = {
  4. mode: 'production',
  5. entry: './foo.js',
  6. output: {
  7. path: path.resolve(__dirname, 'dist'),
  8. filename: 'foo.bundle.js'
  9. }
  10. };
  11. export default config;

以上示例假定 webpack 版本 >= 2.7,或者,在 tsconfig.json 文件中,具有 esModuleInteropallowSyntheticDefaultImports 这两个新的编译器选项的较新版本 TypeScript。

注意,你还需要核对 tsconfig.json 文件。如果 tsconfig.json 中的 compilerOptions 中的 module 字段是 commonjs ,则配置是正确的,否则 webpack 将因为错误而构建失败。发生这种情况,是因为 ts-node 不支持 commonjs 以外的任何模块语法。

这个问题有两种解决方案:

  • 修改 tsconfig.json
  • 安装 tsconfig-paths

__第一个选项_是指,打开你的 tsconfig.json 文件并查找 compilerOptions。将 target 设置为 "ES5",以及将 module 设置为 "CommonJS"(或者完全移除 module 选项)。

__第二个选项_是指,安装 tsconfig-paths 包:

  1. npm install --save-dev tsconfig-paths

然后,为你的 webpack 配置,专门创建一个单独的 TypeScript 配置:

tsconfig-for-webpack-config.json

  1. {
  2. "compilerOptions": {
  3. "module": "commonjs",
  4. "target": "es5",
  5. "esModuleInterop": true
  6. }
  7. }

ts-node 可以使用 tsconfig-path 提供的环境变量来解析 tsconfig.json 文件。

然后,设置 tsconfig-path 提供的环境变量 process.env.TS_NODE_PROJECT,如下所示:

package.json

  1. {
  2. "scripts": {
  3. "build": "cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack"
  4. }
  5. }

We had been getting reports that TS_NODE_PROJECT might not work with "TS_NODE_PROJECT" unrecognized command error. Therefore running it with cross-env seems to fix the issue, for more info see this issue.

CoffeeScript

类似的,为了使用 CoffeeScript 来书写配置文件, 同样需要安装相关的依赖:

  1. npm install --save-dev coffee-script

之后就可以使用 Coffeecript 书写配置文件了:

webpack.config.coffee

  1. HtmlWebpackPlugin = require('html-webpack-plugin')
  2. webpack = require('webpack')
  3. path = require('path')
  4. config =
  5. mode: 'production'
  6. entry: './path/to/my/entry/file.js'
  7. output:
  8. path: path.resolve(__dirname, 'dist')
  9. filename: 'my-first-webpack.bundle.js'
  10. module: rules: [ {
  11. test: /\.(js|jsx)$/
  12. use: 'babel-loader'
  13. } ]
  14. plugins: [
  15. new HtmlWebpackPlugin(template: './src/index.html')
  16. ]
  17. module.exports = config

Babel and JSX

在以下的例子中,使用了 JSX(React 形式的 javascript)以及 Babel 来创建 JSON 形式的 webpack 配置文件:

感谢 Jason Miller

首先安装依赖:

  1. npm install --save-dev babel-register jsxobj babel-preset-es2015

.babelrc

  1. {
  2. "presets": [ "es2015" ]
  3. }

webpack.config.babel.js

  1. import jsxobj from 'jsxobj';
  2. // example of an imported plugin
  3. const CustomPlugin = config => ({
  4. ...config,
  5. name: 'custom-plugin'
  6. });
  7. export default (
  8. <webpack target="web" watch mode="production">
  9. <entry path="src/index.js" />
  10. <resolve>
  11. <alias {...{
  12. react: 'preact-compat',
  13. 'react-dom': 'preact-compat'
  14. }} />
  15. </resolve>
  16. <plugins>
  17. <CustomPlugin foo="bar" />
  18. </plugins>
  19. </webpack>
  20. );

如果你在其他地方也使用了 Babel 并且把模块(modules)设置为了 false,那么你要么同时维护两份单独的 .babelrc 文件,要么使用 conts jsxobj = requrie('jsxobj'); 并且使用 moduel.exports 而不是新版本的 importexport 语法。这是因为尽管 Node.js 已经支持了许多 ES6 的新特性,然而还无法支持 ES6 模块语法。


贡献人员

byzyk byzyk peterblazejewicz peterblazejewicz simon04 simon04 skipjack skipjack sokra sokra tarang9211 tarang9211 youta1119 youta1119