Webpack

147 阅读1分钟

Webpack loader 和 Webpack plugin 区别

loader,加载器,用来load一个文件,比如babel loader 用来加载高级的JS变成IE支持的JS,css loader和style loader 用来加载css,把它变成页面中的style 标签
plugin,插件,用来加强功能,plugin功能比较丰富,loader比较单一,例如HTML webpack plugin 用来生成HTML文件,mincss exact plugin 用来抽取css代码变成一个文件

怎么实现懒加载

用 import 括号加载文件,得到一个promise,promise的then前面写成功之后做什么,后面写失败之后做什么

配置多页应用

这是对应的 webpack config:

const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
   entry: {
     app: './src/app.js',
     admin: './src/admin.js',
  },
   plugins: [
     new HtmlWebpackPlugin({
       filename: 'index.html',
       chunks: ['app']
  }),
   new HtmlWebpackPlugin({
     filename: 'admin.html',
     chunks: ['admin']
       })
   ],
};

如何支持无限多页面呢?

const HtmlWebpackPlugin = require('html-webpack-plugin');
const fs = require('fs')
const path = require('path')
const filenames = fs.readdirSync('./src/pages')
   .filter(file => file.endsWith('.js'))
   .map(file => path.basename(file, '.js'))
const entries = filenames.reduce((result, name) => (
   { ...result, [name]: `./src/pages/${name}.js` }
), {})
const plugins = filenames.map((name) =>
new HtmlWebpackPlugin({
   filename: name + '.html',
   chunks: [name]
  })
)
module.exports = {
  entry: {
   ...entries
  },
  plugins: [
   ...plugins
  ],
};

解决开发时的跨域问题

在开发时,我们的页面在 localhost:8080 ,JS 直接访问后端接口(如 juejin.cnhttp://localhost:3000 )会报跨域错误。 为了解决这个问题,可以在 webpack.config.js 中添加如下配置

module.exports = {
 //...
  devServer: {
    proxy: {
   '/api': {
     target: 'https://juejin.cn',
     changeOrigin: true,
         },
       },
   },
};

此时,在 JS 中请求 /api/users 就会自动被代理到 juejin.cn/api/users
如果希望请求中的 Origin 从 8080 修改为 juejin.cn,可以添加 changeOrigin: true 。 如果要访问的是 HTTPS API,那么就需要配置 HTTPS 证书,否则会报错。 不过,如果在 target 下面添加 secure: false ,就可以不配置证书且忽略 HTTPS 报错。