webpack

151 阅读2分钟

~表示后面的字符是alias

@import '~@/assets/css/varibles.scss'

vue 中实现异步加载模块

前提:使用vue官方脚手架搭建(webpack)

使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体,这样打包使单页面的应用的体积比较大,浪费资源,通常的做法使用按需加载,以节约资源。

写法:

const Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo')

require.ensure

  1.语法: require.ensure(dependencies: String[], callback: function([require]), [chunkName: String])

dependencies: 依赖的模块数组 callback: 回调函数,该函数调用时会传一个require参数 chunkName: 模块名,用于构建时生成文件时命名使用   2.说明: require.ensure在需要的时候才下载依赖的模块,当参数指定的模块都下载下来了(下载下来的模块还没执行),便执行参数指定的回调函数。require.ensure会创建一个chunk,且可以指定该chunk的名称,如果这个chunk名已经存在了,则将本次依赖的模块合并到已经存在的chunk中,最后这个chunk在webpack构建的时候会单独生成一个文件。

  3.在执行cnpm run dev 后chunk会被生成一个单独的js文件,当路由被访问的时候才加载对应chunk组件,这样就更加高效了。

vue.config.js

chainWebpack: (config) => {
// 其他地方可以直接使用XE

config.plugin("provide").use(webpack.ProvidePlugin, [

{

XE: "xe-utils",

},

]);

config.plugin("define").use(webpack.DefinePlugin, [

{

VE_ENV: {

MODE: JSON.stringify(process.env.NODE_ENV),

},

},

]);

config.plugins.delete("prefetch");

// config.plugins.delete("preload");

// config.optimization.delete("splitChunks");

},


index.html中会自动注入环境变量

完整的参数

 {
  webpack: [Getter],
  
  webpackConfig: {
    mode: 'development',
    context: '/Users/cfang/genyun/projects/special-test-period-2/de2-mobile-admin',
    devtool: 'eval-cheap-module-source-map',
    node: {
      setImmediate: false,
      process: 'mock',
      dgram: 'empty',
      fs: 'empty',
      net: 'empty',
      tls: 'empty',
      child_process: 'empty',
      console: false,
      global: true,
      Buffer: true,
      __filename: 'mock',
      __dirname: 'mock'
    },
    output: {
      path: '/Users/cfang/genyun/projects/special-test-period-2/de2-mobile-admin/dist',
      filename: 'js/[name].js',
      publicPath: '/',
      chunkFilename: 'js/[name].js',
      globalObject: "(typeof self !== 'undefined' ? self : this)",
      webassemblyModuleFilename: '[modulehash].module.wasm',
      library: '',
      hotUpdateFunction: 'webpackHotUpdate',
      jsonpFunction: 'webpackJsonp',
      chunkCallbackName: 'webpackChunk',
      devtoolNamespace: '',
      libraryTarget: 'var',
      pathinfo: true,
      sourceMapFilename: '[file].map[query]',
      hotUpdateChunkFilename: '[id].[hash].hot-update.js',
      hotUpdateMainFilename: '[hash].hot-update.json',
      crossOriginLoading: false,
      jsonpScriptType: false,
      chunkLoadTimeout: 120000,
      hashFunction: 'md4',
      hashDigest: 'hex',
      hashDigestLength: 20,
      devtoolLineToLine: false,
      strictModuleExceptionHandling: false
    },
    resolve: {
      alias: [Object],
      extensions: [Array],
      modules: [Array],
      plugins: [Array],
      unsafeCache: true,
      mainFiles: [Array],
      aliasFields: [Array],
      mainFields: [Array],
      cacheWithContext: true,
      preferAbsolute: true,
      ignoreRootsErrors: true,
      roots: [Array]
    },
    resolveLoader: {
      modules: [Array],
      plugins: [Array],
      unsafeCache: true,
      mainFields: [Array],
      extensions: [Array],
      mainFiles: [Array],
      cacheWithContext: true
    },
    module: {
      noParse: /^(vue|vue-router|vuex|vuex-router-sync)$/,
      rules: [Array],
      unknownContextRequest: '.',
      unknownContextRegExp: false,
      unknownContextRecursive: true,
      unknownContextCritical: true,
      exprContextRequest: '.',
      exprContextRegExp: false,
      exprContextRecursive: true,
      exprContextCritical: true,
      wrappedContextRegExp: /.*/,
      wrappedContextRecursive: true,
      wrappedContextCritical: false,
      strictExportPresence: false,
      strictThisContextOnImports: false,
      unsafeCache: true,
      defaultRules: [Array]
    },
    optimization: {
      splitChunks: [Object],
      minimizer: [Array],
      removeAvailableModules: false,
      removeEmptyChunks: true,
      mergeDuplicateChunks: true,
      flagIncludedChunks: false,
      occurrenceOrder: false,
      sideEffects: false,
      providedExports: true,
      usedExports: false,
      concatenateModules: false,
      runtimeChunk: undefined,
      noEmitOnErrors: false,
      checkWasmTypes: false,
      mangleWasmImports: false,
      namedModules: true,
      hashedModuleIds: false,
      namedChunks: true,
      portableRecords: false,
      minimize: false,
      nodeEnv: 'development'
    },
    plugins: [
      VueLoaderPlugin {},
      [DefinePlugin],
      [DefinePlugin],
      [CaseSensitivePathsPlugin],
      [FriendlyErrorsWebpackPlugin],
      [HtmlWebpackPlugin],
      [PreloadPlugin],
      [PreloadPlugin],
      [CopyPlugin],
      [HotModuleReplacementPlugin],
      [ProgressPlugin]
    ],
    entry: { app: [Array] },
    cache: true,
    target: 'web',
    performance: false,
    infrastructureLogging: { level: 'info', debug: false }
  },
  htmlWebpackPlugin: {
    files: {
      publicPath: '/',
      chunks: [Object],
      js: [Array],
      css: [],
      manifest: undefined
    },
    options: {
      template: '/Users/cfang/genyun/projects/fake-test-period-2/de2-mobile-admin/node_modules/html-webpack-plugin/lib/loader.js!/Users/cfang/genyun/projects/fake-test-period-2/de2-mobile-admin/public/index.html',
      templateParameters: [Function: templateParameters],
      filename: 'index.html',
      hash: false,
      inject: true,
      compile: true,
      favicon: false,
      minify: false,
      cache: true,
      showErrors: true,
      chunks: 'all',
      excludeChunks: [],
      chunksSortMode: 'auto',
      meta: {},
      title: 'de2-mobile-admin',
      xhtml: false
    }
  },
  VUE_APP_NAME: 'de2-mobile-admin-dev',
  VUE_APP_ICON_HOST: 'https://fake.oss-cn-hangzhou.aliyuncs.com/',
  VUE_APP_BASE_URL: 'http://sc20-testgateway.genyun.com/fake/',
  VUE_APP_TJTESTS_API: 'http://sc20-fake.genyun.com/',
  NODE_ENV: 'development',
  BASE_URL: '/'
}