【问题标题】:Optimal webpack.config with webpack 2 for AngularJS 1.x app?AngularJS 1.x 应用程序的最佳 webpack.config 和 webpack 2?
【发布时间】:2017-09-21 07:14:09
【问题描述】:

我想使用 webpack 2 从头开始​​设置一个 Angular 1.x 应用程序。

我在为webpack.config 找到最佳配置时遇到了麻烦,而在生产环境中使用最佳entryoutput(意思是,所有代码、样式和模板都已缩小和压缩,没有代码重复)。

我的主要问题是如何设置 webpack.config 以便它识别我项目文件夹结构中的所有部分,如下所示:

我当前的配置文件,供参考(看不到子文件夹):

var HtmlWebpackPlugin = require( 'html-webpack-plugin' );
var ExtractTextPlugin = require( 'extract-text-webpack-plugin' );
var path = require( 'path' );

module.exports = {
    devServer: {
        compress: true,
        contentBase: path.join( __dirname, '/dist' ),
        open: true,
        port: 9000,
        stats: 'errors-only'
    },
    entry: './src/app.js',
    output: {
        path: path.join( __dirname, '/dist' ),
        filename: 'app.bundle.js'
    },
    module: {
        rules: [ {
            test: /\.scss$/,
            use: ExtractTextPlugin.extract( {
                fallback: 'style-loader',
                use: [
                    'css-loader',
                    'sass-loader'
                ],
                publicPath: '/dist'
            } )
        } ]
    },
    plugins: [
        new HtmlWebpackPlugin( {
            hash: true,
            minify: { collapseWhitespace: true },
            template: './src/index.html',
            title: 'Prov'
        } ),
        new ExtractTextPlugin( {
            filename: 'main.css',
            allChunks: true
        } )
    ]
};

【问题讨论】:

  • 所以你有 app.js 你想将你的部分导入 app.js 还是编译 proverb-list.js 作为一个单独的指令/控制器?
  • 如果我对您的问题的理解正确(即通过 webpack 编译部分),您有两个选择,1. 将您的部分(通过 glob 或每个文件)推送到条目中,或者 2. 导入他们进入 app.js 和 commonChuck。 -
  • 是的,我认为您理解正确,选项 2 是否意味着我应该使用 require 将我所有的 js 文件导入到 app.js,并将所有 html 模板导入到指令本身也使用 require?跨度>
  • 你可以这样做——你需要html-loader作为模板。如果您想将指令拆分为单独的包(而不是 app.bundle.js),您可以使用 CommonChunksPlugin 或将这些文件附加到您的 entry
  • 我无法理解哪个webpack.config 设置将是最佳路线,以及在开发过程中我必须注意哪些实践以保证代码可以在生产中工作(即我是否需要app.js 或单独的 index.js 文件中的所有内容?我是否应该基于每个组件或其他方式要求我的模板和样式?)

标签: javascript angularjs webpack webpack-dev-server webpack-2


【解决方案1】:

请注意,这不是一个详尽的解决方案,因为可以在前端进行许多优化,而且我的代码 sn-ps 相当短。

使用 webpack,您可以采取一些途径将部分内容包含到您的 app.js 中。

解决方案 1
您可以像这样在app.js 中导入/要求您的部分:

app.js

var angular = require('angular');
var proverbList = require('./proverb/list/proverb.list');
// require other components

// set up your app as normal

这允许app.bundle.js 将您的组件js 文件包含在主包中。您还可以使用 html-loader 在最终包中包含模板。

这并不理想,因为它所做的只是创建一个大的bundle.js(它不会利用http2 进行多次下载,也不允许在用户明确要求时加载组件/文件)。

解决方案 2
将部分作为单独的入口文件导入到你的 webpack 包中:

webpack.config.js

const globby = require('globby');
const sourceDir = 'src';
var webpackentry = {
    app: `${__dirname}/src/app.js`
};

const glob = globby.sync(`${__dirname}/${sourceDir}/**/*.js`)
    .map((file)=>{
    let name = file.split('/').pop().replace('.js', '');
    webpackentry[name] = file;
});


const config = {
  entry: webpackentry,
  ...
}

第二种解决方案是非正统的,但如果您想在 html 中将所有部分拆分为 <script> 标记(例如,如果您的公司/团队使用它作为包含指令/组件/控制器的一种方式) ),或者如果您有 app-2.bundle.js

解决方案 3
使用CommonsChunkPlugin:

webpack.config.js

let webpackentry = {
  vendor: [
   'module1',
   'module2',
   'module3',
  ]
}
...
plugins: [
  new webpack.optimize.CommonsChunkPlugin({
    name: ['vendor'] //... add other modules
  })
]

CommonsChunkPlugin 允许 webpack 浏览你的入口文件并识别它们之间共享的公共模块。这意味着即使您在不同的文件中导入module1,它们也只会在您的最终包中编译一次。

【讨论】:

  • 我不确定我是否理解 manifest 文件中应该包含的内容,即使在阅读了官方文档之后,其中指出:“我们需要将运行时提取到单独的清单文件中”。该文件中到底有什么内容,它与常规的 entry.jsapp.js 有何不同?
  • 引用来自survival.js When webpack writes bundles, it maintains a manifest as well. The manifest describes what files webpack should load. It's possible to extract it and start loading the files of the project faster instead of having to wait for the vendor bundle to be loaded.
  • btw - @Tiago 这对你有用吗? - (如满意请确认答案)
  • 还在解决中,我会尽快确认。
  • @Tiago 运气好吗?
猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2018-10-24
  • 2016-07-14
  • 2014-04-11
  • 2017-10-26
相关资源
最近更新 更多