webpack是一個module bundler,能夠將把有依賴關係的各類文件打包成一系列的靜態資源javascript
首先咱們安裝最新版的webpack, 我安裝的版本是2.2.1css
npm install -g webpack
下面咱們將探討webpack 2 的使用html
咱們能夠直接在終端中使用webpack,命令以下java
webpack {源文件/入口文件} {目標文件} webpack --watch //監聽模式 webpack -p //混淆腳本
考慮到隨着咱們項目複雜度的增高,有可能咱們的配置選項也會不少,因此,咱們徹底能夠將配置放到文件中, webpack在執行的時候默認會加載webpack.config.js文件做爲配置, 若是咱們須要指定配置文件的話,方法以下:node
webpack --config {配置文件}
咱們來看下webpack都有哪些配置:react
//webpack.config.js const path = require('path'); module.exports = { // click on the name of the option to get to the detailed documentation // click on the items with arrows to show more examples / advanced options entry: "./app/entry", // string | object | array // Here the application starts executing // and webpack starts bundling output: { // options related to how webpack emits results path: path.resolve(__dirname, "dist"), // string // the target directory for all output files // must be an absolute path (use the Node.js path module) filename: "bundle.js", // string // the filename template for entry chunks publicPath: "/assets/", // string // the url to the output directory resolved relative to the HTML page library: "MyLibrary", // string, // the name of the exported library libraryTarget: "umd", // universal module definition // the type of the exported library /* Advanced output configuration (click to show) */ }, module: { // configuration regarding modules rules: [ // rules for modules (configure loaders, parser options, etc.) { test: /\.jsx?$/, include: [ path.resolve(__dirname, "app") ], exclude: [ path.resolve(__dirname, "app/demo-files") ], // these are matching conditions, each accepting a regular expression or string // test and include have the same behavior, both must be matched // exclude must not be matched (takes preferrence over test and include) // Best practices: // - Use RegExp only in test and for filename matching // - Use arrays of absolute paths in include and exclude // - Try to avoid exclude and prefer include issuer: { test, include, exclude }, // conditions for the issuer (the origin of the import) enforce: "pre", enforce: "post", // flags to apply these rules, even if they are overridden (advanced option) loader: "babel-loader", // the loader which should be applied, it'll be resolved relative to the context // -loader suffix is no longer optional in webpack2 for clarity reasons // see webpack 1 upgrade guide options: { presets: ["es2015"] }, // options for the loader }, { test: "\.html$", use: [ // apply multiple loaders and options "htmllint-loader", { loader: "html-loader", options: { /* ... */ } } ] }, { oneOf: [ /* rules */ ] }, // only use one of these nested rules { rules: [ /* rules */ ] }, // use all of these nested rules (combine with conditions to be useful) { resource: { and: [ /* conditions */ ] } }, // matches only if all conditions are matched { resource: { or: [ /* conditions */ ] } }, { resource: [ /* conditions */ ] } // matches if any condition is matched (default for arrays) { resource: { not: /* condition */ } } // matches if the condition is not matched ], /* Advanced module configuration (click to show) */ }, resolve: { // options for resolving module requests // (does not apply to resolving to loaders) modules: [ "node_modules", path.resolve(__dirname, "app") ], // directories where to look for modules extensions: [".js", ".json", ".jsx", ".css"], // extensions that are used alias: { // a list of module name aliases "module": "new-module", // alias "module" -> "new-module" and "module/path/file" -> "new-module/path/file" "only-module$": "new-module", // alias "only-module" -> "new-module", but not "module/path/file" -> "new-module/path/file" "module": path.resolve(__dirname, "app/third/module.js"), // alias "module" -> "./app/third/module.js" and "module/file" results in error // modules aliases are imported relative to the current context }, /* alternative alias syntax (click to show) */ /* Advanced resolve configuration (click to show) */ }, performance: { hints: "warning", // enum maxAssetSize: 200000, // int (in bytes), maxEntrypointSize: 400000, // int (in bytes) assetFilter: function(assetFilename) { // Function predicate that provides asset filenames return assetFilename.endsWith('.css') || assetFilename.endsWith('.js'); } }, devtool: "source-map", // enum // enhance debugging by adding meta info for the browser devtools // source-map most detailed at the expense of build speed. context: __dirname, // string (absolute path!) // the home directory for webpack // the entry and module.rules.loader option // is resolved relative to this directory target: "web", // enum // the environment in which the bundle should run // changes chunk loading behavior and available modules externals: ["react", /^@angular\//], // Don't follow/bundle these modules, but request them at runtime from the environment stats: "errors-only", // lets you precisely control what bundle information gets displayed devServer: { proxy: { // proxy URLs to backend development server '/api': 'http://localhost:3000' }, contentBase: path.join(__dirname, 'public'), // boolean | string | array, static file location compress: true, // enable gzip compression historyApiFallback: true, // true for index.html upon 404, object for multiple paths hot: true, // hot module replacement. Depends on HotModuleReplacementPlugin https: false, // true for self-signed, object for cert authority noInfo: true, // only errors & warns on hot reload // ... }, plugins: [ // ... ], // list of additional plugins /* Advanced configuration (click to show) */ }
下面咱們來建立一個簡單的項目
咱們的項目結構以下webpack
. ├── dist ├── src │ └── entry.js ├── index.html └── webpack.config.js
index.htmlweb
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <script src="./dist/bundle.js"></script> </body> </html>
src/entry.jsexpress
document.write('hello world')
webpack.config.jsnpm
const path = require('path') module.exports = { entry: './src/entry.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' } }
在終端下運行命令:
webpack --watch
使用http-server起一個本地服務
http-server -p 8080
能夠看到,entry.js的內容被打包到了bundle.js 中
這是webpack最簡單的應用,下面咱們來看看如何使用loader
webpack2中已經集成了json-loader, 因此咱們無需安裝其餘的依賴
在src中增長hello.json文件
{"greet" : "hello from json"}
修改entry.js
import json from './hello.json' document.write(json.greet)
刷新http://127.0.0.1:8080/
能夠看到hello.json的結果已經輸出到瀏覽器中
若是其餘格式的文件,好比css文件咱們能夠使用相應的loader來解析,安裝依賴
npm install --save-dev style-loader css-loader
修改webpack.config.js
const path = require('path') module.exports = { entry: './src/entry.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, module: { rules: [{ test: /\.css$/, use: ["style-loader", "css-loader"] }] } }
entry.js
import './main.css' import json from './hello.json' document.write(json.greet)
能夠看到,main.css也通過loader的解析而打包進bundle.js裏面了