@mono_guerin
-Webpack: It's Not Magic | Naomi Jacobs | BuzzJS 2.0 2017
Apr 2015 - May 2018
https://npm-stat.com/
(function() {
var miScopedVarible = 10;
var notGlobalVar = "I am not global";
}());IIFE - Immediate Invoke Function Expression
<script src="bundle.js"></script>JS
webpack
main.js
[ entryModule, dependency1, dependency2, etc... ]JSON Loader - https://github.com/webpack-contrib/json-loader
Loader: is a function that takes in source code, makes changes, and returns the new code.
function jsonLoader (source) {
return "module.exports = " + JSON.stringify(source) + ";";
};module: {
rules: [
{
test: /\.vue$/,
loader: "vue-loader",
include: /src/
},
{
test: /\.js$/,
loader: "babel-loader",
exclude: /node_modules/
},
{
test: /\.less$/,
use: [
{
loader: "style-loader"
},
{
loader: "css-loader"
},
{
loader: "less-loader"
}
]
}
]
}module: {
rules: [
{
test: /\.vue$/,
loader: "vue-loader",
include: /src/
},
{
test: /\.js$/,
loader: "babel-loader",
exclude: /node_modules/
},
{
test: /\.less$/,
use: [
{
loader: "style-loader"
},
{
loader: "css-loader"
},
{
loader: "less-loader"
}
]
}
]
}less-loader
css-loader
style-loader
style.less
less-loader
css-loader
style-loader
*.css
less-loader
css-loader
style-loader
*.js
// double.js
module.exports = function (x) {
return x * 2;
};// double.js
function (module, webpackRequire) {
module.exports = function (x) {
return x * 2;
};
}// main.js
var doubleMethod = require("./double.js");
console.log(doubleMethod(2)); // 4// main.js
function (module, webpackRequire) {
var doubleMethod = webpackRequire(1);
console.log(doubleMethod(2)); // 4
}// A named JavaScript function.
function MyExampleWebpackPlugin() {
};
// Defines `apply` method in it's prototype.
MyExampleWebpackPlugin.prototype.apply = function(compiler) {
// Specifies webpack's event hook to attach itself.
compiler.plugin('webpacksEventHook', function(compilation, callback) {
console.log("This is an example plugin!!!");
// Invokes webpack provided callback after functionality is complete.
callback();
});
};var webpack = require('webpack')
// importing plugins that do not come by default in webpack
var ExtractTextPlugin = require('extract-text-webpack-plugin');
// adding plugins to your configuration
plugins: [
// build optimization plugins
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: 'vendor-[hash].min.js',
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
drop_console: false,
}
}),
new ExtractTextPlugin({
filename: 'build.css'
}),
// compile time plugins
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"',
})
]$ npm install --save-dev webpack
// Development
$ webpack main.js dist/bundle.js
// Production
$ webpack main.js dist/bundle.js -p
// webpack.config.js
var path = require("path");
module.exports = {
entry: "./main.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js"
}
};// webpack.config.js
var path = require("path");
module.exports = {
entry: "./main.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js"
},
module: {
rules: [{
test: /\.js$/,
use: ["babel-loader"],
exclude: /node_modules/
}]
}
};$ webpack$ npm install eslint-loader eslint --save-dev
// .eslintrc
{
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"rules": {
"semi": 2
}
}module.exports = {
// ...
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: [
"babel-loader",
"eslint-loader"
],
},
],
},
// ...
}module.exports = {
// ...
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: [
{
loader:"babel-loader"
},
{
loader: "eslint-loader",
options: {
failOnWarning: true,
}
}
],
},
],
},
// ...
}$ npm install webpack-dev-server --save-dev
devServer: {
contentBase: path.join(__dirname, "dist"),
port: 9000
}$ webpack-dev-serverHMR updates modules while an application is running, without a full reload.
Benefits:
const webpack = require('webpack');
module.exports = {
// ...
plugins: [
new webpack.HotModuleReplacementPlugin() // Enable HMR
],
devServer: {
contentBase: path.resolve(__dirname, 'dist'),
port: 9000,
hot: true // Tell the dev-server we're using HMR
}
// ...
};import { get } from 'lodash';Special Thanks to the Z-team:
https://tinyurl.com/bogota-webpack