webapck笔记

一:安装
npm install -g webpack
npm install -g webpack-cli

二:demo
1. 构建package.json文件
    npm init -y
    在package.json中,默认./src/index.js将是程序入口
2. package.json文件增加build参数和dev参数
"scripts": {
  "dev": "webpack --mode development",
  "build": "webpack --mode production"
}
说明:--mode development对文件不进行压缩,--mode production对文件进行压缩
3. 创建./src/index.js文件

 console.log(`这是入口文件`);

4. 运行打包
npm run dev
目录下多了一个./dist/main.js,这个文件是webpack对./src/index.js的打包结果

三: ES6+React
1. cd根目录,在当前目录安装相关node modules

npm i babel-core babel-loader babel-preset-env react react-dom babel-preset-react --save-dev

执行上面的命令以后,package.json文件的devDependencies节点会增加相关的依赖项

2. 创建.babelrc配置文件
在windows添加带点的文件,方法如下:打开cmd,然后输入:echo hi > .babelrc
修改.babelrc的内容:
3. 新建webpack.config.js文件

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  }
};

4. 新增./src/app.js

import React from "react";
import ReactDOM from "react-dom";
const App = () => {
  return (
    

React here!

); }; export default App; ReactDOM.render(, document.getElementById("app"));

5. 修改./src/index.js
import App from "./App";
6. npm run dev
7. error-Error: Cannot find module '@babel/core'
npm uninstall babel-loader
npm install [email protected]

四:使用html-webpack-plugin插件对html进行打包
1. 新建./src/index.html文件




    
    webpack4 Test


    

2. 安装相关依赖

npm i html-webpack-plugin html-loader --save-dev

3. 修改webpack.config.js

const path = require('path');
const HtmlWebPackPlugin = require("html-webpack-plugin");
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: "html-loader",
            options: { minimize: true }
          }
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "./index.html"
    })
  ]
};

4. npm run dev

五:使用webpack-dev-server插件
webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.js来连接到服务器的微型运行时.
1. 为当前项目安装依赖包
npm i webpack-dev-server --save-dev
2. 修改package.json, 在scripts节点添加
"start": "webpack-dev-server --mode development --open"
3. 修改webpack.config.js文件,新增devServer

devServer: {
    contentBase: require('path').join(__dirname, "dist"),
    compress: true,
    port: 8033,
    host: "127.0.0.1",
}

4. 执行npm run start以启动webpack dev server

六:Hot Module Replacement
使用Hot-Module-Replacement,可以在webpack工程中要实现热加载(更新局部的修改)。
1. 为项目安装依赖
npm i react-hot-loader --save-dev
2. 修改.babelrc文件,新增plugins选项

{
  "presets": ["env", "react"],
  "plugins": ["react-hot-loader/babel"]
}

3. 修改webpack.config.js文件

const path = require('path');
const HtmlWebPackPlugin = require("html-webpack-plugin");
const webpack = require('webpack'); 	    // 使用Hot Module Replacement而新增
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: "html-loader",
            options: { minimize: true }
          }
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "./index.html"
    }),
    new webpack.NamedModulesPlugin(),           // 使用Hot Module Replacement而新增
    new webpack.HotModuleReplacementPlugin() 	// 使用Hot Module Replacement而新增
  ],
  devServer: {
    contentBase: path.join(__dirname, "dist"),	// 这里修改为 path
    compress: true,
    port: 8033,
    host: "127.0.0.1",
    hot: true,                                 // 使用Hot Module Replacement而新增
  }
};

4. 修改./src/app.js

import React from "react";
import ReactDOM from "react-dom";
import { hot } from 'react-hot-loader' //使用Hot Module Replacement而新增
const App = () => {
  return (
    

React here!

); }; //export default App; export default hot(module)(App); // 使用Hot Module Replacement而 ReactDOM.render(, document.getElementById("app"));

5. npm run start
6. 修改./src/app.js文件,可以看到热加载效果

七:动态加载模块
1. 动态加载普通JS模块
1) 安装babel-plugin-syntax-dynamic-import
npm i babel-plugin-syntax-dynamic-import --save-dev
2)使用格式

let filename = 'xxxx.js'; 
import('./' + filename). then(module =>{
    console(module);
}).catch(err => {
    console(err.message); 
});

//如果你知道 export的函数名
import('./' + filename). then(({fnName}) =>{
    console(fnName);
}).catch(err => {
    console(err.message); 
});

//如果你用的是export default function() 
import('./' + filename). then(module =>{
    console(module.default);
}).catch(err => {
    console(err.message); 
});

3)修改.babel文件

{
  "presets": ["env", "react"],
  "plugins": ["react-hot-loader/babel","syntax-dynamic-import"]
}

4)创建./src/myModule.js文件

export let counter = 3;
export function incCounter() {
  counter++;
}

5)修改入口人间./src/index.js简单测试一下

//console.log(`这是入口文件`);
import App from "./App";
let filename = 'myModule.js';
import('./' + filename).then(({counter, incCounter})=>{
	console.log(counter); //3
	incCounter(); 
	console.log(counter); //3
}); 

6)npm run start
webapck笔记_第1张图片

注意:import()加载的是模块的拷贝,如上图运算的结果都是3
而import则不同,它加载的是模块的引用,如下所示:

import {counter, incCounter} from './module.js';
console.log(counter); //3
incCounter();
console.log(counter); //4

2. 动态加载React模块
1).  有两个组件,一个组件是import的组件,另一个是渲染组件

// 引用组件
import Bar from './components/Bar';
// 渲染组件
class Foo extends React.Component {
  render() {
    return ;
  }
}

通过import引入Bar这个组件,这是一个同步的引入,但是我们在渲染之前是并不需要这个组件的,所以我们为何不推迟引入这个组件呢?

2). 使用react-loadable进行动态加载

import Loadable from 'react-loadable';

// 动态加载引用组件
const LoadableBar = Loadable({
  loader: () => import('./components/Bar'),
  //当时还在loadding或认为加载引用组件失败的时候,需要渲染出去的
  loading() {
    return 
Loading...
} }); // 渲染组件 class MyComponent extends React.Component { render() { return ; } }

 







 

你可能感兴趣的:(front,end,javascript,node.js)